@cushin/api-codegen 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -31,9 +31,9 @@ npm install @tanstack/react-query
31
31
  ### 1. Initialize Configuration
32
32
 
33
33
  ```bash
34
- npx api-codegen init --provider vite
34
+ npx @cushin/api-codegen init --provider vite
35
35
  # or for Next.js
36
- npx api-codegen init --provider nextjs
36
+ npx @cushin/api-codegen init --provider nextjs
37
37
  ```
38
38
 
39
39
  This creates `api-codegen.config.js`:
@@ -131,7 +131,7 @@ export const apiConfig = defineConfig({
131
131
  ### 3. Generate Code
132
132
 
133
133
  ```bash
134
- npx api-codegen generate
134
+ npx @cushin/api-codegen generate
135
135
  ```
136
136
 
137
137
  This generates:
@@ -321,16 +321,16 @@ export default {
321
321
 
322
322
  ```bash
323
323
  # Generate code from config
324
- npx api-codegen generate
324
+ npx @cushin/api-codegen generate
325
325
 
326
326
  # Generate with specific config file
327
- npx api-codegen generate --config ./custom.config.js
327
+ npx @cushin/api-codegen generate --config ./custom.config.js
328
328
 
329
329
  # Initialize new config
330
- npx api-codegen init --provider nextjs
330
+ npx @cushin/api-codegen init --provider nextjs
331
331
 
332
332
  # Validate configuration
333
- npx api-codegen validate
333
+ npx @cushin/api-codegen validate
334
334
  ```
335
335
 
336
336
  ## Advanced Usage
package/dist/cli.js CHANGED
@@ -670,7 +670,7 @@ program.command("init").description("Initialize a new api-codegen configuration"
670
670
  );
671
671
  console.log(chalk.dim("\nNext steps:"));
672
672
  console.log(chalk.dim(" 1. Update the endpoints path in the config"));
673
- console.log(chalk.dim(" 2. Run: npx api-codegen generate"));
673
+ console.log(chalk.dim(" 2. Run: npx @cushin/api-codegen generate"));
674
674
  } catch (error) {
675
675
  spinner.fail(chalk.red("Failed to create configuration file"));
676
676
  console.error(
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/index.ts","../src/core/codegen.ts","../src/cli.ts"],"names":["path","fs","pathToFileURL"],"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 * 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 ??\n (userConfig.provider === 'nextjs');\n const generateServerQueries =\n userConfig.generateServerQueries ??\n (userConfig.provider === 'nextjs');\n const generateClient = userConfig.generateClient ?? true;\n\n return {\n ...userConfig,\n rootDir,\n endpointsPath,\n outputDir,\n generateHooks,\n generateServerActions,\n generateServerQueries,\n generateClient,\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('Config error: \"provider\" must be specified (vite or nextjs)');\n }\n\n if (!['vite', 'nextjs'].includes(config.provider)) {\n throw new Error('Config error: \"provider\" must be either \"vite\" or \"nextjs\"');\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\n ? `ExtractParams<APIEndpoints['${name}']>`\n : 'never',\n queryType: hasQuery\n ? `ExtractQuery<APIEndpoints['${name}']>`\n : '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","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 = this.context.config.options?.useClientDirective ?? true;\n \n const imports = `${useClientDirective ? \"'use client';\\n\" : ''}\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport type { \n UseQueryOptions, \n UseMutationOptions,\n QueryKey \n} from '@tanstack/react-query';\nimport { apiClient } from './client';\nimport type { \n APIEndpoints, \n ExtractBody, \n ExtractParams, \n ExtractQuery, \n ExtractResponse \n} from './types';\n`;\n\n const hooks: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(([name, endpoint]) => {\n if (this.isQueryEndpoint(endpoint)) {\n hooks.push(this.generateQueryHook(name, endpoint));\n } else {\n hooks.push(this.generateMutationHook(name, endpoint));\n }\n });\n\n return imports + '\\n' + hooks.join('\\n\\n');\n }\n\n private generateQueryHook(name: string, endpoint: APIEndpoint): string {\n const hookPrefix = this.context.config.options?.hookPrefix || 'use';\n const hookName = `${hookPrefix}${this.capitalize(name)}`;\n const signature = this.getEndpointSignature(name, endpoint);\n const queryTags = this.getQueryTags(endpoint);\n\n const paramDef = signature.hasParams ? `params: ${signature.paramType}` : '';\n const queryDef = signature.hasQuery ? `query?: ${signature.queryType}` : '';\n const optionsDef = `options?: Omit<UseQueryOptions<${signature.responseType}, Error, ${signature.responseType}, QueryKey>, 'queryKey' | 'queryFn'>`;\n\n const paramsList = [paramDef, queryDef, optionsDef]\n .filter(Boolean)\n .join(',\\n ');\n\n const queryKeyParts = [\n ...queryTags.map((tag) => `'${tag}'`),\n signature.hasParams ? 'params' : 'undefined',\n signature.hasQuery ? 'query' : 'undefined',\n ];\n\n const clientCallArgs: string[] = [];\n if (signature.hasParams) clientCallArgs.push('params');\n if (signature.hasQuery) clientCallArgs.push('query');\n\n return `/**\n * ${endpoint.description || `Query hook for ${name}`}\n * @tags ${queryTags.join(', ') || 'none'}\n */\nexport function ${hookName}(\n ${paramsList}\n) {\n return useQuery({\n queryKey: [${queryKeyParts.join(', ')}] as const,\n queryFn: () => apiClient.${name}(${clientCallArgs.join(', ')}),\n ...options,\n });\n}`;\n }\n\n private generateMutationHook(name: string, endpoint: APIEndpoint): string {\n const hookPrefix = this.context.config.options?.hookPrefix || 'use';\n const hookName = `${hookPrefix}${this.capitalize(name)}`;\n const signature = this.getEndpointSignature(name, endpoint);\n const invalidationTags = this.getInvalidationTags(endpoint);\n\n let inputType = 'void';\n if (signature.hasParams && signature.hasBody) {\n inputType = `{ params: ${signature.paramType}; body: ${signature.bodyType} }`;\n } else if (signature.hasParams) {\n inputType = signature.paramType;\n } else if (signature.hasBody) {\n inputType = signature.bodyType;\n }\n\n const invalidationQueries = invalidationTags.length > 0\n ? invalidationTags\n .map((tag) => ` queryClient.invalidateQueries({ queryKey: ['${tag}'] });`)\n .join('\\n')\n : ' // No automatic invalidations';\n\n return `/**\n * ${endpoint.description || `Mutation hook for ${name}`}\n * @tags ${endpoint.tags?.join(', ') || 'none'}\n */\nexport function ${hookName}(\n options?: Omit<UseMutationOptions<${signature.responseType}, Error, ${inputType}>, 'mutationFn'>\n) {\n const queryClient = useQueryClient();\n \n return useMutation({\n mutationFn: ${inputType === 'void' ? '() => {' : '(input) => {'}\n ${this.generateMutationCall(name, signature.hasParams, signature.hasBody)}\n },\n onSuccess: (data, variables, context) => {\n // Invalidate related queries\n${invalidationQueries}\n \n // Call user's onSuccess if provided\n options?.onSuccess?.(data, variables, context);\n },\n ...options,\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(([name, endpoint]) => {\n if (this.isQueryEndpoint(endpoint)) {\n queries.push(this.generateServerQuery(name, endpoint));\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 ? `params: ${signature.paramType}` : '';\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[] = [\n `'${name}'`,\n ];\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 return `// Auto-generated type definitions\n// Do not edit this file manually\n\nimport type { z } from 'zod';\n\n// Re-export endpoint configuration types\nexport type { APIConfig, APIEndpoint, HTTPMethod } from '@vietbus/api-codegen/config';\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 * @example\n * import { apiConfig } from './config/endpoints';\n * export type APIEndpoints = typeof apiConfig.endpoints;\n */\nexport type APIEndpoints = Record<string, any>;\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(this.context.config.outputDir, 'server-client.ts');\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 = this.context.config.options?.useClientDirective ?? true;\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 '../config/endpoints';\nimport type { APIEndpoints } from './types';\n\n// Type-safe API client methods\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// Export singleton instance (will be initialized later)\nexport let apiClient: APIClientMethods & {\n refreshAuth: () => Promise<void>;\n updateAuthCallbacks: (callbacks: AuthCallbacks) => void;\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 * setTokens: (tokens) => storeTokens(tokens),\n * clearTokens: () => clearStoredTokens(),\n * onAuthError: () => router.push('/login'),\n * onRefreshToken: async () => {\n * const newToken = await refreshAccessToken();\n * return newToken;\n * },\n * };\n * \n * initializeAPIClient(authCallbacks);\n */\nexport const initializeAPIClient = (authCallbacks: AuthCallbacks) => {\n apiClient = createAPIClient(apiConfig, authCallbacks) as any;\n return apiClient;\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","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';\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 HooksGenerator(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 { pathToFileURL } from 'url';\nimport type { APIConfig } from '../config/schema.js';\nimport type { ResolvedConfig } from '../config/index.js';\nimport { CodeGenerator } from '../generators/index.js';\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 const fileUrl = pathToFileURL(this.config.endpointsPath).href;\n const module = await import(fileUrl);\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 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/index.ts","../src/core/codegen.ts","../src/cli.ts"],"names":["path","fs","pathToFileURL"],"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 * 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 ??\n (userConfig.provider === 'nextjs');\n const generateServerQueries =\n userConfig.generateServerQueries ??\n (userConfig.provider === 'nextjs');\n const generateClient = userConfig.generateClient ?? true;\n\n return {\n ...userConfig,\n rootDir,\n endpointsPath,\n outputDir,\n generateHooks,\n generateServerActions,\n generateServerQueries,\n generateClient,\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('Config error: \"provider\" must be specified (vite or nextjs)');\n }\n\n if (!['vite', 'nextjs'].includes(config.provider)) {\n throw new Error('Config error: \"provider\" must be either \"vite\" or \"nextjs\"');\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\n ? `ExtractParams<APIEndpoints['${name}']>`\n : 'never',\n queryType: hasQuery\n ? `ExtractQuery<APIEndpoints['${name}']>`\n : '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","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 = this.context.config.options?.useClientDirective ?? true;\n \n const imports = `${useClientDirective ? \"'use client';\\n\" : ''}\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport type { \n UseQueryOptions, \n UseMutationOptions,\n QueryKey \n} from '@tanstack/react-query';\nimport { apiClient } from './client';\nimport type { \n APIEndpoints, \n ExtractBody, \n ExtractParams, \n ExtractQuery, \n ExtractResponse \n} from './types';\n`;\n\n const hooks: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(([name, endpoint]) => {\n if (this.isQueryEndpoint(endpoint)) {\n hooks.push(this.generateQueryHook(name, endpoint));\n } else {\n hooks.push(this.generateMutationHook(name, endpoint));\n }\n });\n\n return imports + '\\n' + hooks.join('\\n\\n');\n }\n\n private generateQueryHook(name: string, endpoint: APIEndpoint): string {\n const hookPrefix = this.context.config.options?.hookPrefix || 'use';\n const hookName = `${hookPrefix}${this.capitalize(name)}`;\n const signature = this.getEndpointSignature(name, endpoint);\n const queryTags = this.getQueryTags(endpoint);\n\n const paramDef = signature.hasParams ? `params: ${signature.paramType}` : '';\n const queryDef = signature.hasQuery ? `query?: ${signature.queryType}` : '';\n const optionsDef = `options?: Omit<UseQueryOptions<${signature.responseType}, Error, ${signature.responseType}, QueryKey>, 'queryKey' | 'queryFn'>`;\n\n const paramsList = [paramDef, queryDef, optionsDef]\n .filter(Boolean)\n .join(',\\n ');\n\n const queryKeyParts = [\n ...queryTags.map((tag) => `'${tag}'`),\n signature.hasParams ? 'params' : 'undefined',\n signature.hasQuery ? 'query' : 'undefined',\n ];\n\n const clientCallArgs: string[] = [];\n if (signature.hasParams) clientCallArgs.push('params');\n if (signature.hasQuery) clientCallArgs.push('query');\n\n return `/**\n * ${endpoint.description || `Query hook for ${name}`}\n * @tags ${queryTags.join(', ') || 'none'}\n */\nexport function ${hookName}(\n ${paramsList}\n) {\n return useQuery({\n queryKey: [${queryKeyParts.join(', ')}] as const,\n queryFn: () => apiClient.${name}(${clientCallArgs.join(', ')}),\n ...options,\n });\n}`;\n }\n\n private generateMutationHook(name: string, endpoint: APIEndpoint): string {\n const hookPrefix = this.context.config.options?.hookPrefix || 'use';\n const hookName = `${hookPrefix}${this.capitalize(name)}`;\n const signature = this.getEndpointSignature(name, endpoint);\n const invalidationTags = this.getInvalidationTags(endpoint);\n\n let inputType = 'void';\n if (signature.hasParams && signature.hasBody) {\n inputType = `{ params: ${signature.paramType}; body: ${signature.bodyType} }`;\n } else if (signature.hasParams) {\n inputType = signature.paramType;\n } else if (signature.hasBody) {\n inputType = signature.bodyType;\n }\n\n const invalidationQueries = invalidationTags.length > 0\n ? invalidationTags\n .map((tag) => ` queryClient.invalidateQueries({ queryKey: ['${tag}'] });`)\n .join('\\n')\n : ' // No automatic invalidations';\n\n return `/**\n * ${endpoint.description || `Mutation hook for ${name}`}\n * @tags ${endpoint.tags?.join(', ') || 'none'}\n */\nexport function ${hookName}(\n options?: Omit<UseMutationOptions<${signature.responseType}, Error, ${inputType}>, 'mutationFn'>\n) {\n const queryClient = useQueryClient();\n \n return useMutation({\n mutationFn: ${inputType === 'void' ? '() => {' : '(input) => {'}\n ${this.generateMutationCall(name, signature.hasParams, signature.hasBody)}\n },\n onSuccess: (data, variables, context) => {\n // Invalidate related queries\n${invalidationQueries}\n \n // Call user's onSuccess if provided\n options?.onSuccess?.(data, variables, context);\n },\n ...options,\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(([name, endpoint]) => {\n if (this.isQueryEndpoint(endpoint)) {\n queries.push(this.generateServerQuery(name, endpoint));\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 ? `params: ${signature.paramType}` : '';\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[] = [\n `'${name}'`,\n ];\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 return `// Auto-generated type definitions\n// Do not edit this file manually\n\nimport type { z } from 'zod';\n\n// Re-export endpoint configuration types\nexport type { APIConfig, APIEndpoint, HTTPMethod } from '@vietbus/api-codegen/config';\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 * @example\n * import { apiConfig } from './config/endpoints';\n * export type APIEndpoints = typeof apiConfig.endpoints;\n */\nexport type APIEndpoints = Record<string, any>;\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(this.context.config.outputDir, 'server-client.ts');\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 = this.context.config.options?.useClientDirective ?? true;\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 '../config/endpoints';\nimport type { APIEndpoints } from './types';\n\n// Type-safe API client methods\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// Export singleton instance (will be initialized later)\nexport let apiClient: APIClientMethods & {\n refreshAuth: () => Promise<void>;\n updateAuthCallbacks: (callbacks: AuthCallbacks) => void;\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 * setTokens: (tokens) => storeTokens(tokens),\n * clearTokens: () => clearStoredTokens(),\n * onAuthError: () => router.push('/login'),\n * onRefreshToken: async () => {\n * const newToken = await refreshAccessToken();\n * return newToken;\n * },\n * };\n * \n * initializeAPIClient(authCallbacks);\n */\nexport const initializeAPIClient = (authCallbacks: AuthCallbacks) => {\n apiClient = createAPIClient(apiConfig, authCallbacks) as any;\n return apiClient;\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","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';\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 HooksGenerator(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 { pathToFileURL } from 'url';\nimport type { APIConfig } from '../config/schema.js';\nimport type { ResolvedConfig } from '../config/index.js';\nimport { CodeGenerator } from '../generators/index.js';\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 const fileUrl = pathToFileURL(this.config.endpointsPath).href;\n const module = await import(fileUrl);\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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cushin/api-codegen",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Type-safe API client generator for React/Next.js with automatic hooks and server actions generation",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -36,6 +36,7 @@
36
36
  "LICENSE"
37
37
  ],
38
38
  "scripts": {
39
+ "version": "conventional-changelog -p angular && git add CHANGELOG.md",
39
40
  "build": "tsup",
40
41
  "dev": "tsup --watch",
41
42
  "typecheck": "tsc --noEmit",
@@ -78,6 +79,8 @@
78
79
  "dependencies": {
79
80
  "chalk": "^5.3.0",
80
81
  "commander": "^12.0.0",
82
+ "conventional-changelog": "^7.1.1",
83
+ "conventional-changelog-angular": "^8.1.0",
81
84
  "cosmiconfig": "^9.0.0",
82
85
  "fast-glob": "^3.3.2",
83
86
  "ora": "^8.0.0"