@cushin/api-codegen 2.0.3 → 2.0.5
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 +76 -37
- package/dist/cli.js.map +1 -1
- package/dist/index.js +74 -35
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/cli.js
CHANGED
|
@@ -355,16 +355,16 @@ export type ActionResult<T> =
|
|
|
355
355
|
const signature = this.getEndpointSignature(name, endpoint);
|
|
356
356
|
const invalidationTags = this.getInvalidationTags(endpoint);
|
|
357
357
|
let inputType = "";
|
|
358
|
-
let
|
|
358
|
+
let callArgs = "";
|
|
359
359
|
if (signature.hasParams && signature.hasBody) {
|
|
360
360
|
inputType = `input: { params: ${signature.paramType}; body: ${signature.bodyType} }`;
|
|
361
|
-
|
|
361
|
+
callArgs = "input.params, input.body";
|
|
362
362
|
} else if (signature.hasParams) {
|
|
363
363
|
inputType = `params: ${signature.paramType}`;
|
|
364
|
-
|
|
364
|
+
callArgs = "params";
|
|
365
365
|
} else if (signature.hasBody) {
|
|
366
366
|
inputType = `body: ${signature.bodyType}`;
|
|
367
|
-
|
|
367
|
+
callArgs = "body";
|
|
368
368
|
}
|
|
369
369
|
const revalidateStatements = invalidationTags.length > 0 ? invalidationTags.map((tag) => ` revalidateTag('${tag}');`).join("\n") : " // No automatic revalidations";
|
|
370
370
|
return `/**
|
|
@@ -375,17 +375,17 @@ export async function ${actionName}(
|
|
|
375
375
|
${inputType}
|
|
376
376
|
): Promise<ActionResult<${signature.responseType}>> {
|
|
377
377
|
try {
|
|
378
|
-
const result = await serverClient.${name}(${
|
|
379
|
-
|
|
378
|
+
const result = await serverClient.${name}(${callArgs});
|
|
379
|
+
|
|
380
380
|
// Revalidate related data
|
|
381
381
|
${revalidateStatements}
|
|
382
|
-
|
|
382
|
+
|
|
383
383
|
return { success: true, data: result };
|
|
384
384
|
} catch (error) {
|
|
385
385
|
console.error('[Server Action Error]:', error);
|
|
386
|
-
return {
|
|
387
|
-
success: false,
|
|
388
|
-
error: error instanceof Error ? error.message : 'Unknown error'
|
|
386
|
+
return {
|
|
387
|
+
success: false,
|
|
388
|
+
error: error instanceof Error ? error.message : 'Unknown error'
|
|
389
389
|
};
|
|
390
390
|
}
|
|
391
391
|
}`;
|
|
@@ -430,12 +430,19 @@ import type {
|
|
|
430
430
|
const paramDef = signature.hasParams ? `params: ${signature.paramType}` : "";
|
|
431
431
|
const queryDef = signature.hasQuery ? `query?: ${signature.queryType}` : "";
|
|
432
432
|
const paramsList = [paramDef, queryDef].filter(Boolean).join(",\n ");
|
|
433
|
-
|
|
434
|
-
if (signature.hasParams
|
|
435
|
-
|
|
433
|
+
let clientCall = "";
|
|
434
|
+
if (signature.hasParams && signature.hasQuery) {
|
|
435
|
+
clientCall = `serverClient.${name}(params, query)`;
|
|
436
|
+
} else if (signature.hasParams) {
|
|
437
|
+
clientCall = `serverClient.${name}(params)`;
|
|
438
|
+
} else if (signature.hasQuery) {
|
|
439
|
+
clientCall = `serverClient.${name}(query)`;
|
|
440
|
+
} else {
|
|
441
|
+
clientCall = `serverClient.${name}()`;
|
|
442
|
+
}
|
|
436
443
|
const cacheKeyParts = [`'${name}'`];
|
|
437
444
|
if (signature.hasParams) cacheKeyParts.push("JSON.stringify(params)");
|
|
438
|
-
if (signature.hasQuery) cacheKeyParts.push("JSON.stringify(query)");
|
|
445
|
+
if (signature.hasQuery) cacheKeyParts.push("query ? JSON.stringify(query) : 'no-query'");
|
|
439
446
|
return `/**
|
|
440
447
|
* ${endpoint.description || `Server query for ${name}`}
|
|
441
448
|
* @tags ${queryTags.join(", ") || "none"}
|
|
@@ -444,7 +451,7 @@ export const ${queryName} = cache(async (
|
|
|
444
451
|
${paramsList}
|
|
445
452
|
): Promise<${signature.responseType}> => {
|
|
446
453
|
return unstable_cache(
|
|
447
|
-
async () =>
|
|
454
|
+
async () => ${clientCall},
|
|
448
455
|
[${cacheKeyParts.join(", ")}],
|
|
449
456
|
{
|
|
450
457
|
tags: [${queryTags.map((tag) => `'${tag}'`).join(", ")}],
|
|
@@ -643,34 +650,37 @@ export type { AuthCallbacks };
|
|
|
643
650
|
`;
|
|
644
651
|
}
|
|
645
652
|
generateServerClientContent() {
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
653
|
+
const outputPath = path6.join(this.context.config.outputDir, "types.ts");
|
|
654
|
+
const endpointsPath = path6.join(this.context.config.endpointsPath);
|
|
655
|
+
const relativePath = path6.relative(path6.dirname(outputPath), endpointsPath).replace(/\\/g, "/");
|
|
656
|
+
return `import { createAPIClient } from '@cushin/api-runtime';
|
|
657
|
+
import { apiConfig } from '${relativePath}';
|
|
658
|
+
import { z } from 'zod';
|
|
649
659
|
|
|
650
|
-
// Type
|
|
660
|
+
// Type the methods based on endpoints
|
|
651
661
|
type APIClientMethods = {
|
|
652
|
-
[K in keyof
|
|
662
|
+
[K in keyof typeof apiConfig.endpoints]: (typeof apiConfig.endpoints)[K] extends {
|
|
653
663
|
method: infer M;
|
|
654
664
|
params?: infer P;
|
|
655
665
|
query?: infer Q;
|
|
656
666
|
body?: infer B;
|
|
657
667
|
response: infer R;
|
|
658
668
|
}
|
|
659
|
-
? M extends
|
|
660
|
-
? P extends
|
|
661
|
-
? Q extends
|
|
662
|
-
? (params: P
|
|
663
|
-
: (params: P
|
|
664
|
-
: Q extends
|
|
665
|
-
? (query?: Q
|
|
666
|
-
: () => Promise<R
|
|
667
|
-
: P extends
|
|
668
|
-
? B extends
|
|
669
|
-
? (params: P
|
|
670
|
-
: (params: P
|
|
671
|
-
: B extends
|
|
672
|
-
? (body: B
|
|
673
|
-
: () => Promise<R
|
|
669
|
+
? M extends "GET"
|
|
670
|
+
? P extends z.ZodJSONSchema
|
|
671
|
+
? Q extends z.ZodJSONSchema
|
|
672
|
+
? (params: z.infer<P>, query?: z.infer<Q>) => Promise<z.infer<R>>
|
|
673
|
+
: (params: z.infer<P>) => Promise<z.infer<R>>
|
|
674
|
+
: Q extends z.ZodJSONSchema
|
|
675
|
+
? (query?: z.infer<Q>) => Promise<z.infer<R>>
|
|
676
|
+
: () => Promise<z.infer<R>>
|
|
677
|
+
: P extends z.ZodJSONSchema
|
|
678
|
+
? B extends z.ZodJSONSchema
|
|
679
|
+
? (params: z.infer<P>, body: z.infer<B>) => Promise<z.infer<R>>
|
|
680
|
+
: (params: z.infer<P>) => Promise<z.infer<R>>
|
|
681
|
+
: B extends z.ZodJSONSchema
|
|
682
|
+
? (body: z.infer<B>) => Promise<z.infer<R>>
|
|
683
|
+
: () => Promise<z.infer<R>>
|
|
674
684
|
: never;
|
|
675
685
|
};
|
|
676
686
|
|
|
@@ -952,6 +962,34 @@ ${this.generatePrefetchFunctions()}
|
|
|
952
962
|
}
|
|
953
963
|
};
|
|
954
964
|
|
|
965
|
+
// src/generators/generate-index.ts
|
|
966
|
+
import fs9 from "fs/promises";
|
|
967
|
+
import path10 from "path";
|
|
968
|
+
var IndexGenerator = class extends BaseGenerator {
|
|
969
|
+
async generate() {
|
|
970
|
+
const content = this.generateContent();
|
|
971
|
+
const outputPath = path10.join(this.context.config.outputDir, "index.ts");
|
|
972
|
+
await fs9.mkdir(path10.dirname(outputPath), { recursive: true });
|
|
973
|
+
await fs9.writeFile(outputPath, content, "utf-8");
|
|
974
|
+
}
|
|
975
|
+
generateContent() {
|
|
976
|
+
const outputPath = path10.join(this.context.config.outputDir, "types.ts");
|
|
977
|
+
const endpointsPath = path10.join(this.context.config.endpointsPath);
|
|
978
|
+
const relativePath = path10.relative(path10.dirname(outputPath), endpointsPath).replace(/\\/g, "/");
|
|
979
|
+
const content = `// Auto-generated exports
|
|
980
|
+
export * from './types';
|
|
981
|
+
export * from './client';
|
|
982
|
+
export * from './query-keys';
|
|
983
|
+
${this.hasQueryOptions() ? "export * from './query-options';" : ""}
|
|
984
|
+
export * from './hooks';
|
|
985
|
+
export * from './prefetchs';
|
|
986
|
+
export { z } from 'zod';
|
|
987
|
+
export { apiConfig } from '${relativePath}';
|
|
988
|
+
`;
|
|
989
|
+
return content;
|
|
990
|
+
}
|
|
991
|
+
};
|
|
992
|
+
|
|
955
993
|
// src/generators/index.ts
|
|
956
994
|
var CodeGenerator = class {
|
|
957
995
|
constructor(context2) {
|
|
@@ -966,6 +1004,7 @@ var CodeGenerator = class {
|
|
|
966
1004
|
getGenerators() {
|
|
967
1005
|
const generators = [];
|
|
968
1006
|
generators.push(new TypesGenerator(this.context));
|
|
1007
|
+
generators.push(new IndexGenerator(this.context));
|
|
969
1008
|
if (this.context.config.generateClient) {
|
|
970
1009
|
generators.push(new ClientGenerator(this.context));
|
|
971
1010
|
}
|
|
@@ -1024,14 +1063,14 @@ var CodegenCore = class {
|
|
|
1024
1063
|
};
|
|
1025
1064
|
|
|
1026
1065
|
// src/cli.ts
|
|
1027
|
-
import
|
|
1066
|
+
import path11 from "path";
|
|
1028
1067
|
var program = new Command();
|
|
1029
1068
|
setupCLIProgram(program);
|
|
1030
1069
|
var context = {
|
|
1031
1070
|
loadConfig,
|
|
1032
1071
|
validateConfig,
|
|
1033
1072
|
CodegenCore,
|
|
1034
|
-
pathToFileURL: (filePath) => new URL(`file://${
|
|
1073
|
+
pathToFileURL: (filePath) => new URL(`file://${path11.resolve(filePath)}`)
|
|
1035
1074
|
};
|
|
1036
1075
|
setupGenerateCommand(program, context);
|
|
1037
1076
|
setupInitCommand(program);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/config/index.ts","../src/core/codegen.ts","../src/generators/hooks.ts","../src/generators/base.ts","../src/generators/actions.ts","../src/generators/queries.ts","../src/generators/types.ts","../src/generators/client.ts","../src/generators/query-keys.ts","../src/generators/query-options.ts","../src/generators/prefetch.ts","../src/generators/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport { setupCLIProgram, setupGenerateCommand, setupInitCommand, setupValidateCommand } from '@cushin/codegen-cli';\nimport { loadConfig, validateConfig } from './config/index.js';\nimport { CodegenCore } from './core/codegen.js';\nimport path from 'path';\n\nconst program = new Command();\n\n// Setup base program\nsetupCLIProgram(program);\n\n// Setup commands with context\nconst context = {\n loadConfig,\n validateConfig,\n CodegenCore,\n pathToFileURL: (filePath: string) => new URL(`file://${path.resolve(filePath)}`),\n};\n\nsetupGenerateCommand(program, context);\nsetupInitCommand(program);\nsetupValidateCommand(program, context);\n\nprogram.parse();\n","import { cosmiconfig } from \"cosmiconfig\";\nimport path from \"path\";\nimport type { APIConfig } from \"@cushin/api-runtime\";\n\nexport interface UserConfig {\n /**\n * Base URL for API requests\n */\n baseUrl?: string;\n\n /**\n * Path to the endpoints configuration file\n */\n endpoints: string;\n\n /**\n * Provider type: 'vite' | 'nextjs'\n */\n provider: \"vite\" | \"nextjs\";\n\n /**\n * Output directory for generated files\n */\n output: string;\n\n /**\n * Whether to generate React Query hooks (for client-side)\n * @default true for vite, nextjs\n */\n generateHooks?: boolean;\n\n /**\n * Whether to generate server actions (Next.js only)\n * @default true for nextjs, false for vite\n */\n generateServerActions?: boolean;\n\n /**\n * Whether to generate server queries (Next.js only)\n * @default true for nextjs, false for vite\n */\n generateServerQueries?: boolean;\n\n /**\n * Whether to generate API client\n * @default true\n */\n generateClient?: boolean;\n\n /**\n * Whether to generate prefetch utilities\n * @default true\n */\n generatePrefetch?: boolean;\n\n /**\n * Custom templates directory\n */\n templatesDir?: string;\n\n /**\n * Additional options\n */\n options?: {\n /**\n * Use 'use client' directive\n */\n useClientDirective?: boolean;\n\n /**\n * Custom imports to add to generated files\n */\n customImports?: Record<string, string[]>;\n\n /**\n * Prefix for generated hook names\n */\n hookPrefix?: string;\n\n /**\n * Suffix for generated action names\n */\n actionSuffix?: string;\n };\n}\n\nexport interface ResolvedConfig extends UserConfig {\n rootDir: string;\n endpointsPath: string;\n outputDir: string;\n apiConfig?: APIConfig;\n}\n\nconst explorer = cosmiconfig(\"api-codegen\", {\n searchPlaces: [\n \"api-codegen.config.js\",\n \"api-codegen.config.mjs\",\n \"api-codegen.config.ts\",\n \"api-codegen.config.json\",\n \".api-codegenrc\",\n \".api-codegenrc.json\",\n \".api-codegenrc.js\",\n ],\n});\n\nexport async function loadConfig(\n configPath?: string,\n): Promise<ResolvedConfig | null> {\n try {\n const result = configPath\n ? await explorer.load(configPath)\n : await explorer.search();\n\n if (!result || !result.config) {\n return null;\n }\n\n const userConfig = result.config as UserConfig;\n const rootDir = path.dirname(result.filepath);\n\n // Resolve paths\n const endpointsPath = path.resolve(rootDir, userConfig.endpoints);\n const outputDir = path.resolve(rootDir, userConfig.output);\n\n // Set defaults based on provider\n const generateHooks = userConfig.generateHooks ?? true;\n const generateServerActions =\n userConfig.generateServerActions ?? userConfig.provider === \"nextjs\";\n const generateServerQueries =\n userConfig.generateServerQueries ?? userConfig.provider === \"nextjs\";\n const generateClient = userConfig.generateClient ?? true;\n const generatePrefetch = userConfig.generatePrefetch ?? true;\n\n return {\n ...userConfig,\n rootDir,\n endpointsPath,\n outputDir,\n generateHooks,\n generateServerActions,\n generateServerQueries,\n generateClient,\n generatePrefetch,\n };\n } catch (error) {\n throw new Error(\n `Failed to load config: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\n/**\n * Validate user config\n */\nexport function validateConfig(config: UserConfig): void {\n if (!config.endpoints) {\n throw new Error('Config error: \"endpoints\" path is required');\n }\n\n if (!config.provider) {\n throw new Error(\n 'Config error: \"provider\" must be specified (vite or nextjs)',\n );\n }\n\n if (![\"vite\", \"nextjs\"].includes(config.provider)) {\n throw new Error(\n 'Config error: \"provider\" must be either \"vite\" or \"nextjs\"',\n );\n }\n\n if (!config.output) {\n throw new Error('Config error: \"output\" directory is required');\n }\n}\n","import { createJiti } from \"jiti\";\nimport type { APIConfig } from \"@cushin/api-runtime\";\nimport type { ResolvedConfig } from \"../config/index.js\";\nimport { CodeGenerator } from \"../generators/index.js\";\nimport { fileURLToPath } from \"url\";\n\nexport class CodegenCore {\n constructor(private config: ResolvedConfig) {}\n\n async execute(): Promise<void> {\n // Load API configuration\n const apiConfig = await this.loadAPIConfig();\n\n // Store in config for generators\n this.config.apiConfig = apiConfig;\n\n // Generate code\n const generator = new CodeGenerator({\n config: this.config,\n apiConfig,\n });\n\n await generator.generate();\n }\n\n private async loadAPIConfig(): Promise<APIConfig> {\n try {\n // Use jiti to load TypeScript files\n const jiti = createJiti(fileURLToPath(import.meta.url), {\n interopDefault: true,\n });\n\n const module = (await jiti.import(this.config.endpointsPath)) as any;\n\n // Try different export patterns\n const apiConfig =\n module.apiConfig ||\n module.default?.apiConfig ||\n module.default ||\n module;\n\n if (!apiConfig || !apiConfig.endpoints) {\n throw new Error(\n 'Invalid API config: must export an object with \"endpoints\" property',\n );\n }\n\n return apiConfig;\n } catch (error) {\n throw new Error(\n `Failed to load endpoints from \"${this.config.endpointsPath}\": ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"@cushin/api-runtime\";\n\nexport class HooksGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"hooks.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const useClientDirective =\n this.context.config.options?.useClientDirective ?? true;\n 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 type { APIConfig, APIEndpoint } from \"@cushin/api-runtime\";\nimport type { ResolvedConfig } from \"../config/index.js\";\n\nexport interface GeneratorContext {\n config: ResolvedConfig;\n apiConfig: APIConfig;\n}\n\nexport abstract class BaseGenerator {\n constructor(protected context: GeneratorContext) {}\n\n abstract generate(): Promise<void>;\n\n protected isQueryEndpoint(endpoint: APIEndpoint): boolean {\n return endpoint.method === \"GET\";\n }\n\n protected isMutationEndpoint(endpoint: APIEndpoint): boolean {\n return !this.isQueryEndpoint(endpoint);\n }\n\n protected capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n\n protected getQueryTags(endpoint: APIEndpoint): string[] {\n return endpoint.tags || [];\n }\n\n protected getInvalidationTags(endpoint: APIEndpoint): string[] {\n const tags = endpoint.tags || [];\n return tags.filter((tag) => tag !== \"query\" && tag !== \"mutation\");\n }\n\n protected hasParams(endpoint: APIEndpoint): boolean {\n return !!endpoint.params;\n }\n\n protected hasQuery(endpoint: APIEndpoint): boolean {\n return !!endpoint.query;\n }\n\n protected hasBody(endpoint: APIEndpoint): boolean {\n return !!endpoint.body;\n }\n\n protected getEndpointSignature(\n name: string,\n endpoint: APIEndpoint,\n ): {\n hasParams: boolean;\n hasQuery: boolean;\n hasBody: boolean;\n paramType: string;\n queryType: string;\n bodyType: string;\n responseType: string;\n } {\n const hasParams = this.hasParams(endpoint);\n const hasQuery = this.hasQuery(endpoint);\n const hasBody = this.hasBody(endpoint);\n\n return {\n hasParams,\n hasQuery,\n hasBody,\n paramType: hasParams ? `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 \"@cushin/api-runtime\";\n\nexport class ServerActionsGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, 'actions.ts');\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, 'utf-8');\n }\n\n private generateContent(): string {\n const imports = `'use server';\n\nimport { revalidateTag, revalidatePath } from 'next/cache';\nimport { serverClient } from './server-client';\nimport type { \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 \"@cushin/api-runtime\";\n\nexport class ServerQueriesGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"queries.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const imports = `import { cache } from 'react';\nimport { unstable_cache } from 'next/cache';\nimport { serverClient } from './server-client';\nimport type { \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-runtime';\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-runtime';\nimport type { AuthCallbacks } from '@cushin/api-runtime';\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 './core';\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 \"@cushin/api-runtime\";\n\nexport class PrefetchGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"prefetchs.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const content = `// Auto-generated prefetch utilities\nimport { type QueryClient } from '@tanstack/react-query';\n${this.hasQueryOptions() ? \"import { apiQueryOptions } from './query-options';\" : \"\"}\nimport { 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"],"mappings":"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","names":["path","context","path","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","context","path"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/config/index.ts","../src/core/codegen.ts","../src/generators/hooks.ts","../src/generators/base.ts","../src/generators/actions.ts","../src/generators/queries.ts","../src/generators/types.ts","../src/generators/client.ts","../src/generators/query-keys.ts","../src/generators/query-options.ts","../src/generators/prefetch.ts","../src/generators/generate-index.ts","../src/generators/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport { setupCLIProgram, setupGenerateCommand, setupInitCommand, setupValidateCommand } from '@cushin/codegen-cli';\nimport { loadConfig, validateConfig } from './config/index.js';\nimport { CodegenCore } from './core/codegen.js';\nimport path from 'path';\n\nconst program = new Command();\n\n// Setup base program\nsetupCLIProgram(program);\n\n// Setup commands with context\nconst context = {\n loadConfig,\n validateConfig,\n CodegenCore,\n pathToFileURL: (filePath: string) => new URL(`file://${path.resolve(filePath)}`),\n};\n\nsetupGenerateCommand(program, context);\nsetupInitCommand(program);\nsetupValidateCommand(program, context);\n\nprogram.parse();\n","import { cosmiconfig } from \"cosmiconfig\";\nimport path from \"path\";\nimport type { APIConfig } from \"@cushin/api-runtime\";\n\nexport interface UserConfig {\n /**\n * Base URL for API requests\n */\n baseUrl?: string;\n\n /**\n * Path to the endpoints configuration file\n */\n endpoints: string;\n\n /**\n * Provider type: 'vite' | 'nextjs'\n */\n provider: \"vite\" | \"nextjs\";\n\n /**\n * Output directory for generated files\n */\n output: string;\n\n /**\n * Whether to generate React Query hooks (for client-side)\n * @default true for vite, nextjs\n */\n generateHooks?: boolean;\n\n /**\n * Whether to generate server actions (Next.js only)\n * @default true for nextjs, false for vite\n */\n generateServerActions?: boolean;\n\n /**\n * Whether to generate server queries (Next.js only)\n * @default true for nextjs, false for vite\n */\n generateServerQueries?: boolean;\n\n /**\n * Whether to generate API client\n * @default true\n */\n generateClient?: boolean;\n\n /**\n * Whether to generate prefetch utilities\n * @default true\n */\n generatePrefetch?: boolean;\n\n /**\n * Custom templates directory\n */\n templatesDir?: string;\n\n /**\n * Additional options\n */\n options?: {\n /**\n * Use 'use client' directive\n */\n useClientDirective?: boolean;\n\n /**\n * Custom imports to add to generated files\n */\n customImports?: Record<string, string[]>;\n\n /**\n * Prefix for generated hook names\n */\n hookPrefix?: string;\n\n /**\n * Suffix for generated action names\n */\n actionSuffix?: string;\n };\n}\n\nexport interface ResolvedConfig extends UserConfig {\n rootDir: string;\n endpointsPath: string;\n outputDir: string;\n apiConfig?: APIConfig;\n}\n\nconst explorer = cosmiconfig(\"api-codegen\", {\n searchPlaces: [\n \"api-codegen.config.js\",\n \"api-codegen.config.mjs\",\n \"api-codegen.config.ts\",\n \"api-codegen.config.json\",\n \".api-codegenrc\",\n \".api-codegenrc.json\",\n \".api-codegenrc.js\",\n ],\n});\n\nexport async function loadConfig(\n configPath?: string,\n): Promise<ResolvedConfig | null> {\n try {\n const result = configPath\n ? await explorer.load(configPath)\n : await explorer.search();\n\n if (!result || !result.config) {\n return null;\n }\n\n const userConfig = result.config as UserConfig;\n const rootDir = path.dirname(result.filepath);\n\n // Resolve paths\n const endpointsPath = path.resolve(rootDir, userConfig.endpoints);\n const outputDir = path.resolve(rootDir, userConfig.output);\n\n // Set defaults based on provider\n const generateHooks = userConfig.generateHooks ?? true;\n const generateServerActions =\n userConfig.generateServerActions ?? userConfig.provider === \"nextjs\";\n const generateServerQueries =\n userConfig.generateServerQueries ?? userConfig.provider === \"nextjs\";\n const generateClient = userConfig.generateClient ?? true;\n const generatePrefetch = userConfig.generatePrefetch ?? true;\n\n return {\n ...userConfig,\n rootDir,\n endpointsPath,\n outputDir,\n generateHooks,\n generateServerActions,\n generateServerQueries,\n generateClient,\n generatePrefetch,\n };\n } catch (error) {\n throw new Error(\n `Failed to load config: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\n/**\n * Validate user config\n */\nexport function validateConfig(config: UserConfig): void {\n if (!config.endpoints) {\n throw new Error('Config error: \"endpoints\" path is required');\n }\n\n if (!config.provider) {\n throw new Error(\n 'Config error: \"provider\" must be specified (vite or nextjs)',\n );\n }\n\n if (![\"vite\", \"nextjs\"].includes(config.provider)) {\n throw new Error(\n 'Config error: \"provider\" must be either \"vite\" or \"nextjs\"',\n );\n }\n\n if (!config.output) {\n throw new Error('Config error: \"output\" directory is required');\n }\n}\n","import { createJiti } from \"jiti\";\nimport type { APIConfig } from \"@cushin/api-runtime\";\nimport type { ResolvedConfig } from \"../config/index.js\";\nimport { CodeGenerator } from \"../generators/index.js\";\nimport { fileURLToPath } from \"url\";\n\nexport class CodegenCore {\n constructor(private config: ResolvedConfig) {}\n\n async execute(): Promise<void> {\n // Load API configuration\n const apiConfig = await this.loadAPIConfig();\n\n // Store in config for generators\n this.config.apiConfig = apiConfig;\n\n // Generate code\n const generator = new CodeGenerator({\n config: this.config,\n apiConfig,\n });\n\n await generator.generate();\n }\n\n private async loadAPIConfig(): Promise<APIConfig> {\n try {\n // Use jiti to load TypeScript files\n const jiti = createJiti(fileURLToPath(import.meta.url), {\n interopDefault: true,\n });\n\n const module = (await jiti.import(this.config.endpointsPath)) as any;\n\n // Try different export patterns\n const apiConfig =\n module.apiConfig ||\n module.default?.apiConfig ||\n module.default ||\n module;\n\n if (!apiConfig || !apiConfig.endpoints) {\n throw new Error(\n 'Invalid API config: must export an object with \"endpoints\" property',\n );\n }\n\n return apiConfig;\n } catch (error) {\n throw new Error(\n `Failed to load endpoints from \"${this.config.endpointsPath}\": ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"@cushin/api-runtime\";\n\nexport class HooksGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"hooks.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const useClientDirective =\n this.context.config.options?.useClientDirective ?? true;\n 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 type { APIConfig, APIEndpoint } from \"@cushin/api-runtime\";\nimport type { ResolvedConfig } from \"../config/index.js\";\n\nexport interface GeneratorContext {\n config: ResolvedConfig;\n apiConfig: APIConfig;\n}\n\nexport abstract class BaseGenerator {\n constructor(protected context: GeneratorContext) {}\n\n abstract generate(): Promise<void>;\n\n protected isQueryEndpoint(endpoint: APIEndpoint): boolean {\n return endpoint.method === \"GET\";\n }\n\n protected isMutationEndpoint(endpoint: APIEndpoint): boolean {\n return !this.isQueryEndpoint(endpoint);\n }\n\n protected capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n\n protected getQueryTags(endpoint: APIEndpoint): string[] {\n return endpoint.tags || [];\n }\n\n protected getInvalidationTags(endpoint: APIEndpoint): string[] {\n const tags = endpoint.tags || [];\n return tags.filter((tag) => tag !== \"query\" && tag !== \"mutation\");\n }\n\n protected hasParams(endpoint: APIEndpoint): boolean {\n return !!endpoint.params;\n }\n\n protected hasQuery(endpoint: APIEndpoint): boolean {\n return !!endpoint.query;\n }\n\n protected hasBody(endpoint: APIEndpoint): boolean {\n return !!endpoint.body;\n }\n\n protected getEndpointSignature(\n name: string,\n endpoint: APIEndpoint,\n ): {\n hasParams: boolean;\n hasQuery: boolean;\n hasBody: boolean;\n paramType: string;\n queryType: string;\n bodyType: string;\n responseType: string;\n } {\n const hasParams = this.hasParams(endpoint);\n const hasQuery = this.hasQuery(endpoint);\n const hasBody = this.hasBody(endpoint);\n\n return {\n hasParams,\n hasQuery,\n hasBody,\n paramType: hasParams ? `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 \"@cushin/api-runtime\";\n\nexport class ServerActionsGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, 'actions.ts');\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, 'utf-8');\n }\n\n private generateContent(): string {\n const imports = `'use server';\n\nimport { revalidateTag, revalidatePath } from 'next/cache';\nimport { serverClient } from './server-client';\nimport type { \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 callArgs = '';\n if (signature.hasParams && signature.hasBody) {\n inputType = `input: { params: ${signature.paramType}; body: ${signature.bodyType} }`;\n callArgs = 'input.params, input.body';\n } else if (signature.hasParams) {\n inputType = `params: ${signature.paramType}`;\n callArgs = 'params';\n } else if (signature.hasBody) {\n inputType = `body: ${signature.bodyType}`;\n callArgs = '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}(${callArgs});\n\n // Revalidate related data\n${revalidateStatements}\n\n return { success: true, data: result };\n } catch (error) {\n console.error('[Server Action Error]:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n };\n }\n}`;\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"@cushin/api-runtime\";\n\nexport class ServerQueriesGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"queries.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const imports = `import { cache } from 'react';\nimport { unstable_cache } from 'next/cache';\nimport { serverClient } from './server-client';\nimport type { \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 // Build client call with proper argument handling\n let clientCall = '';\n if (signature.hasParams && signature.hasQuery) {\n clientCall = `serverClient.${name}(params, query)`;\n } else if (signature.hasParams) {\n clientCall = `serverClient.${name}(params)`;\n } else if (signature.hasQuery) {\n clientCall = `serverClient.${name}(query)`;\n } else {\n clientCall = `serverClient.${name}()`;\n }\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(\"query ? JSON.stringify(query) : 'no-query'\");\n\n return `/**\n * ${endpoint.description || `Server query for ${name}`}\n * @tags ${queryTags.join(\", \") || \"none\"}\n */\nexport const ${queryName} = cache(async (\n ${paramsList}\n): Promise<${signature.responseType}> => {\n return unstable_cache(\n async () => ${clientCall},\n [${cacheKeyParts.join(\", \")}],\n {\n tags: [${queryTags.map((tag) => `'${tag}'`).join(\", \")}],\n revalidate: 3600, // 1 hour default, can be overridden\n }\n )();\n});`;\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class TypesGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\");\n return `// Auto-generated type definitions\n// Do not edit this file manually\n\nimport type { z } from 'zod';\nimport { apiConfig } from '${relativePath}';\n\n\n// Re-export endpoint configuration types\nexport type { APIConfig, APIEndpoint, HTTPMethod } from '@cushin/api-runtime';\n\n/**\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-runtime';\nimport type { AuthCallbacks } from '@cushin/api-runtime';\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 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 `import { createAPIClient } from '@cushin/api-runtime';\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 * 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 \"@cushin/api-runtime\";\n\nexport class PrefetchGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"prefetchs.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const content = `// Auto-generated prefetch utilities\nimport { type QueryClient } from '@tanstack/react-query';\n${this.hasQueryOptions() ? \"import { apiQueryOptions } from './query-options';\" : \"\"}\nimport { 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 fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class IndexGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"index.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\");\n\n const content = `// Auto-generated exports\nexport * from './types';\nexport * from './client';\nexport * from './query-keys';\n${this.hasQueryOptions() ? \"export * from './query-options';\" : \"\"}\nexport * from './hooks';\nexport * from './prefetchs';\nexport { z } from 'zod';\nexport { apiConfig } from '${relativePath}';\n`;\n return content;\n }\n}\n","import { HooksGenerator } from \"./hooks.js\";\nimport { ServerActionsGenerator } from \"./actions.js\";\nimport { ServerQueriesGenerator } from \"./queries.js\";\nimport { TypesGenerator } from \"./types.js\";\nimport { ClientGenerator } from \"./client.js\";\nimport type { GeneratorContext } from \"./base.js\";\nimport { QueryKeysGenerator } from \"./query-keys.js\";\nimport { QueryOptionsGenerator } from \"./query-options.js\";\nimport { PrefetchGenerator } from \"./prefetch.js\";\nimport { IndexGenerator } from \"./generate-index.js\";\n\nexport class CodeGenerator {\n constructor(private context: GeneratorContext) {}\n\n async generate(): Promise<void> {\n const generators = this.getGenerators();\n\n for (const generator of generators) {\n await generator.generate();\n }\n }\n\n private getGenerators() {\n const generators: Array<any> = [];\n\n // Always generate types\n generators.push(new TypesGenerator(this.context));\n generators.push(new IndexGenerator(this.context));\n\n // Generate client if enabled\n if (this.context.config.generateClient) {\n generators.push(new ClientGenerator(this.context));\n }\n\n // Generate hooks if enabled\n if (this.context.config.generateHooks) {\n generators.push(new QueryKeysGenerator(this.context));\n generators.push(new QueryOptionsGenerator(this.context));\n generators.push(new HooksGenerator(this.context));\n }\n\n if (this.context.config.generatePrefetch) {\n generators.push(new PrefetchGenerator(this.context));\n }\n\n // Generate server actions if enabled (Next.js only)\n if (\n this.context.config.generateServerActions &&\n this.context.config.provider === \"nextjs\"\n ) {\n generators.push(new ServerActionsGenerator(this.context));\n }\n\n // Generate server queries if enabled (Next.js only)\n if (\n this.context.config.generateServerQueries &&\n this.context.config.provider === \"nextjs\"\n ) {\n generators.push(new ServerQueriesGenerator(this.context));\n }\n\n return generators;\n }\n}\n"],"mappings":"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","names":["path","context","path","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","context","path"]}
|
package/dist/index.js
CHANGED
|
@@ -352,16 +352,16 @@ export type ActionResult<T> =
|
|
|
352
352
|
const signature = this.getEndpointSignature(name, endpoint);
|
|
353
353
|
const invalidationTags = this.getInvalidationTags(endpoint);
|
|
354
354
|
let inputType = "";
|
|
355
|
-
let
|
|
355
|
+
let callArgs = "";
|
|
356
356
|
if (signature.hasParams && signature.hasBody) {
|
|
357
357
|
inputType = `input: { params: ${signature.paramType}; body: ${signature.bodyType} }`;
|
|
358
|
-
|
|
358
|
+
callArgs = "input.params, input.body";
|
|
359
359
|
} else if (signature.hasParams) {
|
|
360
360
|
inputType = `params: ${signature.paramType}`;
|
|
361
|
-
|
|
361
|
+
callArgs = "params";
|
|
362
362
|
} else if (signature.hasBody) {
|
|
363
363
|
inputType = `body: ${signature.bodyType}`;
|
|
364
|
-
|
|
364
|
+
callArgs = "body";
|
|
365
365
|
}
|
|
366
366
|
const revalidateStatements = invalidationTags.length > 0 ? invalidationTags.map((tag) => ` revalidateTag('${tag}');`).join("\n") : " // No automatic revalidations";
|
|
367
367
|
return `/**
|
|
@@ -372,17 +372,17 @@ export async function ${actionName}(
|
|
|
372
372
|
${inputType}
|
|
373
373
|
): Promise<ActionResult<${signature.responseType}>> {
|
|
374
374
|
try {
|
|
375
|
-
const result = await serverClient.${name}(${
|
|
376
|
-
|
|
375
|
+
const result = await serverClient.${name}(${callArgs});
|
|
376
|
+
|
|
377
377
|
// Revalidate related data
|
|
378
378
|
${revalidateStatements}
|
|
379
|
-
|
|
379
|
+
|
|
380
380
|
return { success: true, data: result };
|
|
381
381
|
} catch (error) {
|
|
382
382
|
console.error('[Server Action Error]:', error);
|
|
383
|
-
return {
|
|
384
|
-
success: false,
|
|
385
|
-
error: error instanceof Error ? error.message : 'Unknown error'
|
|
383
|
+
return {
|
|
384
|
+
success: false,
|
|
385
|
+
error: error instanceof Error ? error.message : 'Unknown error'
|
|
386
386
|
};
|
|
387
387
|
}
|
|
388
388
|
}`;
|
|
@@ -427,12 +427,19 @@ import type {
|
|
|
427
427
|
const paramDef = signature.hasParams ? `params: ${signature.paramType}` : "";
|
|
428
428
|
const queryDef = signature.hasQuery ? `query?: ${signature.queryType}` : "";
|
|
429
429
|
const paramsList = [paramDef, queryDef].filter(Boolean).join(",\n ");
|
|
430
|
-
|
|
431
|
-
if (signature.hasParams
|
|
432
|
-
|
|
430
|
+
let clientCall = "";
|
|
431
|
+
if (signature.hasParams && signature.hasQuery) {
|
|
432
|
+
clientCall = `serverClient.${name}(params, query)`;
|
|
433
|
+
} else if (signature.hasParams) {
|
|
434
|
+
clientCall = `serverClient.${name}(params)`;
|
|
435
|
+
} else if (signature.hasQuery) {
|
|
436
|
+
clientCall = `serverClient.${name}(query)`;
|
|
437
|
+
} else {
|
|
438
|
+
clientCall = `serverClient.${name}()`;
|
|
439
|
+
}
|
|
433
440
|
const cacheKeyParts = [`'${name}'`];
|
|
434
441
|
if (signature.hasParams) cacheKeyParts.push("JSON.stringify(params)");
|
|
435
|
-
if (signature.hasQuery) cacheKeyParts.push("JSON.stringify(query)");
|
|
442
|
+
if (signature.hasQuery) cacheKeyParts.push("query ? JSON.stringify(query) : 'no-query'");
|
|
436
443
|
return `/**
|
|
437
444
|
* ${endpoint.description || `Server query for ${name}`}
|
|
438
445
|
* @tags ${queryTags.join(", ") || "none"}
|
|
@@ -441,7 +448,7 @@ export const ${queryName} = cache(async (
|
|
|
441
448
|
${paramsList}
|
|
442
449
|
): Promise<${signature.responseType}> => {
|
|
443
450
|
return unstable_cache(
|
|
444
|
-
async () =>
|
|
451
|
+
async () => ${clientCall},
|
|
445
452
|
[${cacheKeyParts.join(", ")}],
|
|
446
453
|
{
|
|
447
454
|
tags: [${queryTags.map((tag) => `'${tag}'`).join(", ")}],
|
|
@@ -640,34 +647,37 @@ export type { AuthCallbacks };
|
|
|
640
647
|
`;
|
|
641
648
|
}
|
|
642
649
|
generateServerClientContent() {
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
650
|
+
const outputPath = path6.join(this.context.config.outputDir, "types.ts");
|
|
651
|
+
const endpointsPath = path6.join(this.context.config.endpointsPath);
|
|
652
|
+
const relativePath = path6.relative(path6.dirname(outputPath), endpointsPath).replace(/\\/g, "/");
|
|
653
|
+
return `import { createAPIClient } from '@cushin/api-runtime';
|
|
654
|
+
import { apiConfig } from '${relativePath}';
|
|
655
|
+
import { z } from 'zod';
|
|
646
656
|
|
|
647
|
-
// Type
|
|
657
|
+
// Type the methods based on endpoints
|
|
648
658
|
type APIClientMethods = {
|
|
649
|
-
[K in keyof
|
|
659
|
+
[K in keyof typeof apiConfig.endpoints]: (typeof apiConfig.endpoints)[K] extends {
|
|
650
660
|
method: infer M;
|
|
651
661
|
params?: infer P;
|
|
652
662
|
query?: infer Q;
|
|
653
663
|
body?: infer B;
|
|
654
664
|
response: infer R;
|
|
655
665
|
}
|
|
656
|
-
? M extends
|
|
657
|
-
? P extends
|
|
658
|
-
? Q extends
|
|
659
|
-
? (params: P
|
|
660
|
-
: (params: P
|
|
661
|
-
: Q extends
|
|
662
|
-
? (query?: Q
|
|
663
|
-
: () => Promise<R
|
|
664
|
-
: P extends
|
|
665
|
-
? B extends
|
|
666
|
-
? (params: P
|
|
667
|
-
: (params: P
|
|
668
|
-
: B extends
|
|
669
|
-
? (body: B
|
|
670
|
-
: () => Promise<R
|
|
666
|
+
? M extends "GET"
|
|
667
|
+
? P extends z.ZodJSONSchema
|
|
668
|
+
? Q extends z.ZodJSONSchema
|
|
669
|
+
? (params: z.infer<P>, query?: z.infer<Q>) => Promise<z.infer<R>>
|
|
670
|
+
: (params: z.infer<P>) => Promise<z.infer<R>>
|
|
671
|
+
: Q extends z.ZodJSONSchema
|
|
672
|
+
? (query?: z.infer<Q>) => Promise<z.infer<R>>
|
|
673
|
+
: () => Promise<z.infer<R>>
|
|
674
|
+
: P extends z.ZodJSONSchema
|
|
675
|
+
? B extends z.ZodJSONSchema
|
|
676
|
+
? (params: z.infer<P>, body: z.infer<B>) => Promise<z.infer<R>>
|
|
677
|
+
: (params: z.infer<P>) => Promise<z.infer<R>>
|
|
678
|
+
: B extends z.ZodJSONSchema
|
|
679
|
+
? (body: z.infer<B>) => Promise<z.infer<R>>
|
|
680
|
+
: () => Promise<z.infer<R>>
|
|
671
681
|
: never;
|
|
672
682
|
};
|
|
673
683
|
|
|
@@ -949,6 +959,34 @@ ${this.generatePrefetchFunctions()}
|
|
|
949
959
|
}
|
|
950
960
|
};
|
|
951
961
|
|
|
962
|
+
// src/generators/generate-index.ts
|
|
963
|
+
import fs9 from "fs/promises";
|
|
964
|
+
import path10 from "path";
|
|
965
|
+
var IndexGenerator = class extends BaseGenerator {
|
|
966
|
+
async generate() {
|
|
967
|
+
const content = this.generateContent();
|
|
968
|
+
const outputPath = path10.join(this.context.config.outputDir, "index.ts");
|
|
969
|
+
await fs9.mkdir(path10.dirname(outputPath), { recursive: true });
|
|
970
|
+
await fs9.writeFile(outputPath, content, "utf-8");
|
|
971
|
+
}
|
|
972
|
+
generateContent() {
|
|
973
|
+
const outputPath = path10.join(this.context.config.outputDir, "types.ts");
|
|
974
|
+
const endpointsPath = path10.join(this.context.config.endpointsPath);
|
|
975
|
+
const relativePath = path10.relative(path10.dirname(outputPath), endpointsPath).replace(/\\/g, "/");
|
|
976
|
+
const content = `// Auto-generated exports
|
|
977
|
+
export * from './types';
|
|
978
|
+
export * from './client';
|
|
979
|
+
export * from './query-keys';
|
|
980
|
+
${this.hasQueryOptions() ? "export * from './query-options';" : ""}
|
|
981
|
+
export * from './hooks';
|
|
982
|
+
export * from './prefetchs';
|
|
983
|
+
export { z } from 'zod';
|
|
984
|
+
export { apiConfig } from '${relativePath}';
|
|
985
|
+
`;
|
|
986
|
+
return content;
|
|
987
|
+
}
|
|
988
|
+
};
|
|
989
|
+
|
|
952
990
|
// src/generators/index.ts
|
|
953
991
|
var CodeGenerator = class {
|
|
954
992
|
constructor(context) {
|
|
@@ -963,6 +1001,7 @@ var CodeGenerator = class {
|
|
|
963
1001
|
getGenerators() {
|
|
964
1002
|
const generators = [];
|
|
965
1003
|
generators.push(new TypesGenerator(this.context));
|
|
1004
|
+
generators.push(new IndexGenerator(this.context));
|
|
966
1005
|
if (this.context.config.generateClient) {
|
|
967
1006
|
generators.push(new ClientGenerator(this.context));
|
|
968
1007
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/config/index.ts","../src/core/codegen.ts","../src/generators/hooks.ts","../src/generators/base.ts","../src/generators/actions.ts","../src/generators/queries.ts","../src/generators/types.ts","../src/generators/client.ts","../src/generators/query-keys.ts","../src/generators/query-options.ts","../src/generators/prefetch.ts","../src/generators/index.ts"],"sourcesContent":["// Re-export runtime types from @cushin/api-runtime\nexport * from \"@cushin/api-runtime\";\n\n// Export config types and utilities\nexport * from \"./config/index.js\";\n\n// Export codegen utilities\nexport { CodegenCore } from \"./core/codegen.js\";\nexport { CodeGenerator } from \"./generators/index.js\";\n","import { cosmiconfig } from \"cosmiconfig\";\nimport path from \"path\";\nimport type { APIConfig } from \"@cushin/api-runtime\";\n\nexport interface UserConfig {\n /**\n * Base URL for API requests\n */\n baseUrl?: string;\n\n /**\n * Path to the endpoints configuration file\n */\n endpoints: string;\n\n /**\n * Provider type: 'vite' | 'nextjs'\n */\n provider: \"vite\" | \"nextjs\";\n\n /**\n * Output directory for generated files\n */\n output: string;\n\n /**\n * Whether to generate React Query hooks (for client-side)\n * @default true for vite, nextjs\n */\n generateHooks?: boolean;\n\n /**\n * Whether to generate server actions (Next.js only)\n * @default true for nextjs, false for vite\n */\n generateServerActions?: boolean;\n\n /**\n * Whether to generate server queries (Next.js only)\n * @default true for nextjs, false for vite\n */\n generateServerQueries?: boolean;\n\n /**\n * Whether to generate API client\n * @default true\n */\n generateClient?: boolean;\n\n /**\n * Whether to generate prefetch utilities\n * @default true\n */\n generatePrefetch?: boolean;\n\n /**\n * Custom templates directory\n */\n templatesDir?: string;\n\n /**\n * Additional options\n */\n options?: {\n /**\n * Use 'use client' directive\n */\n useClientDirective?: boolean;\n\n /**\n * Custom imports to add to generated files\n */\n customImports?: Record<string, string[]>;\n\n /**\n * Prefix for generated hook names\n */\n hookPrefix?: string;\n\n /**\n * Suffix for generated action names\n */\n actionSuffix?: string;\n };\n}\n\nexport interface ResolvedConfig extends UserConfig {\n rootDir: string;\n endpointsPath: string;\n outputDir: string;\n apiConfig?: APIConfig;\n}\n\nconst explorer = cosmiconfig(\"api-codegen\", {\n searchPlaces: [\n \"api-codegen.config.js\",\n \"api-codegen.config.mjs\",\n \"api-codegen.config.ts\",\n \"api-codegen.config.json\",\n \".api-codegenrc\",\n \".api-codegenrc.json\",\n \".api-codegenrc.js\",\n ],\n});\n\nexport async function loadConfig(\n configPath?: string,\n): Promise<ResolvedConfig | null> {\n try {\n const result = configPath\n ? await explorer.load(configPath)\n : await explorer.search();\n\n if (!result || !result.config) {\n return null;\n }\n\n const userConfig = result.config as UserConfig;\n const rootDir = path.dirname(result.filepath);\n\n // Resolve paths\n const endpointsPath = path.resolve(rootDir, userConfig.endpoints);\n const outputDir = path.resolve(rootDir, userConfig.output);\n\n // Set defaults based on provider\n const generateHooks = userConfig.generateHooks ?? true;\n const generateServerActions =\n userConfig.generateServerActions ?? userConfig.provider === \"nextjs\";\n const generateServerQueries =\n userConfig.generateServerQueries ?? userConfig.provider === \"nextjs\";\n const generateClient = userConfig.generateClient ?? true;\n const generatePrefetch = userConfig.generatePrefetch ?? true;\n\n return {\n ...userConfig,\n rootDir,\n endpointsPath,\n outputDir,\n generateHooks,\n generateServerActions,\n generateServerQueries,\n generateClient,\n generatePrefetch,\n };\n } catch (error) {\n throw new Error(\n `Failed to load config: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\n/**\n * Validate user config\n */\nexport function validateConfig(config: UserConfig): void {\n if (!config.endpoints) {\n throw new Error('Config error: \"endpoints\" path is required');\n }\n\n if (!config.provider) {\n throw new Error(\n 'Config error: \"provider\" must be specified (vite or nextjs)',\n );\n }\n\n if (![\"vite\", \"nextjs\"].includes(config.provider)) {\n throw new Error(\n 'Config error: \"provider\" must be either \"vite\" or \"nextjs\"',\n );\n }\n\n if (!config.output) {\n throw new Error('Config error: \"output\" directory is required');\n }\n}\n","import { createJiti } from \"jiti\";\nimport type { APIConfig } from \"@cushin/api-runtime\";\nimport type { ResolvedConfig } from \"../config/index.js\";\nimport { CodeGenerator } from \"../generators/index.js\";\nimport { fileURLToPath } from \"url\";\n\nexport class CodegenCore {\n constructor(private config: ResolvedConfig) {}\n\n async execute(): Promise<void> {\n // Load API configuration\n const apiConfig = await this.loadAPIConfig();\n\n // Store in config for generators\n this.config.apiConfig = apiConfig;\n\n // Generate code\n const generator = new CodeGenerator({\n config: this.config,\n apiConfig,\n });\n\n await generator.generate();\n }\n\n private async loadAPIConfig(): Promise<APIConfig> {\n try {\n // Use jiti to load TypeScript files\n const jiti = createJiti(fileURLToPath(import.meta.url), {\n interopDefault: true,\n });\n\n const module = (await jiti.import(this.config.endpointsPath)) as any;\n\n // Try different export patterns\n const apiConfig =\n module.apiConfig ||\n module.default?.apiConfig ||\n module.default ||\n module;\n\n if (!apiConfig || !apiConfig.endpoints) {\n throw new Error(\n 'Invalid API config: must export an object with \"endpoints\" property',\n );\n }\n\n return apiConfig;\n } catch (error) {\n throw new Error(\n `Failed to load endpoints from \"${this.config.endpointsPath}\": ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"@cushin/api-runtime\";\n\nexport class HooksGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"hooks.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const useClientDirective =\n this.context.config.options?.useClientDirective ?? true;\n 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 type { APIConfig, APIEndpoint } from \"@cushin/api-runtime\";\nimport type { ResolvedConfig } from \"../config/index.js\";\n\nexport interface GeneratorContext {\n config: ResolvedConfig;\n apiConfig: APIConfig;\n}\n\nexport abstract class BaseGenerator {\n constructor(protected context: GeneratorContext) {}\n\n abstract generate(): Promise<void>;\n\n protected isQueryEndpoint(endpoint: APIEndpoint): boolean {\n return endpoint.method === \"GET\";\n }\n\n protected isMutationEndpoint(endpoint: APIEndpoint): boolean {\n return !this.isQueryEndpoint(endpoint);\n }\n\n protected capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n\n protected getQueryTags(endpoint: APIEndpoint): string[] {\n return endpoint.tags || [];\n }\n\n protected getInvalidationTags(endpoint: APIEndpoint): string[] {\n const tags = endpoint.tags || [];\n return tags.filter((tag) => tag !== \"query\" && tag !== \"mutation\");\n }\n\n protected hasParams(endpoint: APIEndpoint): boolean {\n return !!endpoint.params;\n }\n\n protected hasQuery(endpoint: APIEndpoint): boolean {\n return !!endpoint.query;\n }\n\n protected hasBody(endpoint: APIEndpoint): boolean {\n return !!endpoint.body;\n }\n\n protected getEndpointSignature(\n name: string,\n endpoint: APIEndpoint,\n ): {\n hasParams: boolean;\n hasQuery: boolean;\n hasBody: boolean;\n paramType: string;\n queryType: string;\n bodyType: string;\n responseType: string;\n } {\n const hasParams = this.hasParams(endpoint);\n const hasQuery = this.hasQuery(endpoint);\n const hasBody = this.hasBody(endpoint);\n\n return {\n hasParams,\n hasQuery,\n hasBody,\n paramType: hasParams ? `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 \"@cushin/api-runtime\";\n\nexport class ServerActionsGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, 'actions.ts');\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, 'utf-8');\n }\n\n private generateContent(): string {\n const imports = `'use server';\n\nimport { revalidateTag, revalidatePath } from 'next/cache';\nimport { serverClient } from './server-client';\nimport type { \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 \"@cushin/api-runtime\";\n\nexport class ServerQueriesGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"queries.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const imports = `import { cache } from 'react';\nimport { unstable_cache } from 'next/cache';\nimport { serverClient } from './server-client';\nimport type { \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-runtime';\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-runtime';\nimport type { AuthCallbacks } from '@cushin/api-runtime';\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 './core';\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 \"@cushin/api-runtime\";\n\nexport class PrefetchGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"prefetchs.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const content = `// Auto-generated prefetch utilities\nimport { type QueryClient } from '@tanstack/react-query';\n${this.hasQueryOptions() ? \"import { apiQueryOptions } from './query-options';\" : \"\"}\nimport { 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"],"mappings":"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","names":["path","path","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/config/index.ts","../src/core/codegen.ts","../src/generators/hooks.ts","../src/generators/base.ts","../src/generators/actions.ts","../src/generators/queries.ts","../src/generators/types.ts","../src/generators/client.ts","../src/generators/query-keys.ts","../src/generators/query-options.ts","../src/generators/prefetch.ts","../src/generators/generate-index.ts","../src/generators/index.ts"],"sourcesContent":["// Re-export runtime types from @cushin/api-runtime\nexport * from \"@cushin/api-runtime\";\n\n// Export config types and utilities\nexport * from \"./config/index.js\";\n\n// Export codegen utilities\nexport { CodegenCore } from \"./core/codegen.js\";\nexport { CodeGenerator } from \"./generators/index.js\";\n","import { cosmiconfig } from \"cosmiconfig\";\nimport path from \"path\";\nimport type { APIConfig } from \"@cushin/api-runtime\";\n\nexport interface UserConfig {\n /**\n * Base URL for API requests\n */\n baseUrl?: string;\n\n /**\n * Path to the endpoints configuration file\n */\n endpoints: string;\n\n /**\n * Provider type: 'vite' | 'nextjs'\n */\n provider: \"vite\" | \"nextjs\";\n\n /**\n * Output directory for generated files\n */\n output: string;\n\n /**\n * Whether to generate React Query hooks (for client-side)\n * @default true for vite, nextjs\n */\n generateHooks?: boolean;\n\n /**\n * Whether to generate server actions (Next.js only)\n * @default true for nextjs, false for vite\n */\n generateServerActions?: boolean;\n\n /**\n * Whether to generate server queries (Next.js only)\n * @default true for nextjs, false for vite\n */\n generateServerQueries?: boolean;\n\n /**\n * Whether to generate API client\n * @default true\n */\n generateClient?: boolean;\n\n /**\n * Whether to generate prefetch utilities\n * @default true\n */\n generatePrefetch?: boolean;\n\n /**\n * Custom templates directory\n */\n templatesDir?: string;\n\n /**\n * Additional options\n */\n options?: {\n /**\n * Use 'use client' directive\n */\n useClientDirective?: boolean;\n\n /**\n * Custom imports to add to generated files\n */\n customImports?: Record<string, string[]>;\n\n /**\n * Prefix for generated hook names\n */\n hookPrefix?: string;\n\n /**\n * Suffix for generated action names\n */\n actionSuffix?: string;\n };\n}\n\nexport interface ResolvedConfig extends UserConfig {\n rootDir: string;\n endpointsPath: string;\n outputDir: string;\n apiConfig?: APIConfig;\n}\n\nconst explorer = cosmiconfig(\"api-codegen\", {\n searchPlaces: [\n \"api-codegen.config.js\",\n \"api-codegen.config.mjs\",\n \"api-codegen.config.ts\",\n \"api-codegen.config.json\",\n \".api-codegenrc\",\n \".api-codegenrc.json\",\n \".api-codegenrc.js\",\n ],\n});\n\nexport async function loadConfig(\n configPath?: string,\n): Promise<ResolvedConfig | null> {\n try {\n const result = configPath\n ? await explorer.load(configPath)\n : await explorer.search();\n\n if (!result || !result.config) {\n return null;\n }\n\n const userConfig = result.config as UserConfig;\n const rootDir = path.dirname(result.filepath);\n\n // Resolve paths\n const endpointsPath = path.resolve(rootDir, userConfig.endpoints);\n const outputDir = path.resolve(rootDir, userConfig.output);\n\n // Set defaults based on provider\n const generateHooks = userConfig.generateHooks ?? true;\n const generateServerActions =\n userConfig.generateServerActions ?? userConfig.provider === \"nextjs\";\n const generateServerQueries =\n userConfig.generateServerQueries ?? userConfig.provider === \"nextjs\";\n const generateClient = userConfig.generateClient ?? true;\n const generatePrefetch = userConfig.generatePrefetch ?? true;\n\n return {\n ...userConfig,\n rootDir,\n endpointsPath,\n outputDir,\n generateHooks,\n generateServerActions,\n generateServerQueries,\n generateClient,\n generatePrefetch,\n };\n } catch (error) {\n throw new Error(\n `Failed to load config: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\n/**\n * Validate user config\n */\nexport function validateConfig(config: UserConfig): void {\n if (!config.endpoints) {\n throw new Error('Config error: \"endpoints\" path is required');\n }\n\n if (!config.provider) {\n throw new Error(\n 'Config error: \"provider\" must be specified (vite or nextjs)',\n );\n }\n\n if (![\"vite\", \"nextjs\"].includes(config.provider)) {\n throw new Error(\n 'Config error: \"provider\" must be either \"vite\" or \"nextjs\"',\n );\n }\n\n if (!config.output) {\n throw new Error('Config error: \"output\" directory is required');\n }\n}\n","import { createJiti } from \"jiti\";\nimport type { APIConfig } from \"@cushin/api-runtime\";\nimport type { ResolvedConfig } from \"../config/index.js\";\nimport { CodeGenerator } from \"../generators/index.js\";\nimport { fileURLToPath } from \"url\";\n\nexport class CodegenCore {\n constructor(private config: ResolvedConfig) {}\n\n async execute(): Promise<void> {\n // Load API configuration\n const apiConfig = await this.loadAPIConfig();\n\n // Store in config for generators\n this.config.apiConfig = apiConfig;\n\n // Generate code\n const generator = new CodeGenerator({\n config: this.config,\n apiConfig,\n });\n\n await generator.generate();\n }\n\n private async loadAPIConfig(): Promise<APIConfig> {\n try {\n // Use jiti to load TypeScript files\n const jiti = createJiti(fileURLToPath(import.meta.url), {\n interopDefault: true,\n });\n\n const module = (await jiti.import(this.config.endpointsPath)) as any;\n\n // Try different export patterns\n const apiConfig =\n module.apiConfig ||\n module.default?.apiConfig ||\n module.default ||\n module;\n\n if (!apiConfig || !apiConfig.endpoints) {\n throw new Error(\n 'Invalid API config: must export an object with \"endpoints\" property',\n );\n }\n\n return apiConfig;\n } catch (error) {\n throw new Error(\n `Failed to load endpoints from \"${this.config.endpointsPath}\": ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"@cushin/api-runtime\";\n\nexport class HooksGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"hooks.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const useClientDirective =\n this.context.config.options?.useClientDirective ?? true;\n 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 type { APIConfig, APIEndpoint } from \"@cushin/api-runtime\";\nimport type { ResolvedConfig } from \"../config/index.js\";\n\nexport interface GeneratorContext {\n config: ResolvedConfig;\n apiConfig: APIConfig;\n}\n\nexport abstract class BaseGenerator {\n constructor(protected context: GeneratorContext) {}\n\n abstract generate(): Promise<void>;\n\n protected isQueryEndpoint(endpoint: APIEndpoint): boolean {\n return endpoint.method === \"GET\";\n }\n\n protected isMutationEndpoint(endpoint: APIEndpoint): boolean {\n return !this.isQueryEndpoint(endpoint);\n }\n\n protected capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n\n protected getQueryTags(endpoint: APIEndpoint): string[] {\n return endpoint.tags || [];\n }\n\n protected getInvalidationTags(endpoint: APIEndpoint): string[] {\n const tags = endpoint.tags || [];\n return tags.filter((tag) => tag !== \"query\" && tag !== \"mutation\");\n }\n\n protected hasParams(endpoint: APIEndpoint): boolean {\n return !!endpoint.params;\n }\n\n protected hasQuery(endpoint: APIEndpoint): boolean {\n return !!endpoint.query;\n }\n\n protected hasBody(endpoint: APIEndpoint): boolean {\n return !!endpoint.body;\n }\n\n protected getEndpointSignature(\n name: string,\n endpoint: APIEndpoint,\n ): {\n hasParams: boolean;\n hasQuery: boolean;\n hasBody: boolean;\n paramType: string;\n queryType: string;\n bodyType: string;\n responseType: string;\n } {\n const hasParams = this.hasParams(endpoint);\n const hasQuery = this.hasQuery(endpoint);\n const hasBody = this.hasBody(endpoint);\n\n return {\n hasParams,\n hasQuery,\n hasBody,\n paramType: hasParams ? `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 \"@cushin/api-runtime\";\n\nexport class ServerActionsGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, 'actions.ts');\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, 'utf-8');\n }\n\n private generateContent(): string {\n const imports = `'use server';\n\nimport { revalidateTag, revalidatePath } from 'next/cache';\nimport { serverClient } from './server-client';\nimport type { \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 callArgs = '';\n if (signature.hasParams && signature.hasBody) {\n inputType = `input: { params: ${signature.paramType}; body: ${signature.bodyType} }`;\n callArgs = 'input.params, input.body';\n } else if (signature.hasParams) {\n inputType = `params: ${signature.paramType}`;\n callArgs = 'params';\n } else if (signature.hasBody) {\n inputType = `body: ${signature.bodyType}`;\n callArgs = '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}(${callArgs});\n\n // Revalidate related data\n${revalidateStatements}\n\n return { success: true, data: result };\n } catch (error) {\n console.error('[Server Action Error]:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n };\n }\n}`;\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"@cushin/api-runtime\";\n\nexport class ServerQueriesGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"queries.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const imports = `import { cache } from 'react';\nimport { unstable_cache } from 'next/cache';\nimport { serverClient } from './server-client';\nimport type { \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 // Build client call with proper argument handling\n let clientCall = '';\n if (signature.hasParams && signature.hasQuery) {\n clientCall = `serverClient.${name}(params, query)`;\n } else if (signature.hasParams) {\n clientCall = `serverClient.${name}(params)`;\n } else if (signature.hasQuery) {\n clientCall = `serverClient.${name}(query)`;\n } else {\n clientCall = `serverClient.${name}()`;\n }\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(\"query ? JSON.stringify(query) : 'no-query'\");\n\n return `/**\n * ${endpoint.description || `Server query for ${name}`}\n * @tags ${queryTags.join(\", \") || \"none\"}\n */\nexport const ${queryName} = cache(async (\n ${paramsList}\n): Promise<${signature.responseType}> => {\n return unstable_cache(\n async () => ${clientCall},\n [${cacheKeyParts.join(\", \")}],\n {\n tags: [${queryTags.map((tag) => `'${tag}'`).join(\", \")}],\n revalidate: 3600, // 1 hour default, can be overridden\n }\n )();\n});`;\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class TypesGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\");\n return `// Auto-generated type definitions\n// Do not edit this file manually\n\nimport type { z } from 'zod';\nimport { apiConfig } from '${relativePath}';\n\n\n// Re-export endpoint configuration types\nexport type { APIConfig, APIEndpoint, HTTPMethod } from '@cushin/api-runtime';\n\n/**\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-runtime';\nimport type { AuthCallbacks } from '@cushin/api-runtime';\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 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 `import { createAPIClient } from '@cushin/api-runtime';\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 * 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 \"@cushin/api-runtime\";\n\nexport class PrefetchGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"prefetchs.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const content = `// Auto-generated prefetch utilities\nimport { type QueryClient } from '@tanstack/react-query';\n${this.hasQueryOptions() ? \"import { apiQueryOptions } from './query-options';\" : \"\"}\nimport { 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 fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class IndexGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"index.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\");\n\n const content = `// Auto-generated exports\nexport * from './types';\nexport * from './client';\nexport * from './query-keys';\n${this.hasQueryOptions() ? \"export * from './query-options';\" : \"\"}\nexport * from './hooks';\nexport * from './prefetchs';\nexport { z } from 'zod';\nexport { apiConfig } from '${relativePath}';\n`;\n return content;\n }\n}\n","import { HooksGenerator } from \"./hooks.js\";\nimport { ServerActionsGenerator } from \"./actions.js\";\nimport { ServerQueriesGenerator } from \"./queries.js\";\nimport { TypesGenerator } from \"./types.js\";\nimport { ClientGenerator } from \"./client.js\";\nimport type { GeneratorContext } from \"./base.js\";\nimport { QueryKeysGenerator } from \"./query-keys.js\";\nimport { QueryOptionsGenerator } from \"./query-options.js\";\nimport { PrefetchGenerator } from \"./prefetch.js\";\nimport { IndexGenerator } from \"./generate-index.js\";\n\nexport class CodeGenerator {\n constructor(private context: GeneratorContext) {}\n\n async generate(): Promise<void> {\n const generators = this.getGenerators();\n\n for (const generator of generators) {\n await generator.generate();\n }\n }\n\n private getGenerators() {\n const generators: Array<any> = [];\n\n // Always generate types\n generators.push(new TypesGenerator(this.context));\n generators.push(new IndexGenerator(this.context));\n\n // Generate client if enabled\n if (this.context.config.generateClient) {\n generators.push(new ClientGenerator(this.context));\n }\n\n // Generate hooks if enabled\n if (this.context.config.generateHooks) {\n generators.push(new QueryKeysGenerator(this.context));\n generators.push(new QueryOptionsGenerator(this.context));\n generators.push(new HooksGenerator(this.context));\n }\n\n if (this.context.config.generatePrefetch) {\n generators.push(new PrefetchGenerator(this.context));\n }\n\n // Generate server actions if enabled (Next.js only)\n if (\n this.context.config.generateServerActions &&\n this.context.config.provider === \"nextjs\"\n ) {\n generators.push(new ServerActionsGenerator(this.context));\n }\n\n // Generate server queries if enabled (Next.js only)\n if (\n this.context.config.generateServerQueries &&\n this.context.config.provider === \"nextjs\"\n ) {\n generators.push(new ServerQueriesGenerator(this.context));\n }\n\n return generators;\n }\n}\n"],"mappings":"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","names":["path","path","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cushin/api-codegen",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.5",
|
|
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",
|
|
@@ -60,8 +60,8 @@
|
|
|
60
60
|
"fast-glob": "^3.3.2",
|
|
61
61
|
"jiti": "^2.6.1",
|
|
62
62
|
"ora": "^8.0.0",
|
|
63
|
-
"@cushin/api-runtime": "
|
|
64
|
-
"@cushin/codegen-cli": "
|
|
63
|
+
"@cushin/api-runtime": "3.0.0",
|
|
64
|
+
"@cushin/codegen-cli": "3.0.0"
|
|
65
65
|
},
|
|
66
66
|
"devDependencies": {
|
|
67
67
|
"@tanstack/react-query": "^5.0.0",
|