@cushin/api-codegen 1.0.9 → 1.1.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 +9 -3
- package/dist/cli.js.map +1 -1
- package/dist/index.js +9 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -720,9 +720,12 @@ var QueryKeysGenerator = class extends BaseGenerator {
|
|
|
720
720
|
await fs5.writeFile(outputPath, content, "utf-8");
|
|
721
721
|
}
|
|
722
722
|
generateContent() {
|
|
723
|
+
const outputPath = path6.join(this.context.config.outputDir, "types.ts");
|
|
724
|
+
const endpointsPath = path6.join(this.context.config.endpointsPath);
|
|
725
|
+
const relativePath = path6.relative(path6.dirname(outputPath), endpointsPath).replace(/\\/g, "/");
|
|
723
726
|
const content = `// Auto-generated query keys
|
|
724
727
|
import { z } from 'zod';
|
|
725
|
-
import { apiConfig } from '
|
|
728
|
+
import { apiConfig } from '${relativePath}';
|
|
726
729
|
|
|
727
730
|
export const queryKeys = {
|
|
728
731
|
${this.generateQueryKeysContent()}
|
|
@@ -780,12 +783,15 @@ var QueryOptionsGenerator = class extends BaseGenerator {
|
|
|
780
783
|
await fs5.writeFile(outputPath, content, "utf-8");
|
|
781
784
|
}
|
|
782
785
|
generateContent() {
|
|
786
|
+
const outputPath = path6.join(this.context.config.outputDir, "types.ts");
|
|
787
|
+
const endpointsPath = path6.join(this.context.config.endpointsPath);
|
|
788
|
+
const relativePath = path6.relative(path6.dirname(outputPath), endpointsPath).replace(/\\/g, "/");
|
|
783
789
|
const content = `// Auto-generated query options
|
|
784
790
|
import { queryOptions } from '@tanstack/react-query';
|
|
785
|
-
import { apiClient } from './
|
|
791
|
+
import { apiClient } from './client';
|
|
786
792
|
import { queryKeys } from './query-keys';
|
|
787
793
|
import { z } from 'zod';
|
|
788
|
-
import { apiConfig } from '
|
|
794
|
+
import { apiConfig } from '${relativePath}';
|
|
789
795
|
|
|
790
796
|
${this.generateQueryOptionsContent()}
|
|
791
797
|
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config/index.ts","../src/generators/base.ts","../src/generators/hooks.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/index.ts","../src/core/codegen.ts","../src/cli.ts"],"names":["path","fs","exports"],"mappings":"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","file":"cli.js","sourcesContent":["import { cosmiconfig } from \"cosmiconfig\";\nimport path from \"path\";\nimport type { APIConfig } from \"./schema.js\";\n\nexport interface UserConfig {\n /**\n * Base URL for API requests\n */\n baseUrl?: 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 type { APIConfig, APIEndpoint } from \"../config/schema.js\";\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 ? `ExtractParams<APIEndpoints['${name}']>` : \"never\",\n queryType: hasQuery ? `ExtractQuery<APIEndpoints['${name}']>` : \"never\",\n bodyType: hasBody ? `ExtractBody<APIEndpoints['${name}']>` : \"never\",\n responseType: `ExtractResponse<APIEndpoints['${name}']>`,\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","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"../config/schema.js\";\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 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\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 { z } from \"zod\";\nimport { apiConfig } from \"${relativePath}\";\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 const inferParams = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.params`,\n );\n const inferQuery = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.query`,\n );\n const inferResponse = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.response`,\n );\n\n const params: string[] = [];\n const optionParams: string[] = [];\n\n const queryTags = this.getQueryTags(endpoint);\n\n if (endpoint.params) {\n params.push(`params: ${inferParams}`);\n optionParams.push(\"params\");\n }\n if (endpoint.query) {\n params.push(`filters?: ${inferQuery}`);\n optionParams.push(\"filters\");\n }\n\n params.push(`options?: {\n enabled?: boolean;\n select?: <TData = ${inferResponse}>(data: ${inferResponse}) => 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 const inferParams = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.params`,\n );\n const inferBody = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.body`,\n );\n const inferResponse = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.response`,\n );\n\n const resourceHasQueries = this.resourceHasQueryEndpoints(resource);\n\n let inputType: string;\n let fnBody: string;\n\n if (endpoint.params && endpoint.body) {\n inputType = `{ params: ${inferParams}; body: ${inferBody}; }`;\n fnBody = `({ params, body }: ${inputType}) => apiClient.${name}(params, body)`;\n } else if (endpoint.params) {\n inputType = `${inferParams}`;\n fnBody = `(params: ${inputType}) => apiClient.${name}(params)`;\n } else if (endpoint.body) {\n inputType = `${inferBody}`;\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 */\n export function ${hookName}(options?: {\n onSuccess?: (data: ${inferResponse}, variables: ${inputType}, context: unknown) => void;\n onError?: (error: Error, variables: ${inputType}, context: unknown) => void;\n onSettled?: (data: ${inferResponse} | 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\tmutationFn: ${fnBody},\n\tonSuccess: (data, variables, context) => {\n\t ${invalidate}\n\t options?.onSuccess?.(data, variables, context);\n\t},\n\tonError: options?.onError,\n\tonSettled: options?.onSettled,\n\tonMutate: options?.onMutate,\n });\n }`;\n }\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport { BaseGenerator } from './base.js';\nimport type { APIEndpoint } from '../config/schema';\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 { \n APIEndpoints, \n ExtractBody, \n ExtractParams, \n ExtractResponse \n} 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(([name, endpoint]) => {\n if (this.isMutationEndpoint(endpoint)) {\n actions.push(this.generateServerAction(name, endpoint));\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 signature = this.getEndpointSignature(name, endpoint);\n const invalidationTags = this.getInvalidationTags(endpoint);\n\n let inputType = '';\n let inputParam = '';\n if (signature.hasParams && signature.hasBody) {\n inputType = `input: { params: ${signature.paramType}; body: ${signature.bodyType} }`;\n inputParam = 'input';\n } else if (signature.hasParams) {\n inputType = `params: ${signature.paramType}`;\n inputParam = 'params';\n } else if (signature.hasBody) {\n inputType = `body: ${signature.bodyType}`;\n inputParam = 'body';\n }\n\n const revalidateStatements = invalidationTags.length > 0\n ? invalidationTags\n .map((tag) => ` revalidateTag('${tag}');`)\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<${signature.responseType}>> {\n try {\n const result = await serverClient.${name}(${inputParam ? inputParam : ''});\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 \"../config/schema.js\";\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 { \n APIEndpoints, \n ExtractParams, \n ExtractQuery, \n ExtractResponse \n} 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 signature = this.getEndpointSignature(name, endpoint);\n const queryTags = this.getQueryTags(endpoint);\n\n const paramDef = signature.hasParams\n ? `params: ${signature.paramType}`\n : \"\";\n const queryDef = signature.hasQuery ? `query?: ${signature.queryType}` : \"\";\n const paramsList = [paramDef, queryDef].filter(Boolean).join(\",\\n \");\n\n const clientCallArgs: string[] = [];\n if (signature.hasParams) clientCallArgs.push(\"params\");\n if (signature.hasQuery) clientCallArgs.push(\"query\");\n\n // Generate cache key based on params\n const cacheKeyParts: string[] = [`'${name}'`];\n if (signature.hasParams) cacheKeyParts.push(\"JSON.stringify(params)\");\n if (signature.hasQuery) cacheKeyParts.push(\"JSON.stringify(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<${signature.responseType}> => {\n return unstable_cache(\n async () => serverClient.${name}(${clientCallArgs.join(\", \")}),\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 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-codegen/schema';\n\n/**\n * Type helper to extract params schema from an endpoint\n */\nexport type ExtractParams<T> = T extends { params: infer P extends z.ZodType }\n ? z.infer<P>\n : never;\n\n/**\n * Type helper to extract query schema from an endpoint\n */\nexport type ExtractQuery<T> = T extends { query: infer Q extends z.ZodType }\n ? z.infer<Q>\n : never;\n\n/**\n * Type helper to extract body schema from an endpoint\n */\nexport type ExtractBody<T> = T extends { body: infer B extends z.ZodType }\n ? z.infer<B>\n : never;\n\n/**\n * Type helper to extract response schema from an endpoint\n */\nexport type ExtractResponse<T> = T extends { response: infer R extends z.ZodType }\n ? z.infer<R>\n : never;\n\n/**\n * Import your API config to get typed endpoints\n * \n */\nexport type APIEndpoints = typeof apiConfig.endpoints;\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 if (endpoint.response)\n types.push(\n `export type ${cap}Response = ${this.inferNonNull(`typeof apiConfig.endpoints.${name}.response`)};`,\n );\n if (endpoint.body)\n types.push(\n `export type ${cap}Input = ${this.inferNonNull(`typeof apiConfig.endpoints.${name}.body`)};`,\n );\n if (endpoint.query)\n types.push(\n `export type ${cap}Query = ${this.inferNonNull(`typeof apiConfig.endpoints.${name}.query`)};`,\n );\n if (endpoint.params)\n types.push(\n `export type ${cap}Params = ${this.inferNonNull(`typeof apiConfig.endpoints.${name}.params`)};`,\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\n return `${useClientDirective ? \"'use client';\\n\" : \"\"}\nimport { createAPIClient } from '@cushin/api-codegen/client';\nimport type { AuthCallbacks } from '@cushin/api-codegen/client';\nimport { apiConfig } from '${relativePath}';\nimport { z } from 'zod';\n\n// Type the methods based on endpoints\ntype APIClientMethods = {\n [K in keyof typeof apiConfig.endpoints]: (typeof apiConfig.endpoints)[K] extends {\n method: infer M;\n params?: infer P;\n query?: infer Q;\n body?: infer B;\n response: infer R;\n }\n ? M extends \"GET\"\n ? P extends z.ZodJSONSchema\n ? Q extends z.ZodJSONSchema\n ? (params: z.infer<P>, query?: z.infer<Q>) => Promise<z.infer<R>>\n : (params: z.infer<P>) => Promise<z.infer<R>>\n : Q extends z.ZodJSONSchema\n ? (query?: z.infer<Q>) => Promise<z.infer<R>>\n : () => Promise<z.infer<R>>\n : P extends z.ZodJSONSchema\n ? B extends z.ZodJSONSchema\n ? (params: z.infer<P>, body: z.infer<B>) => Promise<z.infer<R>>\n : (params: z.infer<P>) => Promise<z.infer<R>>\n : B extends z.ZodJSONSchema\n ? (body: z.infer<B>) => Promise<z.infer<R>>\n : () => Promise<z.infer<R>>\n : never;\n};\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 return `import { createAPIClient } from '@cushin/api-codegen/client';\nimport { apiConfig } from '../config/endpoints';\nimport type { APIEndpoints } from './types';\n\n// Type-safe API client methods for server-side\ntype APIClientMethods = {\n [K in keyof APIEndpoints]: APIEndpoints[K] extends {\n method: infer M;\n params?: infer P;\n query?: infer Q;\n body?: infer B;\n response: infer R;\n }\n ? M extends 'GET'\n ? P extends { _type: any }\n ? Q extends { _type: any }\n ? (params: P['_type'], query?: Q['_type']) => Promise<R['_type']>\n : (params: P['_type']) => Promise<R['_type']>\n : Q extends { _type: any }\n ? (query?: Q['_type']) => Promise<R['_type']>\n : () => Promise<R['_type']>\n : P extends { _type: any }\n ? B extends { _type: any }\n ? (params: P['_type'], body: B['_type']) => Promise<R['_type']>\n : (params: P['_type']) => Promise<R['_type']>\n : B extends { _type: any }\n ? (body: B['_type']) => Promise<R['_type']>\n : () => Promise<R['_type']>\n : never;\n};\n\n/**\n * Server-side API client (no auth, direct API calls)\n * Use this in Server Components, Server Actions, and Route Handlers\n */\nexport const serverClient = createAPIClient(apiConfig) as APIClientMethods;\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 inferParams = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.params`,\n );\n const inferQuery = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.query`,\n );\n const inferBody = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.body`,\n );\n const inferResponse = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.response`,\n );\n\n if (endpoint.method === \"GET\") {\n if (endpoint.params && endpoint.query) {\n methods.push(` ${name}: (params: ${inferParams}, query?: ${inferQuery}): Promise<${inferResponse}> => \n (baseClient as any).${name}(params, query),`);\n } else if (endpoint.params) {\n methods.push(` ${name}: (params: ${inferParams}): Promise<${inferResponse}> => \n (baseClient as any).${name}(params),`);\n } else if (endpoint.query) {\n methods.push(` ${name}: (query?: ${inferQuery}): Promise<${inferResponse}> => \n (baseClient as any).${name}(query),`);\n } else {\n methods.push(` ${name}: (): Promise<${inferResponse}> => \n (baseClient as any).${name}(),`);\n }\n } else {\n if (endpoint.params && endpoint.body) {\n methods.push(` ${name}: (params: ${inferParams}, body: ${inferBody}): Promise<${inferResponse}> => \n (baseClient as any).${name}(params, body),`);\n } else if (endpoint.params) {\n methods.push(` ${name}: (params: ${inferParams}): Promise<${inferResponse}> => \n (baseClient as any).${name}(params),`);\n } else if (endpoint.body) {\n methods.push(` ${name}: (body: ${inferBody}): Promise<${inferResponse}> => \n (baseClient as any).${name}(body),`);\n } else {\n methods.push(` ${name}: (): Promise<${inferResponse}> => \n (baseClient as any).${name}(),`);\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 content = `// Auto-generated query keys\nimport { z } from 'zod';\nimport { apiConfig } from '../config/endpoints';\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 const inferParams = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.params`,\n );\n const inferQuery = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.query`,\n );\n\n if (endpoint.params || endpoint.query) {\n const params: string[] = [];\n if (endpoint.params) params.push(`params?: ${inferParams}`);\n if (endpoint.query) params.push(`query?: ${inferQuery}`);\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 './api-client';\nimport { queryKeys } from './query-keys';\nimport { z } from 'zod';\nimport { apiConfig } from '../config/endpoints';\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 inferParams = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.params`,\n );\n const inferQuery = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.query`,\n );\n const inferResponse = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.response`,\n );\n\n const params: string[] = [];\n let apiCall = \"\";\n\n if (endpoint.params && endpoint.query) {\n params.push(`params: ${inferParams}`, `filters?: ${inferQuery}`);\n apiCall = `apiClient.${name}(params, filters)`;\n } else if (endpoint.params) {\n params.push(`params: ${inferParams}`);\n apiCall = `apiClient.${name}(params)`;\n } else if (endpoint.query) {\n params.push(`filters?: ${inferQuery}`);\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<${inferResponse}> => ${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 \"../config/schema.js\";\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 { z } from 'zod';\nimport { apiConfig } from '../config/endpoints';\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 const inferParams = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.params`,\n );\n const inferQuery = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.query`,\n );\n\n const params: string[] = [\"queryClient: QueryClient\"];\n const optionParams: string[] = [];\n\n if (endpoint.params) {\n params.push(`params: ${inferParams}`);\n optionParams.push(\"params\");\n }\n if (endpoint.query) {\n params.push(`filters?: ${inferQuery}`);\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 { 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\";\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\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 { createJiti } from 'jiti';\nimport type { APIConfig } from '../config/schema.js';\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 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","#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { loadConfig, validateConfig } from './config/index.js';\nimport { CodegenCore } from './core/codegen.js';\nimport fs from 'fs/promises';\nimport path from 'path';\n\nconst program = new Command();\n\nprogram\n .name('api-codegen')\n .description('Generate type-safe API client code from endpoint definitions')\n .version('1.0.0');\n\nprogram\n .command('generate')\n .alias('gen')\n .description('Generate API client code from configuration')\n .option('-c, --config <path>', 'Path to configuration file')\n .option('-w, --watch', 'Watch for changes and regenerate')\n .action(async (options) => {\n const spinner = ora('Loading configuration...').start();\n\n try {\n // Load configuration\n const config = await loadConfig(options.config);\n\n if (!config) {\n spinner.fail(\n chalk.red(\n 'No configuration file found. Please create an api-codegen.config.js file.',\n ),\n );\n process.exit(1);\n }\n\n spinner.text = 'Validating configuration...';\n validateConfig(config);\n\n spinner.text = 'Loading API endpoints...';\n const codegen = new CodegenCore(config);\n\n spinner.text = 'Generating code...';\n await codegen.execute();\n\n spinner.succeed(\n chalk.green(\n `✨ Code generated successfully in ${chalk.cyan(config.outputDir)}`,\n ),\n );\n\n // Print generated files\n console.log(chalk.dim('\\nGenerated files:'));\n const files = await fs.readdir(config.outputDir);\n files.forEach((file) => {\n console.log(chalk.dim(` • ${file}`));\n });\n\n if (options.watch) {\n console.log(chalk.yellow('\\n👀 Watching for changes...'));\n // TODO: Implement watch mode\n spinner.info(chalk.dim('Watch mode not yet implemented'));\n }\n } catch (error) {\n spinner.fail(chalk.red('Failed to generate code'));\n console.error(\n chalk.red('\\n' + (error instanceof Error ? error.message : String(error))),\n );\n if (error instanceof Error && error.stack) {\n console.error(chalk.dim(error.stack));\n }\n process.exit(1);\n }\n });\n\nprogram\n .command('init')\n .description('Initialize a new api-codegen configuration')\n .option('-p, --provider <provider>', 'Provider type (vite or nextjs)', 'vite')\n .action(async (options) => {\n const spinner = ora('Creating configuration file...').start();\n\n try {\n const configContent = generateConfigTemplate(options.provider);\n const configPath = path.join(process.cwd(), 'api-codegen.config.js');\n\n // Check if config already exists\n try {\n await fs.access(configPath);\n spinner.warn(\n chalk.yellow(\n 'Configuration file already exists at api-codegen.config.js',\n ),\n );\n return;\n } catch {\n // File doesn't exist, continue\n }\n\n await fs.writeFile(configPath, configContent, 'utf-8');\n\n spinner.succeed(\n chalk.green('✨ Configuration file created: api-codegen.config.js'),\n );\n\n console.log(chalk.dim('\\nNext steps:'));\n console.log(chalk.dim(' 1. Update the endpoints path in the config'));\n console.log(chalk.dim(' 2. Run: npx @cushin/api-codegen generate'));\n } catch (error) {\n spinner.fail(chalk.red('Failed to create configuration file'));\n console.error(\n chalk.red('\\n' + (error instanceof Error ? error.message : String(error))),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('validate')\n .description('Validate your API endpoints configuration')\n .option('-c, --config <path>', 'Path to configuration file')\n .action(async (options) => {\n const spinner = ora('Loading configuration...').start();\n\n try {\n const config = await loadConfig(options.config);\n\n if (!config) {\n spinner.fail(chalk.red('No configuration file found'));\n process.exit(1);\n }\n\n spinner.text = 'Validating configuration...';\n validateConfig(config);\n\n spinner.text = 'Loading API endpoints...';\n\n new CodegenCore(config);\n\n // Just load to validate\n const apiConfigModule = await import(\n pathToFileURL(config.endpointsPath).href\n );\n const apiConfig =\n apiConfigModule.apiConfig ||\n apiConfigModule.default?.apiConfig ||\n apiConfigModule.default;\n\n if (!apiConfig || !apiConfig.endpoints) {\n throw new Error('Invalid endpoints configuration');\n }\n\n const endpointCount = Object.keys(apiConfig.endpoints).length;\n\n spinner.succeed(\n chalk.green(\n `✨ Configuration is valid! Found ${endpointCount} endpoint${endpointCount === 1 ? '' : 's'}`,\n ),\n );\n\n // Print endpoint summary\n console.log(chalk.dim('\\nEndpoints:'));\n Object.entries(apiConfig.endpoints).forEach(([name, endpoint]: [string, any]) => {\n console.log(\n chalk.dim(\n ` • ${chalk.cyan(name)}: ${endpoint.method} ${endpoint.path}`,\n ),\n );\n });\n } catch (error) {\n spinner.fail(chalk.red('Validation failed'));\n console.error(\n chalk.red('\\n' + (error instanceof Error ? error.message : String(error))),\n );\n process.exit(1);\n }\n });\n\nfunction generateConfigTemplate(provider: string): string {\n return `/** @type {import('@cushin/api-codegen').UserConfig} */\nexport default {\n // Provider: 'vite' or 'nextjs'\n provider: '${provider}',\n\n // Path to your API endpoints configuration\n endpoints: './lib/api/config/endpoints.ts',\n\n // Output directory for generated files\n output: './lib/api/generated',\n\n // Base URL for API requests (optional, can be set at runtime)\n baseUrl: process.env.VITE_API_URL || process.env.NEXT_PUBLIC_API_URL,\n\n // Generation options\n generateHooks: true,\n generateClient: true,\n ${provider === 'nextjs' ? `generateServerActions: true,\n generateServerQueries: true,` : ''}\n\n // Advanced options\n options: {\n useClientDirective: true,\n hookPrefix: 'use',\n actionSuffix: 'Action',\n },\n};\n`;\n}\n\nfunction pathToFileURL(filePath: string): URL {\n return new URL(`file://${path.resolve(filePath)}`);\n}\n\nprogram.parse();\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/config/index.ts","../src/generators/base.ts","../src/generators/hooks.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/index.ts","../src/core/codegen.ts","../src/cli.ts"],"names":["path","fs","exports"],"mappings":"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","file":"cli.js","sourcesContent":["import { cosmiconfig } from \"cosmiconfig\";\nimport path from \"path\";\nimport type { APIConfig } from \"./schema.js\";\n\nexport interface UserConfig {\n /**\n * Base URL for API requests\n */\n baseUrl?: 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 type { APIConfig, APIEndpoint } from \"../config/schema.js\";\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 ? `ExtractParams<APIEndpoints['${name}']>` : \"never\",\n queryType: hasQuery ? `ExtractQuery<APIEndpoints['${name}']>` : \"never\",\n bodyType: hasBody ? `ExtractBody<APIEndpoints['${name}']>` : \"never\",\n responseType: `ExtractResponse<APIEndpoints['${name}']>`,\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","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"../config/schema.js\";\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 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\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 { z } from \"zod\";\nimport { apiConfig } from \"${relativePath}\";\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 const inferParams = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.params`,\n );\n const inferQuery = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.query`,\n );\n const inferResponse = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.response`,\n );\n\n const params: string[] = [];\n const optionParams: string[] = [];\n\n const queryTags = this.getQueryTags(endpoint);\n\n if (endpoint.params) {\n params.push(`params: ${inferParams}`);\n optionParams.push(\"params\");\n }\n if (endpoint.query) {\n params.push(`filters?: ${inferQuery}`);\n optionParams.push(\"filters\");\n }\n\n params.push(`options?: {\n enabled?: boolean;\n select?: <TData = ${inferResponse}>(data: ${inferResponse}) => 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 const inferParams = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.params`,\n );\n const inferBody = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.body`,\n );\n const inferResponse = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.response`,\n );\n\n const resourceHasQueries = this.resourceHasQueryEndpoints(resource);\n\n let inputType: string;\n let fnBody: string;\n\n if (endpoint.params && endpoint.body) {\n inputType = `{ params: ${inferParams}; body: ${inferBody}; }`;\n fnBody = `({ params, body }: ${inputType}) => apiClient.${name}(params, body)`;\n } else if (endpoint.params) {\n inputType = `${inferParams}`;\n fnBody = `(params: ${inputType}) => apiClient.${name}(params)`;\n } else if (endpoint.body) {\n inputType = `${inferBody}`;\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 */\n export function ${hookName}(options?: {\n onSuccess?: (data: ${inferResponse}, variables: ${inputType}, context: unknown) => void;\n onError?: (error: Error, variables: ${inputType}, context: unknown) => void;\n onSettled?: (data: ${inferResponse} | 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\tmutationFn: ${fnBody},\n\tonSuccess: (data, variables, context) => {\n\t ${invalidate}\n\t options?.onSuccess?.(data, variables, context);\n\t},\n\tonError: options?.onError,\n\tonSettled: options?.onSettled,\n\tonMutate: options?.onMutate,\n });\n }`;\n }\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport { BaseGenerator } from './base.js';\nimport type { APIEndpoint } from '../config/schema';\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 { \n APIEndpoints, \n ExtractBody, \n ExtractParams, \n ExtractResponse \n} 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(([name, endpoint]) => {\n if (this.isMutationEndpoint(endpoint)) {\n actions.push(this.generateServerAction(name, endpoint));\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 signature = this.getEndpointSignature(name, endpoint);\n const invalidationTags = this.getInvalidationTags(endpoint);\n\n let inputType = '';\n let inputParam = '';\n if (signature.hasParams && signature.hasBody) {\n inputType = `input: { params: ${signature.paramType}; body: ${signature.bodyType} }`;\n inputParam = 'input';\n } else if (signature.hasParams) {\n inputType = `params: ${signature.paramType}`;\n inputParam = 'params';\n } else if (signature.hasBody) {\n inputType = `body: ${signature.bodyType}`;\n inputParam = 'body';\n }\n\n const revalidateStatements = invalidationTags.length > 0\n ? invalidationTags\n .map((tag) => ` revalidateTag('${tag}');`)\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<${signature.responseType}>> {\n try {\n const result = await serverClient.${name}(${inputParam ? inputParam : ''});\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 \"../config/schema.js\";\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 { \n APIEndpoints, \n ExtractParams, \n ExtractQuery, \n ExtractResponse \n} 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 signature = this.getEndpointSignature(name, endpoint);\n const queryTags = this.getQueryTags(endpoint);\n\n const paramDef = signature.hasParams\n ? `params: ${signature.paramType}`\n : \"\";\n const queryDef = signature.hasQuery ? `query?: ${signature.queryType}` : \"\";\n const paramsList = [paramDef, queryDef].filter(Boolean).join(\",\\n \");\n\n const clientCallArgs: string[] = [];\n if (signature.hasParams) clientCallArgs.push(\"params\");\n if (signature.hasQuery) clientCallArgs.push(\"query\");\n\n // Generate cache key based on params\n const cacheKeyParts: string[] = [`'${name}'`];\n if (signature.hasParams) cacheKeyParts.push(\"JSON.stringify(params)\");\n if (signature.hasQuery) cacheKeyParts.push(\"JSON.stringify(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<${signature.responseType}> => {\n return unstable_cache(\n async () => serverClient.${name}(${clientCallArgs.join(\", \")}),\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 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-codegen/schema';\n\n/**\n * Type helper to extract params schema from an endpoint\n */\nexport type ExtractParams<T> = T extends { params: infer P extends z.ZodType }\n ? z.infer<P>\n : never;\n\n/**\n * Type helper to extract query schema from an endpoint\n */\nexport type ExtractQuery<T> = T extends { query: infer Q extends z.ZodType }\n ? z.infer<Q>\n : never;\n\n/**\n * Type helper to extract body schema from an endpoint\n */\nexport type ExtractBody<T> = T extends { body: infer B extends z.ZodType }\n ? z.infer<B>\n : never;\n\n/**\n * Type helper to extract response schema from an endpoint\n */\nexport type ExtractResponse<T> = T extends { response: infer R extends z.ZodType }\n ? z.infer<R>\n : never;\n\n/**\n * Import your API config to get typed endpoints\n * \n */\nexport type APIEndpoints = typeof apiConfig.endpoints;\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 if (endpoint.response)\n types.push(\n `export type ${cap}Response = ${this.inferNonNull(`typeof apiConfig.endpoints.${name}.response`)};`,\n );\n if (endpoint.body)\n types.push(\n `export type ${cap}Input = ${this.inferNonNull(`typeof apiConfig.endpoints.${name}.body`)};`,\n );\n if (endpoint.query)\n types.push(\n `export type ${cap}Query = ${this.inferNonNull(`typeof apiConfig.endpoints.${name}.query`)};`,\n );\n if (endpoint.params)\n types.push(\n `export type ${cap}Params = ${this.inferNonNull(`typeof apiConfig.endpoints.${name}.params`)};`,\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\n return `${useClientDirective ? \"'use client';\\n\" : \"\"}\nimport { createAPIClient } from '@cushin/api-codegen/client';\nimport type { AuthCallbacks } from '@cushin/api-codegen/client';\nimport { apiConfig } from '${relativePath}';\nimport { z } from 'zod';\n\n// Type the methods based on endpoints\ntype APIClientMethods = {\n [K in keyof typeof apiConfig.endpoints]: (typeof apiConfig.endpoints)[K] extends {\n method: infer M;\n params?: infer P;\n query?: infer Q;\n body?: infer B;\n response: infer R;\n }\n ? M extends \"GET\"\n ? P extends z.ZodJSONSchema\n ? Q extends z.ZodJSONSchema\n ? (params: z.infer<P>, query?: z.infer<Q>) => Promise<z.infer<R>>\n : (params: z.infer<P>) => Promise<z.infer<R>>\n : Q extends z.ZodJSONSchema\n ? (query?: z.infer<Q>) => Promise<z.infer<R>>\n : () => Promise<z.infer<R>>\n : P extends z.ZodJSONSchema\n ? B extends z.ZodJSONSchema\n ? (params: z.infer<P>, body: z.infer<B>) => Promise<z.infer<R>>\n : (params: z.infer<P>) => Promise<z.infer<R>>\n : B extends z.ZodJSONSchema\n ? (body: z.infer<B>) => Promise<z.infer<R>>\n : () => Promise<z.infer<R>>\n : never;\n};\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 return `import { createAPIClient } from '@cushin/api-codegen/client';\nimport { apiConfig } from '../config/endpoints';\nimport type { APIEndpoints } from './types';\n\n// Type-safe API client methods for server-side\ntype APIClientMethods = {\n [K in keyof APIEndpoints]: APIEndpoints[K] extends {\n method: infer M;\n params?: infer P;\n query?: infer Q;\n body?: infer B;\n response: infer R;\n }\n ? M extends 'GET'\n ? P extends { _type: any }\n ? Q extends { _type: any }\n ? (params: P['_type'], query?: Q['_type']) => Promise<R['_type']>\n : (params: P['_type']) => Promise<R['_type']>\n : Q extends { _type: any }\n ? (query?: Q['_type']) => Promise<R['_type']>\n : () => Promise<R['_type']>\n : P extends { _type: any }\n ? B extends { _type: any }\n ? (params: P['_type'], body: B['_type']) => Promise<R['_type']>\n : (params: P['_type']) => Promise<R['_type']>\n : B extends { _type: any }\n ? (body: B['_type']) => Promise<R['_type']>\n : () => Promise<R['_type']>\n : never;\n};\n\n/**\n * Server-side API client (no auth, direct API calls)\n * Use this in Server Components, Server Actions, and Route Handlers\n */\nexport const serverClient = createAPIClient(apiConfig) as APIClientMethods;\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 inferParams = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.params`,\n );\n const inferQuery = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.query`,\n );\n const inferBody = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.body`,\n );\n const inferResponse = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.response`,\n );\n\n if (endpoint.method === \"GET\") {\n if (endpoint.params && endpoint.query) {\n methods.push(` ${name}: (params: ${inferParams}, query?: ${inferQuery}): Promise<${inferResponse}> => \n (baseClient as any).${name}(params, query),`);\n } else if (endpoint.params) {\n methods.push(` ${name}: (params: ${inferParams}): Promise<${inferResponse}> => \n (baseClient as any).${name}(params),`);\n } else if (endpoint.query) {\n methods.push(` ${name}: (query?: ${inferQuery}): Promise<${inferResponse}> => \n (baseClient as any).${name}(query),`);\n } else {\n methods.push(` ${name}: (): Promise<${inferResponse}> => \n (baseClient as any).${name}(),`);\n }\n } else {\n if (endpoint.params && endpoint.body) {\n methods.push(` ${name}: (params: ${inferParams}, body: ${inferBody}): Promise<${inferResponse}> => \n (baseClient as any).${name}(params, body),`);\n } else if (endpoint.params) {\n methods.push(` ${name}: (params: ${inferParams}): Promise<${inferResponse}> => \n (baseClient as any).${name}(params),`);\n } else if (endpoint.body) {\n methods.push(` ${name}: (body: ${inferBody}): Promise<${inferResponse}> => \n (baseClient as any).${name}(body),`);\n } else {\n methods.push(` ${name}: (): Promise<${inferResponse}> => \n (baseClient as any).${name}(),`);\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 const content = `// Auto-generated query keys\nimport { z } from 'zod';\nimport { apiConfig } from '${relativePath}';\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 const inferParams = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.params`,\n );\n const inferQuery = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.query`,\n );\n\n if (endpoint.params || endpoint.query) {\n const params: string[] = [];\n if (endpoint.params) params.push(`params?: ${inferParams}`);\n if (endpoint.query) params.push(`query?: ${inferQuery}`);\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 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 const content = `// Auto-generated query options\nimport { queryOptions } from '@tanstack/react-query';\nimport { apiClient } from './client';\nimport { queryKeys } from './query-keys';\nimport { z } from 'zod';\nimport { apiConfig } from '${relativePath}';\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 inferParams = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.params`,\n );\n const inferQuery = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.query`,\n );\n const inferResponse = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.response`,\n );\n\n const params: string[] = [];\n let apiCall = \"\";\n\n if (endpoint.params && endpoint.query) {\n params.push(`params: ${inferParams}`, `filters?: ${inferQuery}`);\n apiCall = `apiClient.${name}(params, filters)`;\n } else if (endpoint.params) {\n params.push(`params: ${inferParams}`);\n apiCall = `apiClient.${name}(params)`;\n } else if (endpoint.query) {\n params.push(`filters?: ${inferQuery}`);\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<${inferResponse}> => ${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 \"../config/schema.js\";\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 { z } from 'zod';\nimport { apiConfig } from '../config/endpoints';\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 const inferParams = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.params`,\n );\n const inferQuery = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.query`,\n );\n\n const params: string[] = [\"queryClient: QueryClient\"];\n const optionParams: string[] = [];\n\n if (endpoint.params) {\n params.push(`params: ${inferParams}`);\n optionParams.push(\"params\");\n }\n if (endpoint.query) {\n params.push(`filters?: ${inferQuery}`);\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 { 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\";\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\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 { createJiti } from 'jiti';\nimport type { APIConfig } from '../config/schema.js';\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 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","#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { loadConfig, validateConfig } from './config/index.js';\nimport { CodegenCore } from './core/codegen.js';\nimport fs from 'fs/promises';\nimport path from 'path';\n\nconst program = new Command();\n\nprogram\n .name('api-codegen')\n .description('Generate type-safe API client code from endpoint definitions')\n .version('1.0.0');\n\nprogram\n .command('generate')\n .alias('gen')\n .description('Generate API client code from configuration')\n .option('-c, --config <path>', 'Path to configuration file')\n .option('-w, --watch', 'Watch for changes and regenerate')\n .action(async (options) => {\n const spinner = ora('Loading configuration...').start();\n\n try {\n // Load configuration\n const config = await loadConfig(options.config);\n\n if (!config) {\n spinner.fail(\n chalk.red(\n 'No configuration file found. Please create an api-codegen.config.js file.',\n ),\n );\n process.exit(1);\n }\n\n spinner.text = 'Validating configuration...';\n validateConfig(config);\n\n spinner.text = 'Loading API endpoints...';\n const codegen = new CodegenCore(config);\n\n spinner.text = 'Generating code...';\n await codegen.execute();\n\n spinner.succeed(\n chalk.green(\n `✨ Code generated successfully in ${chalk.cyan(config.outputDir)}`,\n ),\n );\n\n // Print generated files\n console.log(chalk.dim('\\nGenerated files:'));\n const files = await fs.readdir(config.outputDir);\n files.forEach((file) => {\n console.log(chalk.dim(` • ${file}`));\n });\n\n if (options.watch) {\n console.log(chalk.yellow('\\n👀 Watching for changes...'));\n // TODO: Implement watch mode\n spinner.info(chalk.dim('Watch mode not yet implemented'));\n }\n } catch (error) {\n spinner.fail(chalk.red('Failed to generate code'));\n console.error(\n chalk.red('\\n' + (error instanceof Error ? error.message : String(error))),\n );\n if (error instanceof Error && error.stack) {\n console.error(chalk.dim(error.stack));\n }\n process.exit(1);\n }\n });\n\nprogram\n .command('init')\n .description('Initialize a new api-codegen configuration')\n .option('-p, --provider <provider>', 'Provider type (vite or nextjs)', 'vite')\n .action(async (options) => {\n const spinner = ora('Creating configuration file...').start();\n\n try {\n const configContent = generateConfigTemplate(options.provider);\n const configPath = path.join(process.cwd(), 'api-codegen.config.js');\n\n // Check if config already exists\n try {\n await fs.access(configPath);\n spinner.warn(\n chalk.yellow(\n 'Configuration file already exists at api-codegen.config.js',\n ),\n );\n return;\n } catch {\n // File doesn't exist, continue\n }\n\n await fs.writeFile(configPath, configContent, 'utf-8');\n\n spinner.succeed(\n chalk.green('✨ Configuration file created: api-codegen.config.js'),\n );\n\n console.log(chalk.dim('\\nNext steps:'));\n console.log(chalk.dim(' 1. Update the endpoints path in the config'));\n console.log(chalk.dim(' 2. Run: npx @cushin/api-codegen generate'));\n } catch (error) {\n spinner.fail(chalk.red('Failed to create configuration file'));\n console.error(\n chalk.red('\\n' + (error instanceof Error ? error.message : String(error))),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('validate')\n .description('Validate your API endpoints configuration')\n .option('-c, --config <path>', 'Path to configuration file')\n .action(async (options) => {\n const spinner = ora('Loading configuration...').start();\n\n try {\n const config = await loadConfig(options.config);\n\n if (!config) {\n spinner.fail(chalk.red('No configuration file found'));\n process.exit(1);\n }\n\n spinner.text = 'Validating configuration...';\n validateConfig(config);\n\n spinner.text = 'Loading API endpoints...';\n\n new CodegenCore(config);\n\n // Just load to validate\n const apiConfigModule = await import(\n pathToFileURL(config.endpointsPath).href\n );\n const apiConfig =\n apiConfigModule.apiConfig ||\n apiConfigModule.default?.apiConfig ||\n apiConfigModule.default;\n\n if (!apiConfig || !apiConfig.endpoints) {\n throw new Error('Invalid endpoints configuration');\n }\n\n const endpointCount = Object.keys(apiConfig.endpoints).length;\n\n spinner.succeed(\n chalk.green(\n `✨ Configuration is valid! Found ${endpointCount} endpoint${endpointCount === 1 ? '' : 's'}`,\n ),\n );\n\n // Print endpoint summary\n console.log(chalk.dim('\\nEndpoints:'));\n Object.entries(apiConfig.endpoints).forEach(([name, endpoint]: [string, any]) => {\n console.log(\n chalk.dim(\n ` • ${chalk.cyan(name)}: ${endpoint.method} ${endpoint.path}`,\n ),\n );\n });\n } catch (error) {\n spinner.fail(chalk.red('Validation failed'));\n console.error(\n chalk.red('\\n' + (error instanceof Error ? error.message : String(error))),\n );\n process.exit(1);\n }\n });\n\nfunction generateConfigTemplate(provider: string): string {\n return `/** @type {import('@cushin/api-codegen').UserConfig} */\nexport default {\n // Provider: 'vite' or 'nextjs'\n provider: '${provider}',\n\n // Path to your API endpoints configuration\n endpoints: './lib/api/config/endpoints.ts',\n\n // Output directory for generated files\n output: './lib/api/generated',\n\n // Base URL for API requests (optional, can be set at runtime)\n baseUrl: process.env.VITE_API_URL || process.env.NEXT_PUBLIC_API_URL,\n\n // Generation options\n generateHooks: true,\n generateClient: true,\n ${provider === 'nextjs' ? `generateServerActions: true,\n generateServerQueries: true,` : ''}\n\n // Advanced options\n options: {\n useClientDirective: true,\n hookPrefix: 'use',\n actionSuffix: 'Action',\n },\n};\n`;\n}\n\nfunction pathToFileURL(filePath: string): URL {\n return new URL(`file://${path.resolve(filePath)}`);\n}\n\nprogram.parse();\n"]}
|
package/dist/index.js
CHANGED
|
@@ -980,9 +980,12 @@ var QueryKeysGenerator = class extends BaseGenerator {
|
|
|
980
980
|
await fs5.writeFile(outputPath, content, "utf-8");
|
|
981
981
|
}
|
|
982
982
|
generateContent() {
|
|
983
|
+
const outputPath = path6.join(this.context.config.outputDir, "types.ts");
|
|
984
|
+
const endpointsPath = path6.join(this.context.config.endpointsPath);
|
|
985
|
+
const relativePath = path6.relative(path6.dirname(outputPath), endpointsPath).replace(/\\/g, "/");
|
|
983
986
|
const content = `// Auto-generated query keys
|
|
984
987
|
import { z } from 'zod';
|
|
985
|
-
import { apiConfig } from '
|
|
988
|
+
import { apiConfig } from '${relativePath}';
|
|
986
989
|
|
|
987
990
|
export const queryKeys = {
|
|
988
991
|
${this.generateQueryKeysContent()}
|
|
@@ -1040,12 +1043,15 @@ var QueryOptionsGenerator = class extends BaseGenerator {
|
|
|
1040
1043
|
await fs5.writeFile(outputPath, content, "utf-8");
|
|
1041
1044
|
}
|
|
1042
1045
|
generateContent() {
|
|
1046
|
+
const outputPath = path6.join(this.context.config.outputDir, "types.ts");
|
|
1047
|
+
const endpointsPath = path6.join(this.context.config.endpointsPath);
|
|
1048
|
+
const relativePath = path6.relative(path6.dirname(outputPath), endpointsPath).replace(/\\/g, "/");
|
|
1043
1049
|
const content = `// Auto-generated query options
|
|
1044
1050
|
import { queryOptions } from '@tanstack/react-query';
|
|
1045
|
-
import { apiClient } from './
|
|
1051
|
+
import { apiClient } from './client';
|
|
1046
1052
|
import { queryKeys } from './query-keys';
|
|
1047
1053
|
import { z } from 'zod';
|
|
1048
|
-
import { apiConfig } from '
|
|
1054
|
+
import { apiConfig } from '${relativePath}';
|
|
1049
1055
|
|
|
1050
1056
|
${this.generateQueryOptionsContent()}
|
|
1051
1057
|
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config/schema.ts","../src/config/index.ts","../src/runtime/client.ts","../src/generators/base.ts","../src/generators/hooks.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/index.ts","../src/core/codegen.ts"],"names":["path","fs","exports"],"mappings":"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","file":"index.js","sourcesContent":["import type { z } from 'zod';\n\nexport type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n\nexport interface APIEndpoint {\n path: string;\n method: HTTPMethod;\n baseUrl?: string;\n params?: z.ZodType<any>;\n query?: z.ZodType<any>;\n body?: z.ZodType<any>;\n response: z.ZodType<any>;\n tags?: string[];\n description?: string;\n}\n\nexport interface APIConfig {\n baseUrl?: string;\n endpoints: Record<string, APIEndpoint>;\n}\n\nexport type EndpointConfig<\n TPath extends string = string,\n TMethod extends HTTPMethod = HTTPMethod,\n TParams = undefined,\n TQuery = undefined,\n TBody = undefined,\n TResponse = any,\n> = {\n path: TPath;\n method: TMethod;\n baseUrl?: string;\n params?: z.ZodType<TParams>;\n query?: z.ZodType<TQuery>;\n body?: z.ZodType<TBody>;\n response: z.ZodType<TResponse>;\n tags?: string[];\n description?: string;\n};\n\n/**\n * Helper function to define API configuration with type safety\n */\nexport function defineConfig<T extends APIConfig>(config: T): T {\n return config;\n}\n\n/**\n * Helper function to define a single endpoint with type inference\n */\nexport function defineEndpoint<\n TPath extends string,\n TMethod extends HTTPMethod,\n TParams = undefined,\n TQuery = undefined,\n TBody = undefined,\n TResponse = any,\n>(\n config: EndpointConfig<TPath, TMethod, TParams, TQuery, TBody, TResponse>,\n): EndpointConfig<TPath, TMethod, TParams, TQuery, TBody, TResponse> {\n return config;\n}\n\n/**\n * Helper to define multiple endpoints\n */\nexport function defineEndpoints<\n T extends Record<string, APIEndpoint>,\n>(endpoints: T): T {\n return endpoints;\n}\n","import { cosmiconfig } from \"cosmiconfig\";\nimport path from \"path\";\nimport type { APIConfig } from \"./schema.js\";\n\nexport interface UserConfig {\n /**\n * Base URL for API requests\n */\n baseUrl?: 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 ky, { HTTPError } from \"ky\";\nimport type { APIConfig, APIEndpoint } from \"../config/schema.js\";\n\nexport interface AuthTokens {\n accessToken: string;\n refreshToken?: string;\n}\n\nexport interface AuthCallbacks {\n getTokens: () => Promise<AuthTokens | null>;\n onAuthError?: () => void;\n onRefreshToken?: () => Promise<void>;\n}\n\nexport class APIError extends Error {\n constructor(\n message: string,\n public status: number,\n public response?: any,\n ) {\n super(message);\n this.name = \"APIError\";\n }\n}\n\nexport class AuthError extends APIError {\n constructor(message: string = \"Authentication failed\") {\n super(message, 401);\n this.name = \"AuthError\";\n }\n}\n\nexport class APIClient {\n private client: typeof ky;\n private isRefreshing = false;\n private refreshPromise: Promise<void> | null = null;\n private hooks: any;\n\n constructor(\n private config: APIConfig,\n private authCallbacks?: AuthCallbacks,\n ) {\n this.hooks = {\n beforeRequest: [\n async (request: Request) => {\n const tokens = await this.authCallbacks?.getTokens();\n if (tokens?.accessToken) {\n request.headers.set(\n \"Authorization\",\n `Bearer ${tokens.accessToken}`,\n );\n }\n },\n ],\n beforeRetry: [\n async ({ request, error, retryCount }: any) => {\n if (error instanceof HTTPError && error.response.status === 401) {\n if (retryCount === 1 && this.authCallbacks) {\n try {\n await this.refreshTokens();\n const tokens = await this.authCallbacks.getTokens();\n if (tokens?.accessToken) {\n request.headers.set(\n \"Authorization\",\n `Bearer ${tokens.accessToken}`,\n );\n }\n } catch (refreshError) {\n this.authCallbacks.onAuthError?.();\n throw new AuthError();\n }\n } else {\n this.authCallbacks?.onAuthError?.();\n throw new AuthError();\n }\n }\n },\n ],\n beforeError: [\n async (error: any) => {\n const { response } = error;\n if (response?.body) {\n try {\n const body = await response.json();\n error.message =\n (body as Error).message || `HTTP ${response.status}`;\n } catch {\n // Keep original message\n }\n }\n return error;\n },\n ],\n };\n\n this.client = ky.create({\n prefixUrl: this.config.baseUrl,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n retry: {\n limit: 2,\n methods: [\"get\", \"post\", \"put\", \"delete\", \"patch\"],\n statusCodes: [401],\n },\n hooks: this.hooks,\n });\n }\n\n private async refreshTokens(): Promise<void> {\n if (!this.authCallbacks) {\n throw new AuthError(\"No auth callbacks provided\");\n }\n\n if (this.isRefreshing && this.refreshPromise) {\n return this.refreshPromise;\n }\n\n this.isRefreshing = true;\n\n this.refreshPromise = (async () => {\n try {\n if (this.authCallbacks?.onRefreshToken) {\n await this.authCallbacks.onRefreshToken();\n } else {\n throw new AuthError(\"No refresh token handler provided\");\n }\n } catch (error) {\n throw error;\n } finally {\n this.isRefreshing = false;\n this.refreshPromise = null;\n }\n })();\n\n return this.refreshPromise;\n }\n\n private buildPath(path: string, params?: Record<string, any>): string {\n if (!params) return path;\n\n let finalPath = path;\n Object.entries(params).forEach(([key, value]) => {\n finalPath = finalPath.replace(\n `:${key}`,\n encodeURIComponent(String(value)),\n );\n });\n\n return finalPath;\n }\n\n private getEndpointBaseUrl(endpoint: APIEndpoint): string {\n return endpoint.baseUrl || this.config.baseUrl!;\n }\n\n private getClientForEndpoint(endpoint: APIEndpoint): typeof ky {\n const endpointBaseUrl = this.getEndpointBaseUrl(endpoint);\n\n if (endpointBaseUrl === this.config.baseUrl) {\n return this.client;\n }\n\n return ky.create({\n prefixUrl: endpointBaseUrl,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n retry: {\n limit: 2,\n methods: [\"get\", \"post\", \"put\", \"delete\", \"patch\"],\n statusCodes: [401],\n },\n hooks: this.hooks,\n });\n }\n\n async request<T>(\n endpoint: APIEndpoint,\n params?: Record<string, any>,\n query?: Record<string, any>,\n body?: any,\n ): Promise<T> {\n try {\n const path = this.buildPath(endpoint.path, params);\n const client = this.getClientForEndpoint(endpoint);\n\n const options: Record<string, any> = {\n method: endpoint.method,\n };\n\n if (query && Object.keys(query).length > 0) {\n const searchParams = new URLSearchParams();\n Object.entries(query).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n });\n if (searchParams.toString()) {\n options.searchParams = searchParams;\n }\n }\n\n if (body && endpoint.method !== \"GET\") {\n if (endpoint.body) {\n const validatedBody = endpoint.body.parse(body);\n options.json = validatedBody;\n } else {\n options.json = body;\n }\n }\n\n const response = await client(path, options);\n const data = await response.json();\n\n if (endpoint.response) {\n return endpoint.response.parse(data);\n }\n\n return data as T;\n } catch (error) {\n if (error instanceof HTTPError) {\n const errorData = await error.response.json().catch(() => ({}));\n throw new APIError(\n errorData.message || error.message,\n error.response.status,\n errorData,\n );\n }\n\n if (error instanceof AuthError) {\n throw error;\n }\n\n throw new APIError(\n error instanceof Error ? error.message : \"Network error\",\n 0,\n );\n }\n }\n\n updateAuthCallbacks(authCallbacks: AuthCallbacks) {\n this.authCallbacks = authCallbacks;\n }\n\n async refreshAuth(): Promise<void> {\n if (!this.authCallbacks) {\n throw new AuthError(\"No auth callbacks provided\");\n }\n await this.refreshTokens();\n }\n\n generateMethods() {\n const methods: any = {};\n\n Object.entries(this.config.endpoints).forEach(([name, endpoint]) => {\n if (endpoint.method === \"GET\") {\n if (endpoint.params && endpoint.query) {\n methods[name] = (params: any, query?: any): Promise<any> => {\n return this.request(endpoint, params, query);\n };\n } else if (endpoint.params) {\n methods[name] = (params: any): Promise<any> => {\n return this.request(endpoint, params);\n };\n } else if (endpoint.query) {\n methods[name] = (query?: any): Promise<any> => {\n return this.request(endpoint, undefined, query);\n };\n } else {\n methods[name] = (): Promise<any> => {\n return this.request(endpoint);\n };\n }\n } else {\n if (endpoint.params && endpoint.body) {\n methods[name] = (params: any, body: any): Promise<any> => {\n return this.request(endpoint, params, undefined, body);\n };\n } else if (endpoint.params) {\n methods[name] = (params: any): Promise<any> => {\n return this.request(endpoint, params);\n };\n } else if (endpoint.body) {\n methods[name] = (body: any): Promise<any> => {\n return this.request(endpoint, undefined, undefined, body);\n };\n } else {\n methods[name] = (): Promise<any> => {\n return this.request(endpoint);\n };\n }\n }\n });\n\n return methods;\n }\n}\n\nexport function createAPIClient(\n config: APIConfig,\n authCallbacks?: AuthCallbacks,\n) {\n const instance = new APIClient(config, authCallbacks);\n const methods = instance.generateMethods();\n\n return {\n ...methods,\n refreshAuth: () => instance.refreshAuth(),\n updateAuthCallbacks: (newCallbacks: AuthCallbacks) =>\n instance.updateAuthCallbacks(newCallbacks),\n };\n}\n","import type { APIConfig, APIEndpoint } from \"../config/schema.js\";\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 ? `ExtractParams<APIEndpoints['${name}']>` : \"never\",\n queryType: hasQuery ? `ExtractQuery<APIEndpoints['${name}']>` : \"never\",\n bodyType: hasBody ? `ExtractBody<APIEndpoints['${name}']>` : \"never\",\n responseType: `ExtractResponse<APIEndpoints['${name}']>`,\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","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"../config/schema.js\";\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 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\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 { z } from \"zod\";\nimport { apiConfig } from \"${relativePath}\";\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 const inferParams = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.params`,\n );\n const inferQuery = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.query`,\n );\n const inferResponse = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.response`,\n );\n\n const params: string[] = [];\n const optionParams: string[] = [];\n\n const queryTags = this.getQueryTags(endpoint);\n\n if (endpoint.params) {\n params.push(`params: ${inferParams}`);\n optionParams.push(\"params\");\n }\n if (endpoint.query) {\n params.push(`filters?: ${inferQuery}`);\n optionParams.push(\"filters\");\n }\n\n params.push(`options?: {\n enabled?: boolean;\n select?: <TData = ${inferResponse}>(data: ${inferResponse}) => 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 const inferParams = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.params`,\n );\n const inferBody = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.body`,\n );\n const inferResponse = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.response`,\n );\n\n const resourceHasQueries = this.resourceHasQueryEndpoints(resource);\n\n let inputType: string;\n let fnBody: string;\n\n if (endpoint.params && endpoint.body) {\n inputType = `{ params: ${inferParams}; body: ${inferBody}; }`;\n fnBody = `({ params, body }: ${inputType}) => apiClient.${name}(params, body)`;\n } else if (endpoint.params) {\n inputType = `${inferParams}`;\n fnBody = `(params: ${inputType}) => apiClient.${name}(params)`;\n } else if (endpoint.body) {\n inputType = `${inferBody}`;\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 */\n export function ${hookName}(options?: {\n onSuccess?: (data: ${inferResponse}, variables: ${inputType}, context: unknown) => void;\n onError?: (error: Error, variables: ${inputType}, context: unknown) => void;\n onSettled?: (data: ${inferResponse} | 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\tmutationFn: ${fnBody},\n\tonSuccess: (data, variables, context) => {\n\t ${invalidate}\n\t options?.onSuccess?.(data, variables, context);\n\t},\n\tonError: options?.onError,\n\tonSettled: options?.onSettled,\n\tonMutate: options?.onMutate,\n });\n }`;\n }\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport { BaseGenerator } from './base.js';\nimport type { APIEndpoint } from '../config/schema';\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 { \n APIEndpoints, \n ExtractBody, \n ExtractParams, \n ExtractResponse \n} 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(([name, endpoint]) => {\n if (this.isMutationEndpoint(endpoint)) {\n actions.push(this.generateServerAction(name, endpoint));\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 signature = this.getEndpointSignature(name, endpoint);\n const invalidationTags = this.getInvalidationTags(endpoint);\n\n let inputType = '';\n let inputParam = '';\n if (signature.hasParams && signature.hasBody) {\n inputType = `input: { params: ${signature.paramType}; body: ${signature.bodyType} }`;\n inputParam = 'input';\n } else if (signature.hasParams) {\n inputType = `params: ${signature.paramType}`;\n inputParam = 'params';\n } else if (signature.hasBody) {\n inputType = `body: ${signature.bodyType}`;\n inputParam = 'body';\n }\n\n const revalidateStatements = invalidationTags.length > 0\n ? invalidationTags\n .map((tag) => ` revalidateTag('${tag}');`)\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<${signature.responseType}>> {\n try {\n const result = await serverClient.${name}(${inputParam ? inputParam : ''});\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 \"../config/schema.js\";\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 { \n APIEndpoints, \n ExtractParams, \n ExtractQuery, \n ExtractResponse \n} 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 signature = this.getEndpointSignature(name, endpoint);\n const queryTags = this.getQueryTags(endpoint);\n\n const paramDef = signature.hasParams\n ? `params: ${signature.paramType}`\n : \"\";\n const queryDef = signature.hasQuery ? `query?: ${signature.queryType}` : \"\";\n const paramsList = [paramDef, queryDef].filter(Boolean).join(\",\\n \");\n\n const clientCallArgs: string[] = [];\n if (signature.hasParams) clientCallArgs.push(\"params\");\n if (signature.hasQuery) clientCallArgs.push(\"query\");\n\n // Generate cache key based on params\n const cacheKeyParts: string[] = [`'${name}'`];\n if (signature.hasParams) cacheKeyParts.push(\"JSON.stringify(params)\");\n if (signature.hasQuery) cacheKeyParts.push(\"JSON.stringify(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<${signature.responseType}> => {\n return unstable_cache(\n async () => serverClient.${name}(${clientCallArgs.join(\", \")}),\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 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-codegen/schema';\n\n/**\n * Type helper to extract params schema from an endpoint\n */\nexport type ExtractParams<T> = T extends { params: infer P extends z.ZodType }\n ? z.infer<P>\n : never;\n\n/**\n * Type helper to extract query schema from an endpoint\n */\nexport type ExtractQuery<T> = T extends { query: infer Q extends z.ZodType }\n ? z.infer<Q>\n : never;\n\n/**\n * Type helper to extract body schema from an endpoint\n */\nexport type ExtractBody<T> = T extends { body: infer B extends z.ZodType }\n ? z.infer<B>\n : never;\n\n/**\n * Type helper to extract response schema from an endpoint\n */\nexport type ExtractResponse<T> = T extends { response: infer R extends z.ZodType }\n ? z.infer<R>\n : never;\n\n/**\n * Import your API config to get typed endpoints\n * \n */\nexport type APIEndpoints = typeof apiConfig.endpoints;\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 if (endpoint.response)\n types.push(\n `export type ${cap}Response = ${this.inferNonNull(`typeof apiConfig.endpoints.${name}.response`)};`,\n );\n if (endpoint.body)\n types.push(\n `export type ${cap}Input = ${this.inferNonNull(`typeof apiConfig.endpoints.${name}.body`)};`,\n );\n if (endpoint.query)\n types.push(\n `export type ${cap}Query = ${this.inferNonNull(`typeof apiConfig.endpoints.${name}.query`)};`,\n );\n if (endpoint.params)\n types.push(\n `export type ${cap}Params = ${this.inferNonNull(`typeof apiConfig.endpoints.${name}.params`)};`,\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\n return `${useClientDirective ? \"'use client';\\n\" : \"\"}\nimport { createAPIClient } from '@cushin/api-codegen/client';\nimport type { AuthCallbacks } from '@cushin/api-codegen/client';\nimport { apiConfig } from '${relativePath}';\nimport { z } from 'zod';\n\n// Type the methods based on endpoints\ntype APIClientMethods = {\n [K in keyof typeof apiConfig.endpoints]: (typeof apiConfig.endpoints)[K] extends {\n method: infer M;\n params?: infer P;\n query?: infer Q;\n body?: infer B;\n response: infer R;\n }\n ? M extends \"GET\"\n ? P extends z.ZodJSONSchema\n ? Q extends z.ZodJSONSchema\n ? (params: z.infer<P>, query?: z.infer<Q>) => Promise<z.infer<R>>\n : (params: z.infer<P>) => Promise<z.infer<R>>\n : Q extends z.ZodJSONSchema\n ? (query?: z.infer<Q>) => Promise<z.infer<R>>\n : () => Promise<z.infer<R>>\n : P extends z.ZodJSONSchema\n ? B extends z.ZodJSONSchema\n ? (params: z.infer<P>, body: z.infer<B>) => Promise<z.infer<R>>\n : (params: z.infer<P>) => Promise<z.infer<R>>\n : B extends z.ZodJSONSchema\n ? (body: z.infer<B>) => Promise<z.infer<R>>\n : () => Promise<z.infer<R>>\n : never;\n};\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 return `import { createAPIClient } from '@cushin/api-codegen/client';\nimport { apiConfig } from '../config/endpoints';\nimport type { APIEndpoints } from './types';\n\n// Type-safe API client methods for server-side\ntype APIClientMethods = {\n [K in keyof APIEndpoints]: APIEndpoints[K] extends {\n method: infer M;\n params?: infer P;\n query?: infer Q;\n body?: infer B;\n response: infer R;\n }\n ? M extends 'GET'\n ? P extends { _type: any }\n ? Q extends { _type: any }\n ? (params: P['_type'], query?: Q['_type']) => Promise<R['_type']>\n : (params: P['_type']) => Promise<R['_type']>\n : Q extends { _type: any }\n ? (query?: Q['_type']) => Promise<R['_type']>\n : () => Promise<R['_type']>\n : P extends { _type: any }\n ? B extends { _type: any }\n ? (params: P['_type'], body: B['_type']) => Promise<R['_type']>\n : (params: P['_type']) => Promise<R['_type']>\n : B extends { _type: any }\n ? (body: B['_type']) => Promise<R['_type']>\n : () => Promise<R['_type']>\n : never;\n};\n\n/**\n * Server-side API client (no auth, direct API calls)\n * Use this in Server Components, Server Actions, and Route Handlers\n */\nexport const serverClient = createAPIClient(apiConfig) as APIClientMethods;\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 inferParams = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.params`,\n );\n const inferQuery = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.query`,\n );\n const inferBody = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.body`,\n );\n const inferResponse = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.response`,\n );\n\n if (endpoint.method === \"GET\") {\n if (endpoint.params && endpoint.query) {\n methods.push(` ${name}: (params: ${inferParams}, query?: ${inferQuery}): Promise<${inferResponse}> => \n (baseClient as any).${name}(params, query),`);\n } else if (endpoint.params) {\n methods.push(` ${name}: (params: ${inferParams}): Promise<${inferResponse}> => \n (baseClient as any).${name}(params),`);\n } else if (endpoint.query) {\n methods.push(` ${name}: (query?: ${inferQuery}): Promise<${inferResponse}> => \n (baseClient as any).${name}(query),`);\n } else {\n methods.push(` ${name}: (): Promise<${inferResponse}> => \n (baseClient as any).${name}(),`);\n }\n } else {\n if (endpoint.params && endpoint.body) {\n methods.push(` ${name}: (params: ${inferParams}, body: ${inferBody}): Promise<${inferResponse}> => \n (baseClient as any).${name}(params, body),`);\n } else if (endpoint.params) {\n methods.push(` ${name}: (params: ${inferParams}): Promise<${inferResponse}> => \n (baseClient as any).${name}(params),`);\n } else if (endpoint.body) {\n methods.push(` ${name}: (body: ${inferBody}): Promise<${inferResponse}> => \n (baseClient as any).${name}(body),`);\n } else {\n methods.push(` ${name}: (): Promise<${inferResponse}> => \n (baseClient as any).${name}(),`);\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 content = `// Auto-generated query keys\nimport { z } from 'zod';\nimport { apiConfig } from '../config/endpoints';\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 const inferParams = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.params`,\n );\n const inferQuery = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.query`,\n );\n\n if (endpoint.params || endpoint.query) {\n const params: string[] = [];\n if (endpoint.params) params.push(`params?: ${inferParams}`);\n if (endpoint.query) params.push(`query?: ${inferQuery}`);\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 './api-client';\nimport { queryKeys } from './query-keys';\nimport { z } from 'zod';\nimport { apiConfig } from '../config/endpoints';\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 inferParams = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.params`,\n );\n const inferQuery = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.query`,\n );\n const inferResponse = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.response`,\n );\n\n const params: string[] = [];\n let apiCall = \"\";\n\n if (endpoint.params && endpoint.query) {\n params.push(`params: ${inferParams}`, `filters?: ${inferQuery}`);\n apiCall = `apiClient.${name}(params, filters)`;\n } else if (endpoint.params) {\n params.push(`params: ${inferParams}`);\n apiCall = `apiClient.${name}(params)`;\n } else if (endpoint.query) {\n params.push(`filters?: ${inferQuery}`);\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<${inferResponse}> => ${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 \"../config/schema.js\";\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 { z } from 'zod';\nimport { apiConfig } from '../config/endpoints';\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 const inferParams = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.params`,\n );\n const inferQuery = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.query`,\n );\n\n const params: string[] = [\"queryClient: QueryClient\"];\n const optionParams: string[] = [];\n\n if (endpoint.params) {\n params.push(`params: ${inferParams}`);\n optionParams.push(\"params\");\n }\n if (endpoint.query) {\n params.push(`filters?: ${inferQuery}`);\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 { 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\";\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\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 { createJiti } from 'jiti';\nimport type { APIConfig } from '../config/schema.js';\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 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"]}
|
|
1
|
+
{"version":3,"sources":["../src/config/schema.ts","../src/config/index.ts","../src/runtime/client.ts","../src/generators/base.ts","../src/generators/hooks.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/index.ts","../src/core/codegen.ts"],"names":["path","fs","exports"],"mappings":"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","file":"index.js","sourcesContent":["import type { z } from 'zod';\n\nexport type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n\nexport interface APIEndpoint {\n path: string;\n method: HTTPMethod;\n baseUrl?: string;\n params?: z.ZodType<any>;\n query?: z.ZodType<any>;\n body?: z.ZodType<any>;\n response: z.ZodType<any>;\n tags?: string[];\n description?: string;\n}\n\nexport interface APIConfig {\n baseUrl?: string;\n endpoints: Record<string, APIEndpoint>;\n}\n\nexport type EndpointConfig<\n TPath extends string = string,\n TMethod extends HTTPMethod = HTTPMethod,\n TParams = undefined,\n TQuery = undefined,\n TBody = undefined,\n TResponse = any,\n> = {\n path: TPath;\n method: TMethod;\n baseUrl?: string;\n params?: z.ZodType<TParams>;\n query?: z.ZodType<TQuery>;\n body?: z.ZodType<TBody>;\n response: z.ZodType<TResponse>;\n tags?: string[];\n description?: string;\n};\n\n/**\n * Helper function to define API configuration with type safety\n */\nexport function defineConfig<T extends APIConfig>(config: T): T {\n return config;\n}\n\n/**\n * Helper function to define a single endpoint with type inference\n */\nexport function defineEndpoint<\n TPath extends string,\n TMethod extends HTTPMethod,\n TParams = undefined,\n TQuery = undefined,\n TBody = undefined,\n TResponse = any,\n>(\n config: EndpointConfig<TPath, TMethod, TParams, TQuery, TBody, TResponse>,\n): EndpointConfig<TPath, TMethod, TParams, TQuery, TBody, TResponse> {\n return config;\n}\n\n/**\n * Helper to define multiple endpoints\n */\nexport function defineEndpoints<\n T extends Record<string, APIEndpoint>,\n>(endpoints: T): T {\n return endpoints;\n}\n","import { cosmiconfig } from \"cosmiconfig\";\nimport path from \"path\";\nimport type { APIConfig } from \"./schema.js\";\n\nexport interface UserConfig {\n /**\n * Base URL for API requests\n */\n baseUrl?: 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 ky, { HTTPError } from \"ky\";\nimport type { APIConfig, APIEndpoint } from \"../config/schema.js\";\n\nexport interface AuthTokens {\n accessToken: string;\n refreshToken?: string;\n}\n\nexport interface AuthCallbacks {\n getTokens: () => Promise<AuthTokens | null>;\n onAuthError?: () => void;\n onRefreshToken?: () => Promise<void>;\n}\n\nexport class APIError extends Error {\n constructor(\n message: string,\n public status: number,\n public response?: any,\n ) {\n super(message);\n this.name = \"APIError\";\n }\n}\n\nexport class AuthError extends APIError {\n constructor(message: string = \"Authentication failed\") {\n super(message, 401);\n this.name = \"AuthError\";\n }\n}\n\nexport class APIClient {\n private client: typeof ky;\n private isRefreshing = false;\n private refreshPromise: Promise<void> | null = null;\n private hooks: any;\n\n constructor(\n private config: APIConfig,\n private authCallbacks?: AuthCallbacks,\n ) {\n this.hooks = {\n beforeRequest: [\n async (request: Request) => {\n const tokens = await this.authCallbacks?.getTokens();\n if (tokens?.accessToken) {\n request.headers.set(\n \"Authorization\",\n `Bearer ${tokens.accessToken}`,\n );\n }\n },\n ],\n beforeRetry: [\n async ({ request, error, retryCount }: any) => {\n if (error instanceof HTTPError && error.response.status === 401) {\n if (retryCount === 1 && this.authCallbacks) {\n try {\n await this.refreshTokens();\n const tokens = await this.authCallbacks.getTokens();\n if (tokens?.accessToken) {\n request.headers.set(\n \"Authorization\",\n `Bearer ${tokens.accessToken}`,\n );\n }\n } catch (refreshError) {\n this.authCallbacks.onAuthError?.();\n throw new AuthError();\n }\n } else {\n this.authCallbacks?.onAuthError?.();\n throw new AuthError();\n }\n }\n },\n ],\n beforeError: [\n async (error: any) => {\n const { response } = error;\n if (response?.body) {\n try {\n const body = await response.json();\n error.message =\n (body as Error).message || `HTTP ${response.status}`;\n } catch {\n // Keep original message\n }\n }\n return error;\n },\n ],\n };\n\n this.client = ky.create({\n prefixUrl: this.config.baseUrl,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n retry: {\n limit: 2,\n methods: [\"get\", \"post\", \"put\", \"delete\", \"patch\"],\n statusCodes: [401],\n },\n hooks: this.hooks,\n });\n }\n\n private async refreshTokens(): Promise<void> {\n if (!this.authCallbacks) {\n throw new AuthError(\"No auth callbacks provided\");\n }\n\n if (this.isRefreshing && this.refreshPromise) {\n return this.refreshPromise;\n }\n\n this.isRefreshing = true;\n\n this.refreshPromise = (async () => {\n try {\n if (this.authCallbacks?.onRefreshToken) {\n await this.authCallbacks.onRefreshToken();\n } else {\n throw new AuthError(\"No refresh token handler provided\");\n }\n } catch (error) {\n throw error;\n } finally {\n this.isRefreshing = false;\n this.refreshPromise = null;\n }\n })();\n\n return this.refreshPromise;\n }\n\n private buildPath(path: string, params?: Record<string, any>): string {\n if (!params) return path;\n\n let finalPath = path;\n Object.entries(params).forEach(([key, value]) => {\n finalPath = finalPath.replace(\n `:${key}`,\n encodeURIComponent(String(value)),\n );\n });\n\n return finalPath;\n }\n\n private getEndpointBaseUrl(endpoint: APIEndpoint): string {\n return endpoint.baseUrl || this.config.baseUrl!;\n }\n\n private getClientForEndpoint(endpoint: APIEndpoint): typeof ky {\n const endpointBaseUrl = this.getEndpointBaseUrl(endpoint);\n\n if (endpointBaseUrl === this.config.baseUrl) {\n return this.client;\n }\n\n return ky.create({\n prefixUrl: endpointBaseUrl,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n retry: {\n limit: 2,\n methods: [\"get\", \"post\", \"put\", \"delete\", \"patch\"],\n statusCodes: [401],\n },\n hooks: this.hooks,\n });\n }\n\n async request<T>(\n endpoint: APIEndpoint,\n params?: Record<string, any>,\n query?: Record<string, any>,\n body?: any,\n ): Promise<T> {\n try {\n const path = this.buildPath(endpoint.path, params);\n const client = this.getClientForEndpoint(endpoint);\n\n const options: Record<string, any> = {\n method: endpoint.method,\n };\n\n if (query && Object.keys(query).length > 0) {\n const searchParams = new URLSearchParams();\n Object.entries(query).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n });\n if (searchParams.toString()) {\n options.searchParams = searchParams;\n }\n }\n\n if (body && endpoint.method !== \"GET\") {\n if (endpoint.body) {\n const validatedBody = endpoint.body.parse(body);\n options.json = validatedBody;\n } else {\n options.json = body;\n }\n }\n\n const response = await client(path, options);\n const data = await response.json();\n\n if (endpoint.response) {\n return endpoint.response.parse(data);\n }\n\n return data as T;\n } catch (error) {\n if (error instanceof HTTPError) {\n const errorData = await error.response.json().catch(() => ({}));\n throw new APIError(\n errorData.message || error.message,\n error.response.status,\n errorData,\n );\n }\n\n if (error instanceof AuthError) {\n throw error;\n }\n\n throw new APIError(\n error instanceof Error ? error.message : \"Network error\",\n 0,\n );\n }\n }\n\n updateAuthCallbacks(authCallbacks: AuthCallbacks) {\n this.authCallbacks = authCallbacks;\n }\n\n async refreshAuth(): Promise<void> {\n if (!this.authCallbacks) {\n throw new AuthError(\"No auth callbacks provided\");\n }\n await this.refreshTokens();\n }\n\n generateMethods() {\n const methods: any = {};\n\n Object.entries(this.config.endpoints).forEach(([name, endpoint]) => {\n if (endpoint.method === \"GET\") {\n if (endpoint.params && endpoint.query) {\n methods[name] = (params: any, query?: any): Promise<any> => {\n return this.request(endpoint, params, query);\n };\n } else if (endpoint.params) {\n methods[name] = (params: any): Promise<any> => {\n return this.request(endpoint, params);\n };\n } else if (endpoint.query) {\n methods[name] = (query?: any): Promise<any> => {\n return this.request(endpoint, undefined, query);\n };\n } else {\n methods[name] = (): Promise<any> => {\n return this.request(endpoint);\n };\n }\n } else {\n if (endpoint.params && endpoint.body) {\n methods[name] = (params: any, body: any): Promise<any> => {\n return this.request(endpoint, params, undefined, body);\n };\n } else if (endpoint.params) {\n methods[name] = (params: any): Promise<any> => {\n return this.request(endpoint, params);\n };\n } else if (endpoint.body) {\n methods[name] = (body: any): Promise<any> => {\n return this.request(endpoint, undefined, undefined, body);\n };\n } else {\n methods[name] = (): Promise<any> => {\n return this.request(endpoint);\n };\n }\n }\n });\n\n return methods;\n }\n}\n\nexport function createAPIClient(\n config: APIConfig,\n authCallbacks?: AuthCallbacks,\n) {\n const instance = new APIClient(config, authCallbacks);\n const methods = instance.generateMethods();\n\n return {\n ...methods,\n refreshAuth: () => instance.refreshAuth(),\n updateAuthCallbacks: (newCallbacks: AuthCallbacks) =>\n instance.updateAuthCallbacks(newCallbacks),\n };\n}\n","import type { APIConfig, APIEndpoint } from \"../config/schema.js\";\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 ? `ExtractParams<APIEndpoints['${name}']>` : \"never\",\n queryType: hasQuery ? `ExtractQuery<APIEndpoints['${name}']>` : \"never\",\n bodyType: hasBody ? `ExtractBody<APIEndpoints['${name}']>` : \"never\",\n responseType: `ExtractResponse<APIEndpoints['${name}']>`,\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","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"../config/schema.js\";\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 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\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 { z } from \"zod\";\nimport { apiConfig } from \"${relativePath}\";\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 const inferParams = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.params`,\n );\n const inferQuery = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.query`,\n );\n const inferResponse = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.response`,\n );\n\n const params: string[] = [];\n const optionParams: string[] = [];\n\n const queryTags = this.getQueryTags(endpoint);\n\n if (endpoint.params) {\n params.push(`params: ${inferParams}`);\n optionParams.push(\"params\");\n }\n if (endpoint.query) {\n params.push(`filters?: ${inferQuery}`);\n optionParams.push(\"filters\");\n }\n\n params.push(`options?: {\n enabled?: boolean;\n select?: <TData = ${inferResponse}>(data: ${inferResponse}) => 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 const inferParams = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.params`,\n );\n const inferBody = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.body`,\n );\n const inferResponse = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.response`,\n );\n\n const resourceHasQueries = this.resourceHasQueryEndpoints(resource);\n\n let inputType: string;\n let fnBody: string;\n\n if (endpoint.params && endpoint.body) {\n inputType = `{ params: ${inferParams}; body: ${inferBody}; }`;\n fnBody = `({ params, body }: ${inputType}) => apiClient.${name}(params, body)`;\n } else if (endpoint.params) {\n inputType = `${inferParams}`;\n fnBody = `(params: ${inputType}) => apiClient.${name}(params)`;\n } else if (endpoint.body) {\n inputType = `${inferBody}`;\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 */\n export function ${hookName}(options?: {\n onSuccess?: (data: ${inferResponse}, variables: ${inputType}, context: unknown) => void;\n onError?: (error: Error, variables: ${inputType}, context: unknown) => void;\n onSettled?: (data: ${inferResponse} | 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\tmutationFn: ${fnBody},\n\tonSuccess: (data, variables, context) => {\n\t ${invalidate}\n\t options?.onSuccess?.(data, variables, context);\n\t},\n\tonError: options?.onError,\n\tonSettled: options?.onSettled,\n\tonMutate: options?.onMutate,\n });\n }`;\n }\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport { BaseGenerator } from './base.js';\nimport type { APIEndpoint } from '../config/schema';\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 { \n APIEndpoints, \n ExtractBody, \n ExtractParams, \n ExtractResponse \n} 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(([name, endpoint]) => {\n if (this.isMutationEndpoint(endpoint)) {\n actions.push(this.generateServerAction(name, endpoint));\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 signature = this.getEndpointSignature(name, endpoint);\n const invalidationTags = this.getInvalidationTags(endpoint);\n\n let inputType = '';\n let inputParam = '';\n if (signature.hasParams && signature.hasBody) {\n inputType = `input: { params: ${signature.paramType}; body: ${signature.bodyType} }`;\n inputParam = 'input';\n } else if (signature.hasParams) {\n inputType = `params: ${signature.paramType}`;\n inputParam = 'params';\n } else if (signature.hasBody) {\n inputType = `body: ${signature.bodyType}`;\n inputParam = 'body';\n }\n\n const revalidateStatements = invalidationTags.length > 0\n ? invalidationTags\n .map((tag) => ` revalidateTag('${tag}');`)\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<${signature.responseType}>> {\n try {\n const result = await serverClient.${name}(${inputParam ? inputParam : ''});\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 \"../config/schema.js\";\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 { \n APIEndpoints, \n ExtractParams, \n ExtractQuery, \n ExtractResponse \n} 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 signature = this.getEndpointSignature(name, endpoint);\n const queryTags = this.getQueryTags(endpoint);\n\n const paramDef = signature.hasParams\n ? `params: ${signature.paramType}`\n : \"\";\n const queryDef = signature.hasQuery ? `query?: ${signature.queryType}` : \"\";\n const paramsList = [paramDef, queryDef].filter(Boolean).join(\",\\n \");\n\n const clientCallArgs: string[] = [];\n if (signature.hasParams) clientCallArgs.push(\"params\");\n if (signature.hasQuery) clientCallArgs.push(\"query\");\n\n // Generate cache key based on params\n const cacheKeyParts: string[] = [`'${name}'`];\n if (signature.hasParams) cacheKeyParts.push(\"JSON.stringify(params)\");\n if (signature.hasQuery) cacheKeyParts.push(\"JSON.stringify(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<${signature.responseType}> => {\n return unstable_cache(\n async () => serverClient.${name}(${clientCallArgs.join(\", \")}),\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 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-codegen/schema';\n\n/**\n * Type helper to extract params schema from an endpoint\n */\nexport type ExtractParams<T> = T extends { params: infer P extends z.ZodType }\n ? z.infer<P>\n : never;\n\n/**\n * Type helper to extract query schema from an endpoint\n */\nexport type ExtractQuery<T> = T extends { query: infer Q extends z.ZodType }\n ? z.infer<Q>\n : never;\n\n/**\n * Type helper to extract body schema from an endpoint\n */\nexport type ExtractBody<T> = T extends { body: infer B extends z.ZodType }\n ? z.infer<B>\n : never;\n\n/**\n * Type helper to extract response schema from an endpoint\n */\nexport type ExtractResponse<T> = T extends { response: infer R extends z.ZodType }\n ? z.infer<R>\n : never;\n\n/**\n * Import your API config to get typed endpoints\n * \n */\nexport type APIEndpoints = typeof apiConfig.endpoints;\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 if (endpoint.response)\n types.push(\n `export type ${cap}Response = ${this.inferNonNull(`typeof apiConfig.endpoints.${name}.response`)};`,\n );\n if (endpoint.body)\n types.push(\n `export type ${cap}Input = ${this.inferNonNull(`typeof apiConfig.endpoints.${name}.body`)};`,\n );\n if (endpoint.query)\n types.push(\n `export type ${cap}Query = ${this.inferNonNull(`typeof apiConfig.endpoints.${name}.query`)};`,\n );\n if (endpoint.params)\n types.push(\n `export type ${cap}Params = ${this.inferNonNull(`typeof apiConfig.endpoints.${name}.params`)};`,\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\n return `${useClientDirective ? \"'use client';\\n\" : \"\"}\nimport { createAPIClient } from '@cushin/api-codegen/client';\nimport type { AuthCallbacks } from '@cushin/api-codegen/client';\nimport { apiConfig } from '${relativePath}';\nimport { z } from 'zod';\n\n// Type the methods based on endpoints\ntype APIClientMethods = {\n [K in keyof typeof apiConfig.endpoints]: (typeof apiConfig.endpoints)[K] extends {\n method: infer M;\n params?: infer P;\n query?: infer Q;\n body?: infer B;\n response: infer R;\n }\n ? M extends \"GET\"\n ? P extends z.ZodJSONSchema\n ? Q extends z.ZodJSONSchema\n ? (params: z.infer<P>, query?: z.infer<Q>) => Promise<z.infer<R>>\n : (params: z.infer<P>) => Promise<z.infer<R>>\n : Q extends z.ZodJSONSchema\n ? (query?: z.infer<Q>) => Promise<z.infer<R>>\n : () => Promise<z.infer<R>>\n : P extends z.ZodJSONSchema\n ? B extends z.ZodJSONSchema\n ? (params: z.infer<P>, body: z.infer<B>) => Promise<z.infer<R>>\n : (params: z.infer<P>) => Promise<z.infer<R>>\n : B extends z.ZodJSONSchema\n ? (body: z.infer<B>) => Promise<z.infer<R>>\n : () => Promise<z.infer<R>>\n : never;\n};\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 return `import { createAPIClient } from '@cushin/api-codegen/client';\nimport { apiConfig } from '../config/endpoints';\nimport type { APIEndpoints } from './types';\n\n// Type-safe API client methods for server-side\ntype APIClientMethods = {\n [K in keyof APIEndpoints]: APIEndpoints[K] extends {\n method: infer M;\n params?: infer P;\n query?: infer Q;\n body?: infer B;\n response: infer R;\n }\n ? M extends 'GET'\n ? P extends { _type: any }\n ? Q extends { _type: any }\n ? (params: P['_type'], query?: Q['_type']) => Promise<R['_type']>\n : (params: P['_type']) => Promise<R['_type']>\n : Q extends { _type: any }\n ? (query?: Q['_type']) => Promise<R['_type']>\n : () => Promise<R['_type']>\n : P extends { _type: any }\n ? B extends { _type: any }\n ? (params: P['_type'], body: B['_type']) => Promise<R['_type']>\n : (params: P['_type']) => Promise<R['_type']>\n : B extends { _type: any }\n ? (body: B['_type']) => Promise<R['_type']>\n : () => Promise<R['_type']>\n : never;\n};\n\n/**\n * Server-side API client (no auth, direct API calls)\n * Use this in Server Components, Server Actions, and Route Handlers\n */\nexport const serverClient = createAPIClient(apiConfig) as APIClientMethods;\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 inferParams = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.params`,\n );\n const inferQuery = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.query`,\n );\n const inferBody = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.body`,\n );\n const inferResponse = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.response`,\n );\n\n if (endpoint.method === \"GET\") {\n if (endpoint.params && endpoint.query) {\n methods.push(` ${name}: (params: ${inferParams}, query?: ${inferQuery}): Promise<${inferResponse}> => \n (baseClient as any).${name}(params, query),`);\n } else if (endpoint.params) {\n methods.push(` ${name}: (params: ${inferParams}): Promise<${inferResponse}> => \n (baseClient as any).${name}(params),`);\n } else if (endpoint.query) {\n methods.push(` ${name}: (query?: ${inferQuery}): Promise<${inferResponse}> => \n (baseClient as any).${name}(query),`);\n } else {\n methods.push(` ${name}: (): Promise<${inferResponse}> => \n (baseClient as any).${name}(),`);\n }\n } else {\n if (endpoint.params && endpoint.body) {\n methods.push(` ${name}: (params: ${inferParams}, body: ${inferBody}): Promise<${inferResponse}> => \n (baseClient as any).${name}(params, body),`);\n } else if (endpoint.params) {\n methods.push(` ${name}: (params: ${inferParams}): Promise<${inferResponse}> => \n (baseClient as any).${name}(params),`);\n } else if (endpoint.body) {\n methods.push(` ${name}: (body: ${inferBody}): Promise<${inferResponse}> => \n (baseClient as any).${name}(body),`);\n } else {\n methods.push(` ${name}: (): Promise<${inferResponse}> => \n (baseClient as any).${name}(),`);\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 const content = `// Auto-generated query keys\nimport { z } from 'zod';\nimport { apiConfig } from '${relativePath}';\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 const inferParams = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.params`,\n );\n const inferQuery = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.query`,\n );\n\n if (endpoint.params || endpoint.query) {\n const params: string[] = [];\n if (endpoint.params) params.push(`params?: ${inferParams}`);\n if (endpoint.query) params.push(`query?: ${inferQuery}`);\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 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 const content = `// Auto-generated query options\nimport { queryOptions } from '@tanstack/react-query';\nimport { apiClient } from './client';\nimport { queryKeys } from './query-keys';\nimport { z } from 'zod';\nimport { apiConfig } from '${relativePath}';\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 inferParams = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.params`,\n );\n const inferQuery = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.query`,\n );\n const inferResponse = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.response`,\n );\n\n const params: string[] = [];\n let apiCall = \"\";\n\n if (endpoint.params && endpoint.query) {\n params.push(`params: ${inferParams}`, `filters?: ${inferQuery}`);\n apiCall = `apiClient.${name}(params, filters)`;\n } else if (endpoint.params) {\n params.push(`params: ${inferParams}`);\n apiCall = `apiClient.${name}(params)`;\n } else if (endpoint.query) {\n params.push(`filters?: ${inferQuery}`);\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<${inferResponse}> => ${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 \"../config/schema.js\";\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 { z } from 'zod';\nimport { apiConfig } from '../config/endpoints';\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 const inferParams = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.params`,\n );\n const inferQuery = this.inferNonNull(\n `typeof apiConfig.endpoints.${name}.query`,\n );\n\n const params: string[] = [\"queryClient: QueryClient\"];\n const optionParams: string[] = [];\n\n if (endpoint.params) {\n params.push(`params: ${inferParams}`);\n optionParams.push(\"params\");\n }\n if (endpoint.query) {\n params.push(`filters?: ${inferQuery}`);\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 { 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\";\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\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 { createJiti } from 'jiti';\nimport type { APIConfig } from '../config/schema.js';\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 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"]}
|
package/package.json
CHANGED