@cushin/api-codegen 5.0.5 → 5.0.7

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 CHANGED
@@ -362,7 +362,7 @@ export type ActionResult<T> =
362
362
  inputType = `body: ${bodyType}`;
363
363
  callArgs = "body";
364
364
  }
365
- const revalidateStatements = invalidationTags.length > 0 ? invalidationTags.map((tag) => ` revalidateTag('${tag}');`).join("\n") : " // No automatic revalidations";
365
+ const revalidateStatements = invalidationTags.length > 0 ? invalidationTags.map((tag) => ` revalidateTag('${tag}', 'max');`).join("\n") : " // No automatic revalidations";
366
366
  return `/**
367
367
  * ${endpoint.description || `Server action for ${name}`}
368
368
  * @tags ${endpoint.tags?.join(", ") || "none"}
@@ -593,6 +593,7 @@ export type { AuthCallbacks };
593
593
  const endpointsPath = path6.join(this.context.config.endpointsPath);
594
594
  const relativePath = path6.relative(path6.dirname(outputPath), endpointsPath).replace(/\\/g, "/").replace(/\.ts$/, "");
595
595
  return `import { createAPIClient } from '@cushin/api-runtime';
596
+ import type { AuthCallbacks } from '@cushin/api-runtime';
596
597
  import { apiConfig } from '${relativePath}';
597
598
  import type * as Types from './types';
598
599
 
@@ -601,11 +602,43 @@ type APIClientMethods = {
601
602
  ${this.generateAPIClientMethodTypes()}
602
603
  };
603
604
 
605
+ // Export singleton instance (will be initialized later if auth is needed)
606
+ export let serverClient: APIClientMethods & {
607
+ refreshAuth: () => Promise<void>;
608
+ updateAuthCallbacks: (callbacks: AuthCallbacks) => void;
609
+ };
610
+
611
+ // Initialize without auth by default
612
+ serverClient = createAPIClient(apiConfig) as any;
613
+
604
614
  /**
605
- * Server-side API client (no auth, direct API calls)
606
- * Use this in Server Components, Server Actions, and Route Handlers
615
+ * Initialize server-side API client with auth callbacks
616
+ * Call this in Server Actions or Route Handlers where you need authentication
617
+ *
618
+ * @example
619
+ * // In a Server Action or API Route:
620
+ * import { cookies } from 'next/headers';
621
+ *
622
+ * const authCallbacks = {
623
+ * getTokens: async () => {
624
+ * const token = cookies().get('auth_token')?.value;
625
+ * return token ? { accessToken: token } : null;
626
+ * },
627
+ * onAuthError: () => {
628
+ * // Handle auth error (e.g., redirect, clear cookies)
629
+ * }
630
+ * };
631
+ *
632
+ * initializeServerClient(authCallbacks);
607
633
  */
608
- export const serverClient = createAPIClient(apiConfig) as APIClientMethods;
634
+ export const initializeServerClient = (authCallbacks: AuthCallbacks) => {
635
+ serverClient = createAPIClient(apiConfig, authCallbacks) as any;
636
+ return serverClient;
637
+ };
638
+
639
+ // Export for custom usage
640
+ export { createAPIClient };
641
+ export type { AuthCallbacks };
609
642
  `;
610
643
  }
611
644
  generateAPIClientMethodTypes() {
@@ -619,23 +652,23 @@ export const serverClient = createAPIClient(apiConfig) as APIClientMethods;
619
652
  let signature = "";
620
653
  if (endpoint.method === "GET") {
621
654
  if (paramsType && queryType) {
622
- signature = `(params: ${paramsType}, query?: ${queryType}) => Promise<${responseType}>`;
655
+ signature = `(params: ${paramsType}, query?: ${queryType}, headers?: Record<string, string>) => Promise<${responseType}>`;
623
656
  } else if (paramsType) {
624
- signature = `(params: ${paramsType}) => Promise<${responseType}>`;
657
+ signature = `(params: ${paramsType}, headers?: Record<string, string>) => Promise<${responseType}>`;
625
658
  } else if (queryType) {
626
- signature = `(query?: ${queryType}) => Promise<${responseType}>`;
659
+ signature = `(query?: ${queryType}, headers?: Record<string, string>) => Promise<${responseType}>`;
627
660
  } else {
628
- signature = `() => Promise<${responseType}>`;
661
+ signature = `(headers?: Record<string, string>) => Promise<${responseType}>`;
629
662
  }
630
663
  } else {
631
664
  if (paramsType && bodyType) {
632
- signature = `(params: ${paramsType}, body: ${bodyType}) => Promise<${responseType}>`;
665
+ signature = `(params: ${paramsType}, body: ${bodyType}, headers?: Record<string, string>) => Promise<${responseType}>`;
633
666
  } else if (paramsType) {
634
- signature = `(params: ${paramsType}) => Promise<${responseType}>`;
667
+ signature = `(params: ${paramsType}, headers?: Record<string, string>) => Promise<${responseType}>`;
635
668
  } else if (bodyType) {
636
- signature = `(body: ${bodyType}) => Promise<${responseType}>`;
669
+ signature = `(body: ${bodyType}, headers?: Record<string, string>) => Promise<${responseType}>`;
637
670
  } else {
638
- signature = `() => Promise<${responseType}>`;
671
+ signature = `(headers?: Record<string, string>) => Promise<${responseType}>`;
639
672
  }
640
673
  }
641
674
  methods.push(` ${name}: ${signature};`);
@@ -653,46 +686,46 @@ export const serverClient = createAPIClient(apiConfig) as APIClientMethods;
653
686
  const bodyType = endpoint.body ? `Types.${this.getInputTypeName(name)}` : null;
654
687
  if (endpoint.method === "GET") {
655
688
  if (paramsType && queryType) {
656
- methods.push(` ${name}(params: ${paramsType}, query?: ${queryType}): Promise<${responseType}> {
689
+ methods.push(` ${name}(params: ${paramsType}, query?: ${queryType}, headers?: Record<string, string>): Promise<${responseType}> {
657
690
  if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');
658
- return baseClient.${name}(params, query);
691
+ return baseClient.${name}(params, query, headers);
659
692
  },`);
660
693
  } else if (paramsType) {
661
- methods.push(` ${name}(params: ${paramsType}): Promise<${responseType}> {
694
+ methods.push(` ${name}(params: ${paramsType}, headers?: Record<string, string>): Promise<${responseType}> {
662
695
  if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');
663
- return baseClient.${name}(params);
696
+ return baseClient.${name}(params, headers);
664
697
  },`);
665
698
  } else if (queryType) {
666
- methods.push(` ${name}(query?: ${queryType}): Promise<${responseType}> {
699
+ methods.push(` ${name}(query?: ${queryType}, headers?: Record<string, string>): Promise<${responseType}> {
667
700
  if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');
668
- return baseClient.${name}(query);
701
+ return baseClient.${name}(query, headers);
669
702
  },`);
670
703
  } else {
671
- methods.push(` ${name}(): Promise<${responseType}> {
704
+ methods.push(` ${name}(headers?: Record<string, string>): Promise<${responseType}> {
672
705
  if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');
673
- return baseClient.${name}();
706
+ return baseClient.${name}(headers);
674
707
  },`);
675
708
  }
676
709
  } else {
677
710
  if (paramsType && bodyType) {
678
- methods.push(` ${name}(params: ${paramsType}, body: ${bodyType}): Promise<${responseType}> {
711
+ methods.push(` ${name}(params: ${paramsType}, body: ${bodyType}, headers?: Record<string, string>): Promise<${responseType}> {
679
712
  if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');
680
- return baseClient.${name}(params, body);
713
+ return baseClient.${name}(params, body, headers);
681
714
  },`);
682
715
  } else if (paramsType) {
683
- methods.push(` ${name}(params: ${paramsType}): Promise<${responseType}> {
716
+ methods.push(` ${name}(params: ${paramsType}, headers?: Record<string, string>): Promise<${responseType}> {
684
717
  if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');
685
- return baseClient.${name}(params);
718
+ return baseClient.${name}(params, headers);
686
719
  },`);
687
720
  } else if (bodyType) {
688
- methods.push(` ${name}(body: ${bodyType}): Promise<${responseType}> {
721
+ methods.push(` ${name}(body: ${bodyType}, headers?: Record<string, string>): Promise<${responseType}> {
689
722
  if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');
690
- return baseClient.${name}(body);
723
+ return baseClient.${name}(body, headers);
691
724
  },`);
692
725
  } else {
693
- methods.push(` ${name}(): Promise<${responseType}> {
726
+ methods.push(` ${name}(headers?: Record<string, string>): Promise<${responseType}> {
694
727
  if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');
695
- return baseClient.${name}();
728
+ return baseClient.${name}(headers);
696
729
  },`);
697
730
  }
698
731
  }
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/config/index.ts","../src/core/codegen.ts","../src/generators/hooks.ts","../src/generators/base.ts","../src/generators/actions.ts","../src/generators/queries.ts","../src/generators/types.ts","../src/generators/client.ts","../src/generators/query-keys.ts","../src/generators/query-options.ts","../src/generators/prefetch.ts","../src/generators/generate-index.ts","../src/generators/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport { setupCLIProgram, setupGenerateCommand, setupInitCommand, setupValidateCommand } from '@cushin/codegen-cli';\nimport { loadConfig, validateConfig } from './config/index.js';\nimport { CodegenCore } from './core/codegen.js';\nimport path from 'path';\n\nconst program = new Command();\n\n// Setup base program\nsetupCLIProgram(program);\n\n// Setup commands with context\nconst context = {\n loadConfig,\n validateConfig,\n CodegenCore,\n pathToFileURL: (filePath: string) => new URL(`file://${path.resolve(filePath)}`),\n};\n\nsetupGenerateCommand(program, context);\nsetupInitCommand(program);\nsetupValidateCommand(program, context);\n\nprogram.parse();\n","import { cosmiconfig } from \"cosmiconfig\";\nimport path from \"path\";\nimport type { APIConfig } from \"@cushin/api-runtime\";\n\nexport interface UserConfig {\n /**\n * Base URL for API requests\n */\n baseUrl?: string;\n\n /**\n * Accept-Encoding header value for API requests\n * @default \"gzip, deflate, br\"\n * @example \"br, gzip, deflate\" (prioritize Brotli, exclude zstd)\n */\n acceptEncoding?: string;\n\n /**\n * Path to the endpoints configuration file\n */\n endpoints: string;\n\n /**\n * Provider type: 'vite' | 'nextjs'\n */\n provider: \"vite\" | \"nextjs\";\n\n /**\n * Output directory for generated files\n */\n output: string;\n\n /**\n * Whether to generate React Query hooks (for client-side)\n * @default true for vite, nextjs\n */\n generateHooks?: boolean;\n\n /**\n * Whether to generate server actions (Next.js only)\n * @default true for nextjs, false for vite\n */\n generateServerActions?: boolean;\n\n /**\n * Whether to generate server queries (Next.js only)\n * @default true for nextjs, false for vite\n */\n generateServerQueries?: boolean;\n\n /**\n * Whether to generate API client\n * @default true\n */\n generateClient?: boolean;\n\n /**\n * Whether to generate prefetch utilities\n * @default true\n */\n generatePrefetch?: boolean;\n\n /**\n * Custom templates directory\n */\n templatesDir?: string;\n\n /**\n * Additional options\n */\n options?: {\n /**\n * Use 'use client' directive\n */\n useClientDirective?: boolean;\n\n /**\n * Custom imports to add to generated files\n */\n customImports?: Record<string, string[]>;\n\n /**\n * Prefix for generated hook names\n */\n hookPrefix?: string;\n\n /**\n * Suffix for generated action names\n */\n actionSuffix?: string;\n };\n}\n\nexport interface ResolvedConfig extends UserConfig {\n rootDir: string;\n endpointsPath: string;\n outputDir: string;\n apiConfig?: APIConfig;\n}\n\nconst explorer = cosmiconfig(\"api-codegen\", {\n searchPlaces: [\n \"api-codegen.config.js\",\n \"api-codegen.config.mjs\",\n \"api-codegen.config.ts\",\n \"api-codegen.config.json\",\n \".api-codegenrc\",\n \".api-codegenrc.json\",\n \".api-codegenrc.js\",\n ],\n});\n\nexport async function loadConfig(\n configPath?: string,\n): Promise<ResolvedConfig | null> {\n try {\n const result = configPath\n ? await explorer.load(configPath)\n : await explorer.search();\n\n if (!result || !result.config) {\n return null;\n }\n\n const userConfig = result.config as UserConfig;\n const rootDir = path.dirname(result.filepath);\n\n // Resolve paths\n const endpointsPath = path.resolve(rootDir, userConfig.endpoints);\n const outputDir = path.resolve(rootDir, userConfig.output);\n\n // Set defaults based on provider\n const generateHooks = userConfig.generateHooks ?? true;\n const generateServerActions =\n userConfig.generateServerActions ?? userConfig.provider === \"nextjs\";\n const generateServerQueries =\n userConfig.generateServerQueries ?? userConfig.provider === \"nextjs\";\n const generateClient = userConfig.generateClient ?? true;\n const generatePrefetch = userConfig.generatePrefetch ?? true;\n\n return {\n ...userConfig,\n rootDir,\n endpointsPath,\n outputDir,\n generateHooks,\n generateServerActions,\n generateServerQueries,\n generateClient,\n generatePrefetch,\n };\n } catch (error) {\n throw new Error(\n `Failed to load config: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\n/**\n * Validate user config\n */\nexport function validateConfig(config: UserConfig): void {\n if (!config.endpoints) {\n throw new Error('Config error: \"endpoints\" path is required');\n }\n\n if (!config.provider) {\n throw new Error(\n 'Config error: \"provider\" must be specified (vite or nextjs)',\n );\n }\n\n if (![\"vite\", \"nextjs\"].includes(config.provider)) {\n throw new Error(\n 'Config error: \"provider\" must be either \"vite\" or \"nextjs\"',\n );\n }\n\n if (!config.output) {\n throw new Error('Config error: \"output\" directory is required');\n }\n}\n","import { createJiti } from \"jiti\";\nimport type { APIConfig } from \"@cushin/api-runtime\";\nimport type { ResolvedConfig } from \"../config/index.js\";\nimport { CodeGenerator } from \"../generators/index.js\";\nimport { fileURLToPath } from \"url\";\n\nexport class CodegenCore {\n constructor(private config: ResolvedConfig) {}\n\n async execute(): Promise<void> {\n // Load API configuration\n const apiConfig = await this.loadAPIConfig();\n\n // Store in config for generators\n this.config.apiConfig = apiConfig;\n\n // Generate code\n const generator = new CodeGenerator({\n config: this.config,\n apiConfig,\n });\n\n await generator.generate();\n }\n\n private async loadAPIConfig(): Promise<APIConfig> {\n try {\n // Use jiti to load TypeScript files\n const jiti = createJiti(fileURLToPath(import.meta.url), {\n interopDefault: true,\n });\n\n const module = (await jiti.import(this.config.endpointsPath)) as any;\n\n // Try different export patterns\n const apiConfig =\n module.apiConfig ||\n module.default?.apiConfig ||\n module.default ||\n module;\n\n if (!apiConfig || !apiConfig.endpoints) {\n throw new Error(\n 'Invalid API config: must export an object with \"endpoints\" property',\n );\n }\n\n // Merge acceptEncoding from user config if provided\n if (this.config.acceptEncoding) {\n apiConfig.acceptEncoding = this.config.acceptEncoding;\n }\n\n return apiConfig;\n } catch (error) {\n throw new Error(\n `Failed to load endpoints from \"${this.config.endpointsPath}\": ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"@cushin/api-runtime\";\n\nexport class HooksGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"hooks.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const useClientDirective =\n this.context.config.options?.useClientDirective ?? true;\n\n const content = `${useClientDirective ? \"'use client';\\n\" : \"\"}\nimport { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { apiClient } from \"./client\";\nimport { queryKeys } from \"./query-keys\";\nimport { apiQueryOptions } from \"./query-options\";\nimport type * as Types from \"./types\";\n\n${this.generateQueryHooks()}\n${this.generateMutationHooks()}\n`;\n\n return content;\n }\n\n private generateQueryHooks(): string {\n const hooks: string[] = [];\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n if (endpoint.method === \"GET\")\n hooks.push(this.generateQueryHook(name, endpoint));\n },\n );\n return hooks.join(\"\\n\\n\");\n }\n\n private generateQueryHook(name: string, endpoint: APIEndpoint): string {\n const hookName = `use${this.capitalize(name)}`;\n const resource = this.getResourceFromEndpoint(name, endpoint);\n const optionName = this.getEndpointKeyName(name);\n\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const queryType = endpoint.query\n ? `Types.${this.getQueryTypeName(name)}`\n : null;\n\n const params: string[] = [];\n const optionParams: string[] = [];\n\n const queryTags = this.getQueryTags(endpoint);\n\n if (paramsType) {\n params.push(`params: ${paramsType}`);\n optionParams.push(\"params\");\n }\n if (queryType) {\n params.push(`filters?: ${queryType}`);\n optionParams.push(\"filters\");\n }\n\n params.push(`options?: {\n enabled?: boolean;\n select?: <TData = ${responseType}>(data: ${responseType}) => TData;\n }`);\n\n return `/**\n * ${endpoint.description || `Query hook for ${name}`}\n * @tags ${queryTags.join(\", \") || \"none\"}\n */\nexport function ${hookName}(${params.join(\",\\n \")}) {\n return useQuery({\n ...apiQueryOptions.${resource}.${optionName}(${optionParams.join(\", \")}),\n ...options,\n });\n}`;\n }\n\n private generateMutationHooks(): string {\n const hooks: string[] = [];\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n if (endpoint.method !== \"GET\")\n hooks.push(this.generateMutationHook(name, endpoint));\n },\n );\n return hooks.join(\"\\n\\n\");\n }\n\n private generateMutationHook(name: string, endpoint: APIEndpoint): string {\n const hookName = `use${this.capitalize(name)}`;\n const resource = this.getResourceFromEndpoint(name, endpoint);\n\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const bodyType = endpoint.body ? `Types.${this.getInputTypeName(name)}` : null;\n\n const resourceHasQueries = this.resourceHasQueryEndpoints(resource);\n\n let inputType: string;\n let fnBody: string;\n\n if (paramsType && bodyType) {\n inputType = `{ params: ${paramsType}; body: ${bodyType}; }`;\n fnBody = `({ params, body }: ${inputType}) => apiClient.${name}(params, body)`;\n } else if (paramsType) {\n inputType = paramsType;\n fnBody = `(params: ${inputType}) => apiClient.${name}(params)`;\n } else if (bodyType) {\n inputType = bodyType;\n fnBody = `(body: ${inputType}) => apiClient.${name}(body)`;\n } else {\n inputType = \"void\";\n fnBody = `() => apiClient.${name}()`;\n }\n\n const invalidate = resourceHasQueries\n ? `queryClient.invalidateQueries({ queryKey: queryKeys.${resource}.all });`\n : \"\";\n\n return `/**\n * ${endpoint.description || `Mutation hook for ${name}`}\n * @tags ${endpoint.tags?.join(\", \") || \"none\"}\n */\nexport function ${hookName}(options?: {\n onSuccess?: (data: ${responseType}, variables: ${inputType}, context: unknown) => void;\n onError?: (error: Error, variables: ${inputType}, context: unknown) => void;\n onSettled?: (data: ${responseType} | undefined, error: Error | null, variables: ${inputType}, context: unknown) => void;\n onMutate?: (variables: ${inputType}) => Promise<unknown> | unknown;\n}) {\n ${invalidate ? \"const queryClient = useQueryClient();\" : \"\"}\n return useMutation({\n mutationFn: ${fnBody},\n onSuccess: (data, variables, context) => {\n ${invalidate}\n options?.onSuccess?.(data, variables, context);\n },\n onError: options?.onError,\n onSettled: options?.onSettled,\n onMutate: options?.onMutate,\n });\n}`;\n }\n}\n","import type { APIConfig, APIEndpoint } from \"@cushin/api-runtime\";\nimport type { ResolvedConfig } from \"../config/index.js\";\n\nexport interface GeneratorContext {\n config: ResolvedConfig;\n apiConfig: APIConfig;\n}\n\nexport abstract class BaseGenerator {\n constructor(protected context: GeneratorContext) {}\n\n abstract generate(): Promise<void>;\n\n protected isQueryEndpoint(endpoint: APIEndpoint): boolean {\n return endpoint.method === \"GET\";\n }\n\n protected isMutationEndpoint(endpoint: APIEndpoint): boolean {\n return !this.isQueryEndpoint(endpoint);\n }\n\n protected capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n\n protected getQueryTags(endpoint: APIEndpoint): string[] {\n return endpoint.tags || [];\n }\n\n protected getInvalidationTags(endpoint: APIEndpoint): string[] {\n const tags = endpoint.tags || [];\n return tags.filter((tag) => tag !== \"query\" && tag !== \"mutation\");\n }\n\n protected hasParams(endpoint: APIEndpoint): boolean {\n return !!endpoint.params;\n }\n\n protected hasQuery(endpoint: APIEndpoint): boolean {\n return !!endpoint.query;\n }\n\n protected hasBody(endpoint: APIEndpoint): boolean {\n return !!endpoint.body;\n }\n\n protected getEndpointSignature(\n name: string,\n endpoint: APIEndpoint,\n ): {\n hasParams: boolean;\n hasQuery: boolean;\n hasBody: boolean;\n paramType: string;\n queryType: string;\n bodyType: string;\n responseType: string;\n } {\n const hasParams = this.hasParams(endpoint);\n const hasQuery = this.hasQuery(endpoint);\n const hasBody = this.hasBody(endpoint);\n\n return {\n hasParams,\n hasQuery,\n hasBody,\n paramType: hasParams ? this.inferNonNull(`typeof apiConfig.endpoints.${name}.params`) : \"never\",\n queryType: hasQuery ? this.inferNonNull(`typeof apiConfig.endpoints.${name}.query`) : \"never\",\n bodyType: hasBody ? this.inferNonNull(`typeof apiConfig.endpoints.${name}.body`) : \"never\",\n responseType: this.inferNonNull(`typeof apiConfig.endpoints.${name}.response`),\n };\n }\n\n protected generateMutationCall(\n name: string,\n hasParams: boolean,\n hasBody: boolean,\n ): string {\n if (hasParams && hasBody) {\n return `return apiClient.${name}(input.params, input.body);`;\n } else if (hasParams) {\n return `return apiClient.${name}(input);`;\n } else if (hasBody) {\n return `return apiClient.${name}(input);`;\n } else {\n return `return apiClient.${name}();`;\n }\n }\n\n protected inferNonNull(expr: string): string {\n return `z.infer<NonNullable<${expr}>>`;\n }\n\n protected toCamelCase(str: string): string {\n return str\n .toLowerCase()\n .replace(/[-_\\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : \"\"))\n .replace(/^./, (c) => c.toLowerCase());\n }\n\n protected getResourceFromEndpoint(\n _name: string,\n endpoint: APIEndpoint,\n ): string {\n const tag = endpoint.tags?.find((t) => t !== \"query\" && t !== \"mutation\");\n if (tag) return this.toCamelCase(tag);\n const match = endpoint.path.match(/^\\/([^/]+)/);\n return match ? this.toCamelCase(match[1]) : \"general\";\n }\n\n protected groupEndpointsByResource() {\n const groups: Record<\n string,\n Array<{ name: string; endpoint: APIEndpoint }>\n > = {};\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n const res = this.getResourceFromEndpoint(name, endpoint);\n if (!groups[res]) groups[res] = [];\n groups[res].push({ name, endpoint });\n },\n );\n return groups;\n }\n\n protected resourceHasQueryEndpoints(resource: string): boolean {\n return (\n this.groupEndpointsByResource()[resource]?.some(\n ({ endpoint }) => endpoint.method === \"GET\",\n ) ?? false\n );\n }\n\n protected getEndpointKeyName(name: string): string {\n return name.startsWith(\"get\")\n ? name[3].toLowerCase() + name.slice(4)\n : name;\n }\n\n protected generateQueryKeyCall(\n resource: string,\n name: string,\n endpoint: APIEndpoint,\n ): string {\n const key = this.getEndpointKeyName(name);\n const args: string[] = [];\n if (endpoint.params) args.push(\"params\");\n if (endpoint.query) args.push(\"filters\");\n return args.length\n ? `queryKeys.${resource}.${key}(${args.join(\", \")})`\n : `queryKeys.${resource}.${key}()`;\n }\n\n protected hasQueryOptions() {\n return Object.values(this.context.apiConfig.endpoints).some(\n (e) => e.method === \"GET\",\n );\n }\n\n // Helper methods to get named type references\n protected getResponseTypeName(name: string): string {\n return `${this.capitalize(name)}Response`;\n }\n\n protected getInputTypeName(name: string): string {\n return `${this.capitalize(name)}Input`;\n }\n\n protected getQueryTypeName(name: string): string {\n return `${this.capitalize(name)}Query`;\n }\n\n protected getParamsTypeName(name: string): string {\n return `${this.capitalize(name)}Params`;\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"@cushin/api-runtime\";\n\nexport class ServerActionsGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"actions.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const imports = `'use server';\n\nimport { revalidateTag, revalidatePath } from 'next/cache';\nimport { serverClient } from './server-client';\nimport type * as Types from './types';\n\nexport type ActionResult<T> =\n | { success: true; data: T }\n | { success: false; error: string };\n`;\n\n const actions: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n if (this.isMutationEndpoint(endpoint)) {\n actions.push(this.generateServerAction(name, endpoint));\n }\n },\n );\n\n return imports + \"\\n\" + actions.join(\"\\n\\n\");\n }\n\n private generateServerAction(name: string, endpoint: APIEndpoint): string {\n const actionSuffix = this.context.config.options?.actionSuffix || \"Action\";\n const actionName = `${name}${actionSuffix}`;\n const invalidationTags = this.getInvalidationTags(endpoint);\n\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const bodyType = endpoint.body ? `Types.${this.getInputTypeName(name)}` : null;\n\n let inputType = \"\";\n let callArgs = \"\";\n if (paramsType && bodyType) {\n inputType = `input: { params: ${paramsType}; body: ${bodyType} }`;\n callArgs = \"input.params, input.body\";\n } else if (paramsType) {\n inputType = `params: ${paramsType}`;\n callArgs = \"params\";\n } else if (bodyType) {\n inputType = `body: ${bodyType}`;\n callArgs = \"body\";\n }\n\n const revalidateStatements =\n invalidationTags.length > 0\n ? invalidationTags\n .map((tag) => ` revalidateTag('${tag}');`)\n .join(\"\\n\")\n : \" // No automatic revalidations\";\n\n return `/**\n * ${endpoint.description || `Server action for ${name}`}\n * @tags ${endpoint.tags?.join(\", \") || \"none\"}\n */\nexport async function ${actionName}(\n ${inputType}\n): Promise<ActionResult<${responseType}>> {\n try {\n const result = await (serverClient as any).${name}(${callArgs});\n\n // Revalidate related data\n${revalidateStatements}\n\n return { success: true, data: result };\n } catch (error) {\n console.error('[Server Action Error]:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n };\n }\n}`;\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"@cushin/api-runtime\";\n\nexport class ServerQueriesGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"queries.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const imports = `import { cache } from 'react';\nimport { unstable_cache } from 'next/cache';\nimport { serverClient } from './server-client';\nimport type * as Types from './types';\n`;\n\n const queries: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n if (this.isQueryEndpoint(endpoint)) {\n queries.push(this.generateServerQuery(name, endpoint));\n }\n },\n );\n\n return imports + \"\\n\" + queries.join(\"\\n\\n\");\n }\n\n private generateServerQuery(name: string, endpoint: APIEndpoint): string {\n const queryName = `${name}Query`;\n const queryTags = this.getQueryTags(endpoint);\n\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const queryType = endpoint.query\n ? `Types.${this.getQueryTypeName(name)}`\n : null;\n\n const paramDef = paramsType ? `params: ${paramsType}` : \"\";\n const queryDef = queryType ? `query?: ${queryType}` : \"\";\n const paramsList = [paramDef, queryDef].filter(Boolean).join(\",\\n \");\n\n // Build client call with proper argument handling\n let clientCall = \"\";\n if (paramsType && queryType) {\n clientCall = `(serverClient as any).${name}(params, query)`;\n } else if (paramsType) {\n clientCall = `(serverClient as any).${name}(params)`;\n } else if (queryType) {\n clientCall = `(serverClient as any).${name}(query)`;\n } else {\n clientCall = `(serverClient as any).${name}()`;\n }\n\n // Generate cache key based on params\n const cacheKeyParts: string[] = [`'${name}'`];\n if (paramsType) cacheKeyParts.push(\"JSON.stringify(params)\");\n if (queryType)\n cacheKeyParts.push(\"query ? JSON.stringify(query) : 'no-query'\");\n\n return `/**\n * ${endpoint.description || `Server query for ${name}`}\n * @tags ${queryTags.join(\", \") || \"none\"}\n */\nexport const ${queryName} = cache(async (\n ${paramsList}\n): Promise<${responseType}> => {\n return unstable_cache(\n async () => ${clientCall},\n [${cacheKeyParts.join(\", \")}],\n {\n tags: [${queryTags.map((tag) => `'${tag}'`).join(\", \")}],\n revalidate: 3600, // 1 hour default, can be overridden\n }\n )();\n});`;\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class TypesGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.ts$/, \"\");\n\n return `// Auto-generated type definitions\n// Do not edit this file manually\n\nimport type { z } from 'zod';\nimport { apiConfig } from '${relativePath}';\n\n\n// Re-export endpoint configuration types\nexport type { APIConfig, APIEndpoint, HTTPMethod } from '@cushin/api-runtime';\n\n${this.generateEndpointTypes()}\n`;\n }\n\n private generateEndpointTypes(): string {\n const types: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n const cap = this.capitalize(name);\n\n // Always generate Response type\n types.push(\n `export type ${cap}Response = z.infer<NonNullable<typeof apiConfig.endpoints.${name}.response>>;`,\n );\n\n // Generate Input type for body (if exists)\n if (endpoint.body) {\n types.push(\n `export type ${cap}Input = z.infer<NonNullable<typeof apiConfig.endpoints.${name}.body>>;`,\n );\n }\n\n // Generate Query type (if exists)\n if (endpoint.query) {\n types.push(\n `export type ${cap}Query = z.infer<NonNullable<typeof apiConfig.endpoints.${name}.query>>;`,\n );\n }\n\n // Generate Params type (if exists)\n if (endpoint.params) {\n types.push(\n `export type ${cap}Params = z.infer<NonNullable<typeof apiConfig.endpoints.${name}.params>>;`,\n );\n }\n },\n );\n\n return types.join(\"\\n\");\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class ClientGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n await this.generateClientFile();\n\n if (this.context.config.provider === \"nextjs\") {\n await this.generateServerClientFile();\n }\n }\n\n private async generateClientFile(): Promise<void> {\n const content = this.generateClientContent();\n const outputPath = path.join(this.context.config.outputDir, \"client.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private async generateServerClientFile(): Promise<void> {\n const content = this.generateServerClientContent();\n const outputPath = path.join(\n this.context.config.outputDir,\n \"server-client.ts\",\n );\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateClientContent(): string {\n const useClientDirective =\n this.context.config.options?.useClientDirective ?? true;\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.ts$/, \"\");\n\n return `${useClientDirective ? \"'use client';\\n\" : \"\"}\nimport { createAPIClient } from '@cushin/api-runtime';\nimport type { AuthCallbacks } from '@cushin/api-runtime';\nimport { apiConfig } from '${relativePath}';\nimport type * as Types from './types';\n\n// Type the methods based on generated types\ntype APIClientMethods = {\n${this.generateAPIClientMethodTypes()}\n};\n\n// Export singleton instance (will be initialized later)\nexport let baseClient: APIClientMethods & {\n refreshAuth: () => Promise<void>;\n updateAuthCallbacks: (callbacks: AuthCallbacks) => void;\n};\n\nexport const apiClient = {\n${this.generateApiClientMethods()}\n};\n\n/**\n * Initialize API client with auth callbacks\n * Call this function in your auth provider setup\n *\n * @example\n * const authCallbacks = {\n * getTokens: () => getStoredTokens(),\n * onAuthError: () => router.push('/login'),\n * onRefreshToken: async () => {\n * await refreshAccessToken();\n * },\n * };\n *\n * initializeAPIClient(authCallbacks);\n */\nexport const initializeAPIClient = (authCallbacks: AuthCallbacks) => {\n baseClient = createAPIClient(apiConfig, authCallbacks) as any;\n return baseClient;\n};\n\n// Export for custom usage\nexport { createAPIClient };\nexport type { AuthCallbacks };\n`;\n }\n\n private generateServerClientContent(): string {\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.ts$/, \"\");\n\n return `import { createAPIClient } from '@cushin/api-runtime';\nimport { apiConfig } from '${relativePath}';\nimport type * as Types from './types';\n\n// Type the methods based on generated types\ntype APIClientMethods = {\n${this.generateAPIClientMethodTypes()}\n};\n\n/**\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 generateAPIClientMethodTypes(): string {\n const methods: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const queryType = endpoint.query\n ? `Types.${this.getQueryTypeName(name)}`\n : null;\n const bodyType = endpoint.body\n ? `Types.${this.getInputTypeName(name)}`\n : null;\n\n let signature = \"\";\n if (endpoint.method === \"GET\") {\n if (paramsType && queryType) {\n signature = `(params: ${paramsType}, query?: ${queryType}) => Promise<${responseType}>`;\n } else if (paramsType) {\n signature = `(params: ${paramsType}) => Promise<${responseType}>`;\n } else if (queryType) {\n signature = `(query?: ${queryType}) => Promise<${responseType}>`;\n } else {\n signature = `() => Promise<${responseType}>`;\n }\n } else {\n if (paramsType && bodyType) {\n signature = `(params: ${paramsType}, body: ${bodyType}) => Promise<${responseType}>`;\n } else if (paramsType) {\n signature = `(params: ${paramsType}) => Promise<${responseType}>`;\n } else if (bodyType) {\n signature = `(body: ${bodyType}) => Promise<${responseType}>`;\n } else {\n signature = `() => Promise<${responseType}>`;\n }\n }\n\n methods.push(` ${name}: ${signature};`);\n },\n );\n\n return methods.join(\"\\n\");\n }\n\n private generateApiClientMethods(): string {\n const methods: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const queryType = endpoint.query\n ? `Types.${this.getQueryTypeName(name)}`\n : null;\n const bodyType = endpoint.body\n ? `Types.${this.getInputTypeName(name)}`\n : null;\n\n if (endpoint.method === \"GET\") {\n if (paramsType && queryType) {\n methods.push(` ${name}(params: ${paramsType}, query?: ${queryType}): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(params, query);\n },`);\n } else if (paramsType) {\n methods.push(` ${name}(params: ${paramsType}): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(params);\n },`);\n } else if (queryType) {\n methods.push(` ${name}(query?: ${queryType}): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(query);\n },`);\n } else {\n methods.push(` ${name}(): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}();\n },`);\n }\n } else {\n if (paramsType && bodyType) {\n methods.push(` ${name}(params: ${paramsType}, body: ${bodyType}): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(params, body);\n },`);\n } else if (paramsType) {\n methods.push(` ${name}(params: ${paramsType}): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(params);\n },`);\n } else if (bodyType) {\n methods.push(` ${name}(body: ${bodyType}): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(body);\n },`);\n } else {\n methods.push(` ${name}(): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}();\n },`);\n }\n }\n },\n );\n\n return methods.join(\"\\n\");\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class QueryKeysGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(\n this.context.config.outputDir,\n \"query-keys.ts\",\n );\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.ts$/, \"\");\n\n const content = `// Auto-generated query keys\nimport type * as Types from './types';\n\nexport const queryKeys = {\n${this.generateQueryKeysContent()}\n} as const;\n`;\n return content;\n }\n\n private generateQueryKeysContent(): string {\n const resourceGroups = this.groupEndpointsByResource();\n const keys: string[] = [];\n\n Object.entries(resourceGroups).forEach(([resource, endpoints]) => {\n const queryEndpoints = endpoints.filter(\n ({ endpoint }) => endpoint.method === \"GET\",\n );\n if (queryEndpoints.length === 0) return;\n\n const resourceKeys: string[] = [` all: ['${resource}'] as const,`];\n const added = new Set<string>();\n\n queryEndpoints.forEach(({ name, endpoint }) => {\n const keyName = this.getEndpointKeyName(name);\n if (added.has(keyName)) return;\n\n if (endpoint.params || endpoint.query) {\n const params: string[] = [];\n if (endpoint.params)\n params.push(`params?: Types.${this.getParamsTypeName(name)}`);\n if (endpoint.query)\n params.push(`query?: Types.${this.getQueryTypeName(name)}`);\n\n resourceKeys.push(` ${keyName}: (${params.join(\", \")}) =>\n ['${resource}', '${keyName}', ${endpoint.params ? \"params\" : \"undefined\"}, ${endpoint.query ? \"query\" : \"undefined\"}] as const,`);\n } else {\n resourceKeys.push(\n ` ${keyName}: () => ['${resource}', '${keyName}'] as const,`,\n );\n }\n added.add(keyName);\n });\n\n keys.push(` ${resource}: {\\n${resourceKeys.join(\"\\n\")}\\n },`);\n });\n\n return keys.join(\"\\n\");\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class QueryOptionsGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(\n this.context.config.outputDir,\n \"query-options.ts\",\n );\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n private generateContent(): string {\n const content = `// Auto-generated query options\nimport { queryOptions } from '@tanstack/react-query';\nimport { apiClient } from './client';\nimport { queryKeys } from './query-keys';\nimport type * as Types from './types';\n\n${this.generateQueryOptionsContent()}\n\nexport const apiQueryOptions = {\n${this.generateQueryOptionsExports()}\n} as const;\n`;\n\n return content;\n }\n\n private generateQueryOptionsContent(): string {\n const groups = this.groupEndpointsByResource();\n const options: string[] = [];\n\n Object.entries(groups).forEach(([resource, endpoints]) => {\n const queries = endpoints.filter(\n ({ endpoint }) => endpoint.method === \"GET\",\n );\n if (queries.length === 0) return;\n\n const resourceOptions: string[] = [];\n queries.forEach(({ name, endpoint }) => {\n const optionName = this.getEndpointKeyName(name);\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const queryType = endpoint.query\n ? `Types.${this.getQueryTypeName(name)}`\n : null;\n\n const params: string[] = [];\n let apiCall = \"\";\n\n if (paramsType && queryType) {\n params.push(`params: ${paramsType}`, `filters?: ${queryType}`);\n apiCall = `apiClient.${name}(params, filters)`;\n } else if (paramsType) {\n params.push(`params: ${paramsType}`);\n apiCall = `apiClient.${name}(params)`;\n } else if (queryType) {\n params.push(`filters?: ${queryType}`);\n apiCall = `apiClient.${name}(filters)`;\n } else {\n apiCall = `apiClient.${name}()`;\n }\n\n const keyCall = this.generateQueryKeyCall(resource, name, endpoint);\n\n resourceOptions.push(` ${optionName}: (${params.join(\", \")}) =>\n queryOptions({\n queryKey: ${keyCall},\n queryFn: (): Promise<${responseType}> => ${apiCall},\n staleTime: 1000 * 60 * 5,\n }),`);\n });\n\n options.push(\n `const ${resource}QueryOptions = {\\n${resourceOptions.join(\"\\n\")}\\n};\\n`,\n );\n });\n\n return options.join(\"\\n\");\n }\n\n private generateQueryOptionsExports(): string {\n const groups = this.groupEndpointsByResource();\n const exports: string[] = [];\n\n Object.keys(groups).forEach((resource) => {\n const hasQueries = groups[resource].some(\n ({ endpoint }) => endpoint.method === \"GET\",\n );\n if (hasQueries) exports.push(` ${resource}: ${resource}QueryOptions,`);\n });\n\n return exports.join(\"\\n\");\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"@cushin/api-runtime\";\n\nexport class PrefetchGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"prefetchs.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const content = `// Auto-generated prefetch utilities\nimport { type QueryClient } from '@tanstack/react-query';\n${this.hasQueryOptions() ? \"import { apiQueryOptions } from './query-options';\" : \"\"}\nimport type * as Types from './types';\n\n${this.generatePrefetchFunctions()}\n`;\n return content;\n }\n\n private generatePrefetchFunctions(): string {\n const funcs: string[] = [];\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n if (endpoint.method === \"GET\")\n funcs.push(this.generatePrefetchFunction(name, endpoint));\n },\n );\n return funcs.join(\"\\n\\n\");\n }\n\n private generatePrefetchFunction(\n name: string,\n endpoint: APIEndpoint,\n ): string {\n const prefetchName = `prefetch${this.capitalize(name)}`;\n const resource = this.getResourceFromEndpoint(name, endpoint);\n const optionName = this.getEndpointKeyName(name);\n\n const params: string[] = [\"queryClient: QueryClient\"];\n const optionParams: string[] = [];\n\n if (endpoint.params) {\n params.push(`params: Types.${this.getParamsTypeName(name)}`);\n optionParams.push(\"params\");\n }\n if (endpoint.query) {\n params.push(`filters?: Types.${this.getQueryTypeName(name)}`);\n optionParams.push(\"filters\");\n }\n\n return `export const ${prefetchName} = async (${params.join(\",\\n \")}) => {\n return await queryClient.ensureQueryData(apiQueryOptions.${resource}.${optionName}(${optionParams.join(\", \")}));\n};`;\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class IndexGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"index.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.ts$/, \"\");\n\n const content = `// Auto-generated exports\nexport * from './types';\nexport * from './client';\nexport * from './query-keys';\n${this.hasQueryOptions() ? \"export * from './query-options';\" : \"\"}\nexport * from './hooks';\nexport * from './prefetchs';\nexport { z } from 'zod';\nexport { apiConfig } from '${relativePath}';\n`;\n return content;\n }\n}\n","import { HooksGenerator } from \"./hooks.js\";\nimport { ServerActionsGenerator } from \"./actions.js\";\nimport { ServerQueriesGenerator } from \"./queries.js\";\nimport { TypesGenerator } from \"./types.js\";\nimport { ClientGenerator } from \"./client.js\";\nimport type { GeneratorContext } from \"./base.js\";\nimport { QueryKeysGenerator } from \"./query-keys.js\";\nimport { QueryOptionsGenerator } from \"./query-options.js\";\nimport { PrefetchGenerator } from \"./prefetch.js\";\nimport { IndexGenerator } from \"./generate-index.js\";\n\nexport class CodeGenerator {\n constructor(private context: GeneratorContext) {}\n\n async generate(): Promise<void> {\n const generators = this.getGenerators();\n\n for (const generator of generators) {\n await generator.generate();\n }\n }\n\n private getGenerators() {\n const generators: Array<any> = [];\n\n // Always generate types\n generators.push(new TypesGenerator(this.context));\n generators.push(new IndexGenerator(this.context));\n\n // Generate client if enabled\n if (this.context.config.generateClient) {\n generators.push(new ClientGenerator(this.context));\n }\n\n // Generate hooks if enabled\n if (this.context.config.generateHooks) {\n generators.push(new QueryKeysGenerator(this.context));\n generators.push(new QueryOptionsGenerator(this.context));\n generators.push(new HooksGenerator(this.context));\n }\n\n if (this.context.config.generatePrefetch) {\n generators.push(new PrefetchGenerator(this.context));\n }\n\n // Generate server actions if enabled (Next.js only)\n if (\n this.context.config.generateServerActions &&\n this.context.config.provider === \"nextjs\"\n ) {\n generators.push(new ServerActionsGenerator(this.context));\n }\n\n // Generate server queries if enabled (Next.js only)\n if (\n this.context.config.generateServerQueries &&\n this.context.config.provider === \"nextjs\"\n ) {\n generators.push(new ServerQueriesGenerator(this.context));\n }\n\n return generators;\n }\n}\n"],"mappings":"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","names":["path","context","path","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","fs","path","path","fs","context","path"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/config/index.ts","../src/core/codegen.ts","../src/generators/hooks.ts","../src/generators/base.ts","../src/generators/actions.ts","../src/generators/queries.ts","../src/generators/types.ts","../src/generators/client.ts","../src/generators/query-keys.ts","../src/generators/query-options.ts","../src/generators/prefetch.ts","../src/generators/generate-index.ts","../src/generators/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport { setupCLIProgram, setupGenerateCommand, setupInitCommand, setupValidateCommand } from '@cushin/codegen-cli';\nimport { loadConfig, validateConfig } from './config/index.js';\nimport { CodegenCore } from './core/codegen.js';\nimport path from 'path';\n\nconst program = new Command();\n\n// Setup base program\nsetupCLIProgram(program);\n\n// Setup commands with context\nconst context = {\n loadConfig,\n validateConfig,\n CodegenCore,\n pathToFileURL: (filePath: string) => new URL(`file://${path.resolve(filePath)}`),\n};\n\nsetupGenerateCommand(program, context);\nsetupInitCommand(program);\nsetupValidateCommand(program, context);\n\nprogram.parse();\n","import { cosmiconfig } from \"cosmiconfig\";\nimport path from \"path\";\nimport type { APIConfig } from \"@cushin/api-runtime\";\n\nexport interface UserConfig {\n /**\n * Base URL for API requests\n */\n baseUrl?: string;\n\n /**\n * Accept-Encoding header value for API requests\n * @default \"gzip, deflate, br\"\n * @example \"br, gzip, deflate\" (prioritize Brotli, exclude zstd)\n */\n acceptEncoding?: string;\n\n /**\n * Path to the endpoints configuration file\n */\n endpoints: string;\n\n /**\n * Provider type: 'vite' | 'nextjs'\n */\n provider: \"vite\" | \"nextjs\";\n\n /**\n * Output directory for generated files\n */\n output: string;\n\n /**\n * Whether to generate React Query hooks (for client-side)\n * @default true for vite, nextjs\n */\n generateHooks?: boolean;\n\n /**\n * Whether to generate server actions (Next.js only)\n * @default true for nextjs, false for vite\n */\n generateServerActions?: boolean;\n\n /**\n * Whether to generate server queries (Next.js only)\n * @default true for nextjs, false for vite\n */\n generateServerQueries?: boolean;\n\n /**\n * Whether to generate API client\n * @default true\n */\n generateClient?: boolean;\n\n /**\n * Whether to generate prefetch utilities\n * @default true\n */\n generatePrefetch?: boolean;\n\n /**\n * Custom templates directory\n */\n templatesDir?: string;\n\n /**\n * Additional options\n */\n options?: {\n /**\n * Use 'use client' directive\n */\n useClientDirective?: boolean;\n\n /**\n * Custom imports to add to generated files\n */\n customImports?: Record<string, string[]>;\n\n /**\n * Prefix for generated hook names\n */\n hookPrefix?: string;\n\n /**\n * Suffix for generated action names\n */\n actionSuffix?: string;\n };\n}\n\nexport interface ResolvedConfig extends UserConfig {\n rootDir: string;\n endpointsPath: string;\n outputDir: string;\n apiConfig?: APIConfig;\n}\n\nconst explorer = cosmiconfig(\"api-codegen\", {\n searchPlaces: [\n \"api-codegen.config.js\",\n \"api-codegen.config.mjs\",\n \"api-codegen.config.ts\",\n \"api-codegen.config.json\",\n \".api-codegenrc\",\n \".api-codegenrc.json\",\n \".api-codegenrc.js\",\n ],\n});\n\nexport async function loadConfig(\n configPath?: string,\n): Promise<ResolvedConfig | null> {\n try {\n const result = configPath\n ? await explorer.load(configPath)\n : await explorer.search();\n\n if (!result || !result.config) {\n return null;\n }\n\n const userConfig = result.config as UserConfig;\n const rootDir = path.dirname(result.filepath);\n\n // Resolve paths\n const endpointsPath = path.resolve(rootDir, userConfig.endpoints);\n const outputDir = path.resolve(rootDir, userConfig.output);\n\n // Set defaults based on provider\n const generateHooks = userConfig.generateHooks ?? true;\n const generateServerActions =\n userConfig.generateServerActions ?? userConfig.provider === \"nextjs\";\n const generateServerQueries =\n userConfig.generateServerQueries ?? userConfig.provider === \"nextjs\";\n const generateClient = userConfig.generateClient ?? true;\n const generatePrefetch = userConfig.generatePrefetch ?? true;\n\n return {\n ...userConfig,\n rootDir,\n endpointsPath,\n outputDir,\n generateHooks,\n generateServerActions,\n generateServerQueries,\n generateClient,\n generatePrefetch,\n };\n } catch (error) {\n throw new Error(\n `Failed to load config: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\n/**\n * Validate user config\n */\nexport function validateConfig(config: UserConfig): void {\n if (!config.endpoints) {\n throw new Error('Config error: \"endpoints\" path is required');\n }\n\n if (!config.provider) {\n throw new Error(\n 'Config error: \"provider\" must be specified (vite or nextjs)',\n );\n }\n\n if (![\"vite\", \"nextjs\"].includes(config.provider)) {\n throw new Error(\n 'Config error: \"provider\" must be either \"vite\" or \"nextjs\"',\n );\n }\n\n if (!config.output) {\n throw new Error('Config error: \"output\" directory is required');\n }\n}\n","import { createJiti } from \"jiti\";\nimport type { APIConfig } from \"@cushin/api-runtime\";\nimport type { ResolvedConfig } from \"../config/index.js\";\nimport { CodeGenerator } from \"../generators/index.js\";\nimport { fileURLToPath } from \"url\";\n\nexport class CodegenCore {\n constructor(private config: ResolvedConfig) {}\n\n async execute(): Promise<void> {\n // Load API configuration\n const apiConfig = await this.loadAPIConfig();\n\n // Store in config for generators\n this.config.apiConfig = apiConfig;\n\n // Generate code\n const generator = new CodeGenerator({\n config: this.config,\n apiConfig,\n });\n\n await generator.generate();\n }\n\n private async loadAPIConfig(): Promise<APIConfig> {\n try {\n // Use jiti to load TypeScript files\n const jiti = createJiti(fileURLToPath(import.meta.url), {\n interopDefault: true,\n });\n\n const module = (await jiti.import(this.config.endpointsPath)) as any;\n\n // Try different export patterns\n const apiConfig =\n module.apiConfig ||\n module.default?.apiConfig ||\n module.default ||\n module;\n\n if (!apiConfig || !apiConfig.endpoints) {\n throw new Error(\n 'Invalid API config: must export an object with \"endpoints\" property',\n );\n }\n\n // Merge acceptEncoding from user config if provided\n if (this.config.acceptEncoding) {\n apiConfig.acceptEncoding = this.config.acceptEncoding;\n }\n\n return apiConfig;\n } catch (error) {\n throw new Error(\n `Failed to load endpoints from \"${this.config.endpointsPath}\": ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"@cushin/api-runtime\";\n\nexport class HooksGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"hooks.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const useClientDirective =\n this.context.config.options?.useClientDirective ?? true;\n\n const content = `${useClientDirective ? \"'use client';\\n\" : \"\"}\nimport { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { apiClient } from \"./client\";\nimport { queryKeys } from \"./query-keys\";\nimport { apiQueryOptions } from \"./query-options\";\nimport type * as Types from \"./types\";\n\n${this.generateQueryHooks()}\n${this.generateMutationHooks()}\n`;\n\n return content;\n }\n\n private generateQueryHooks(): string {\n const hooks: string[] = [];\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n if (endpoint.method === \"GET\")\n hooks.push(this.generateQueryHook(name, endpoint));\n },\n );\n return hooks.join(\"\\n\\n\");\n }\n\n private generateQueryHook(name: string, endpoint: APIEndpoint): string {\n const hookName = `use${this.capitalize(name)}`;\n const resource = this.getResourceFromEndpoint(name, endpoint);\n const optionName = this.getEndpointKeyName(name);\n\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const queryType = endpoint.query\n ? `Types.${this.getQueryTypeName(name)}`\n : null;\n\n const params: string[] = [];\n const optionParams: string[] = [];\n\n const queryTags = this.getQueryTags(endpoint);\n\n if (paramsType) {\n params.push(`params: ${paramsType}`);\n optionParams.push(\"params\");\n }\n if (queryType) {\n params.push(`filters?: ${queryType}`);\n optionParams.push(\"filters\");\n }\n\n params.push(`options?: {\n enabled?: boolean;\n select?: <TData = ${responseType}>(data: ${responseType}) => TData;\n }`);\n\n return `/**\n * ${endpoint.description || `Query hook for ${name}`}\n * @tags ${queryTags.join(\", \") || \"none\"}\n */\nexport function ${hookName}(${params.join(\",\\n \")}) {\n return useQuery({\n ...apiQueryOptions.${resource}.${optionName}(${optionParams.join(\", \")}),\n ...options,\n });\n}`;\n }\n\n private generateMutationHooks(): string {\n const hooks: string[] = [];\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n if (endpoint.method !== \"GET\")\n hooks.push(this.generateMutationHook(name, endpoint));\n },\n );\n return hooks.join(\"\\n\\n\");\n }\n\n private generateMutationHook(name: string, endpoint: APIEndpoint): string {\n const hookName = `use${this.capitalize(name)}`;\n const resource = this.getResourceFromEndpoint(name, endpoint);\n\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const bodyType = endpoint.body ? `Types.${this.getInputTypeName(name)}` : null;\n\n const resourceHasQueries = this.resourceHasQueryEndpoints(resource);\n\n let inputType: string;\n let fnBody: string;\n\n if (paramsType && bodyType) {\n inputType = `{ params: ${paramsType}; body: ${bodyType}; }`;\n fnBody = `({ params, body }: ${inputType}) => apiClient.${name}(params, body)`;\n } else if (paramsType) {\n inputType = paramsType;\n fnBody = `(params: ${inputType}) => apiClient.${name}(params)`;\n } else if (bodyType) {\n inputType = bodyType;\n fnBody = `(body: ${inputType}) => apiClient.${name}(body)`;\n } else {\n inputType = \"void\";\n fnBody = `() => apiClient.${name}()`;\n }\n\n const invalidate = resourceHasQueries\n ? `queryClient.invalidateQueries({ queryKey: queryKeys.${resource}.all });`\n : \"\";\n\n return `/**\n * ${endpoint.description || `Mutation hook for ${name}`}\n * @tags ${endpoint.tags?.join(\", \") || \"none\"}\n */\nexport function ${hookName}(options?: {\n onSuccess?: (data: ${responseType}, variables: ${inputType}, context: unknown) => void;\n onError?: (error: Error, variables: ${inputType}, context: unknown) => void;\n onSettled?: (data: ${responseType} | undefined, error: Error | null, variables: ${inputType}, context: unknown) => void;\n onMutate?: (variables: ${inputType}) => Promise<unknown> | unknown;\n}) {\n ${invalidate ? \"const queryClient = useQueryClient();\" : \"\"}\n return useMutation({\n mutationFn: ${fnBody},\n onSuccess: (data, variables, context) => {\n ${invalidate}\n options?.onSuccess?.(data, variables, context);\n },\n onError: options?.onError,\n onSettled: options?.onSettled,\n onMutate: options?.onMutate,\n });\n}`;\n }\n}\n","import type { APIConfig, APIEndpoint } from \"@cushin/api-runtime\";\nimport type { ResolvedConfig } from \"../config/index.js\";\n\nexport interface GeneratorContext {\n config: ResolvedConfig;\n apiConfig: APIConfig;\n}\n\nexport abstract class BaseGenerator {\n constructor(protected context: GeneratorContext) {}\n\n abstract generate(): Promise<void>;\n\n protected isQueryEndpoint(endpoint: APIEndpoint): boolean {\n return endpoint.method === \"GET\";\n }\n\n protected isMutationEndpoint(endpoint: APIEndpoint): boolean {\n return !this.isQueryEndpoint(endpoint);\n }\n\n protected capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n\n protected getQueryTags(endpoint: APIEndpoint): string[] {\n return endpoint.tags || [];\n }\n\n protected getInvalidationTags(endpoint: APIEndpoint): string[] {\n const tags = endpoint.tags || [];\n return tags.filter((tag) => tag !== \"query\" && tag !== \"mutation\");\n }\n\n protected hasParams(endpoint: APIEndpoint): boolean {\n return !!endpoint.params;\n }\n\n protected hasQuery(endpoint: APIEndpoint): boolean {\n return !!endpoint.query;\n }\n\n protected hasBody(endpoint: APIEndpoint): boolean {\n return !!endpoint.body;\n }\n\n protected getEndpointSignature(\n name: string,\n endpoint: APIEndpoint,\n ): {\n hasParams: boolean;\n hasQuery: boolean;\n hasBody: boolean;\n paramType: string;\n queryType: string;\n bodyType: string;\n responseType: string;\n } {\n const hasParams = this.hasParams(endpoint);\n const hasQuery = this.hasQuery(endpoint);\n const hasBody = this.hasBody(endpoint);\n\n return {\n hasParams,\n hasQuery,\n hasBody,\n paramType: hasParams ? this.inferNonNull(`typeof apiConfig.endpoints.${name}.params`) : \"never\",\n queryType: hasQuery ? this.inferNonNull(`typeof apiConfig.endpoints.${name}.query`) : \"never\",\n bodyType: hasBody ? this.inferNonNull(`typeof apiConfig.endpoints.${name}.body`) : \"never\",\n responseType: this.inferNonNull(`typeof apiConfig.endpoints.${name}.response`),\n };\n }\n\n protected generateMutationCall(\n name: string,\n hasParams: boolean,\n hasBody: boolean,\n ): string {\n if (hasParams && hasBody) {\n return `return apiClient.${name}(input.params, input.body);`;\n } else if (hasParams) {\n return `return apiClient.${name}(input);`;\n } else if (hasBody) {\n return `return apiClient.${name}(input);`;\n } else {\n return `return apiClient.${name}();`;\n }\n }\n\n protected inferNonNull(expr: string): string {\n return `z.infer<NonNullable<${expr}>>`;\n }\n\n protected toCamelCase(str: string): string {\n return str\n .toLowerCase()\n .replace(/[-_\\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : \"\"))\n .replace(/^./, (c) => c.toLowerCase());\n }\n\n protected getResourceFromEndpoint(\n _name: string,\n endpoint: APIEndpoint,\n ): string {\n const tag = endpoint.tags?.find((t) => t !== \"query\" && t !== \"mutation\");\n if (tag) return this.toCamelCase(tag);\n const match = endpoint.path.match(/^\\/([^/]+)/);\n return match ? this.toCamelCase(match[1]) : \"general\";\n }\n\n protected groupEndpointsByResource() {\n const groups: Record<\n string,\n Array<{ name: string; endpoint: APIEndpoint }>\n > = {};\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n const res = this.getResourceFromEndpoint(name, endpoint);\n if (!groups[res]) groups[res] = [];\n groups[res].push({ name, endpoint });\n },\n );\n return groups;\n }\n\n protected resourceHasQueryEndpoints(resource: string): boolean {\n return (\n this.groupEndpointsByResource()[resource]?.some(\n ({ endpoint }) => endpoint.method === \"GET\",\n ) ?? false\n );\n }\n\n protected getEndpointKeyName(name: string): string {\n return name.startsWith(\"get\")\n ? name[3].toLowerCase() + name.slice(4)\n : name;\n }\n\n protected generateQueryKeyCall(\n resource: string,\n name: string,\n endpoint: APIEndpoint,\n ): string {\n const key = this.getEndpointKeyName(name);\n const args: string[] = [];\n if (endpoint.params) args.push(\"params\");\n if (endpoint.query) args.push(\"filters\");\n return args.length\n ? `queryKeys.${resource}.${key}(${args.join(\", \")})`\n : `queryKeys.${resource}.${key}()`;\n }\n\n protected hasQueryOptions() {\n return Object.values(this.context.apiConfig.endpoints).some(\n (e) => e.method === \"GET\",\n );\n }\n\n // Helper methods to get named type references\n protected getResponseTypeName(name: string): string {\n return `${this.capitalize(name)}Response`;\n }\n\n protected getInputTypeName(name: string): string {\n return `${this.capitalize(name)}Input`;\n }\n\n protected getQueryTypeName(name: string): string {\n return `${this.capitalize(name)}Query`;\n }\n\n protected getParamsTypeName(name: string): string {\n return `${this.capitalize(name)}Params`;\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"@cushin/api-runtime\";\n\nexport class ServerActionsGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"actions.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const imports = `'use server';\n\nimport { revalidateTag, revalidatePath } from 'next/cache';\nimport { serverClient } from './server-client';\nimport type * as Types from './types';\n\nexport type ActionResult<T> =\n | { success: true; data: T }\n | { success: false; error: string };\n`;\n\n const actions: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n if (this.isMutationEndpoint(endpoint)) {\n actions.push(this.generateServerAction(name, endpoint));\n }\n },\n );\n\n return imports + \"\\n\" + actions.join(\"\\n\\n\");\n }\n\n private generateServerAction(name: string, endpoint: APIEndpoint): string {\n const actionSuffix = this.context.config.options?.actionSuffix || \"Action\";\n const actionName = `${name}${actionSuffix}`;\n const invalidationTags = this.getInvalidationTags(endpoint);\n\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const bodyType = endpoint.body ? `Types.${this.getInputTypeName(name)}` : null;\n\n let inputType = \"\";\n let callArgs = \"\";\n if (paramsType && bodyType) {\n inputType = `input: { params: ${paramsType}; body: ${bodyType} }`;\n callArgs = \"input.params, input.body\";\n } else if (paramsType) {\n inputType = `params: ${paramsType}`;\n callArgs = \"params\";\n } else if (bodyType) {\n inputType = `body: ${bodyType}`;\n callArgs = \"body\";\n }\n\n const revalidateStatements =\n invalidationTags.length > 0\n ? invalidationTags\n .map((tag) => ` revalidateTag('${tag}', 'max');`)\n .join(\"\\n\")\n : \" // No automatic revalidations\";\n\n return `/**\n * ${endpoint.description || `Server action for ${name}`}\n * @tags ${endpoint.tags?.join(\", \") || \"none\"}\n */\nexport async function ${actionName}(\n ${inputType}\n): Promise<ActionResult<${responseType}>> {\n try {\n const result = await (serverClient as any).${name}(${callArgs});\n\n // Revalidate related data\n${revalidateStatements}\n\n return { success: true, data: result };\n } catch (error) {\n console.error('[Server Action Error]:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n };\n }\n}`;\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"@cushin/api-runtime\";\n\nexport class ServerQueriesGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"queries.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const imports = `import { cache } from 'react';\nimport { unstable_cache } from 'next/cache';\nimport { serverClient } from './server-client';\nimport type * as Types from './types';\n`;\n\n const queries: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n if (this.isQueryEndpoint(endpoint)) {\n queries.push(this.generateServerQuery(name, endpoint));\n }\n },\n );\n\n return imports + \"\\n\" + queries.join(\"\\n\\n\");\n }\n\n private generateServerQuery(name: string, endpoint: APIEndpoint): string {\n const queryName = `${name}Query`;\n const queryTags = this.getQueryTags(endpoint);\n\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const queryType = endpoint.query\n ? `Types.${this.getQueryTypeName(name)}`\n : null;\n\n const paramDef = paramsType ? `params: ${paramsType}` : \"\";\n const queryDef = queryType ? `query?: ${queryType}` : \"\";\n const paramsList = [paramDef, queryDef].filter(Boolean).join(\",\\n \");\n\n // Build client call with proper argument handling\n let clientCall = \"\";\n if (paramsType && queryType) {\n clientCall = `(serverClient as any).${name}(params, query)`;\n } else if (paramsType) {\n clientCall = `(serverClient as any).${name}(params)`;\n } else if (queryType) {\n clientCall = `(serverClient as any).${name}(query)`;\n } else {\n clientCall = `(serverClient as any).${name}()`;\n }\n\n // Generate cache key based on params\n const cacheKeyParts: string[] = [`'${name}'`];\n if (paramsType) cacheKeyParts.push(\"JSON.stringify(params)\");\n if (queryType)\n cacheKeyParts.push(\"query ? JSON.stringify(query) : 'no-query'\");\n\n return `/**\n * ${endpoint.description || `Server query for ${name}`}\n * @tags ${queryTags.join(\", \") || \"none\"}\n */\nexport const ${queryName} = cache(async (\n ${paramsList}\n): Promise<${responseType}> => {\n return unstable_cache(\n async () => ${clientCall},\n [${cacheKeyParts.join(\", \")}],\n {\n tags: [${queryTags.map((tag) => `'${tag}'`).join(\", \")}],\n revalidate: 3600, // 1 hour default, can be overridden\n }\n )();\n});`;\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class TypesGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.ts$/, \"\");\n\n return `// Auto-generated type definitions\n// Do not edit this file manually\n\nimport type { z } from 'zod';\nimport { apiConfig } from '${relativePath}';\n\n\n// Re-export endpoint configuration types\nexport type { APIConfig, APIEndpoint, HTTPMethod } from '@cushin/api-runtime';\n\n${this.generateEndpointTypes()}\n`;\n }\n\n private generateEndpointTypes(): string {\n const types: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n const cap = this.capitalize(name);\n\n // Always generate Response type\n types.push(\n `export type ${cap}Response = z.infer<NonNullable<typeof apiConfig.endpoints.${name}.response>>;`,\n );\n\n // Generate Input type for body (if exists)\n if (endpoint.body) {\n types.push(\n `export type ${cap}Input = z.infer<NonNullable<typeof apiConfig.endpoints.${name}.body>>;`,\n );\n }\n\n // Generate Query type (if exists)\n if (endpoint.query) {\n types.push(\n `export type ${cap}Query = z.infer<NonNullable<typeof apiConfig.endpoints.${name}.query>>;`,\n );\n }\n\n // Generate Params type (if exists)\n if (endpoint.params) {\n types.push(\n `export type ${cap}Params = z.infer<NonNullable<typeof apiConfig.endpoints.${name}.params>>;`,\n );\n }\n },\n );\n\n return types.join(\"\\n\");\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class ClientGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n await this.generateClientFile();\n\n if (this.context.config.provider === \"nextjs\") {\n await this.generateServerClientFile();\n }\n }\n\n private async generateClientFile(): Promise<void> {\n const content = this.generateClientContent();\n const outputPath = path.join(this.context.config.outputDir, \"client.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private async generateServerClientFile(): Promise<void> {\n const content = this.generateServerClientContent();\n const outputPath = path.join(\n this.context.config.outputDir,\n \"server-client.ts\",\n );\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateClientContent(): string {\n const useClientDirective =\n this.context.config.options?.useClientDirective ?? true;\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.ts$/, \"\");\n\n return `${useClientDirective ? \"'use client';\\n\" : \"\"}\nimport { createAPIClient } from '@cushin/api-runtime';\nimport type { AuthCallbacks } from '@cushin/api-runtime';\nimport { apiConfig } from '${relativePath}';\nimport type * as Types from './types';\n\n// Type the methods based on generated types\ntype APIClientMethods = {\n${this.generateAPIClientMethodTypes()}\n};\n\n// Export singleton instance (will be initialized later)\nexport let baseClient: APIClientMethods & {\n refreshAuth: () => Promise<void>;\n updateAuthCallbacks: (callbacks: AuthCallbacks) => void;\n};\n\nexport const apiClient = {\n${this.generateApiClientMethods()}\n};\n\n/**\n * Initialize API client with auth callbacks\n * Call this function in your auth provider setup\n *\n * @example\n * const authCallbacks = {\n * getTokens: () => getStoredTokens(),\n * onAuthError: () => router.push('/login'),\n * onRefreshToken: async () => {\n * await refreshAccessToken();\n * },\n * };\n *\n * initializeAPIClient(authCallbacks);\n */\nexport const initializeAPIClient = (authCallbacks: AuthCallbacks) => {\n baseClient = createAPIClient(apiConfig, authCallbacks) as any;\n return baseClient;\n};\n\n// Export for custom usage\nexport { createAPIClient };\nexport type { AuthCallbacks };\n`;\n }\n\n private generateServerClientContent(): string {\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.ts$/, \"\");\n\n return `import { createAPIClient } from '@cushin/api-runtime';\nimport type { AuthCallbacks } from '@cushin/api-runtime';\nimport { apiConfig } from '${relativePath}';\nimport type * as Types from './types';\n\n// Type the methods based on generated types\ntype APIClientMethods = {\n${this.generateAPIClientMethodTypes()}\n};\n\n// Export singleton instance (will be initialized later if auth is needed)\nexport let serverClient: APIClientMethods & {\n refreshAuth: () => Promise<void>;\n updateAuthCallbacks: (callbacks: AuthCallbacks) => void;\n};\n\n// Initialize without auth by default\nserverClient = createAPIClient(apiConfig) as any;\n\n/**\n * Initialize server-side API client with auth callbacks\n * Call this in Server Actions or Route Handlers where you need authentication\n *\n * @example\n * // In a Server Action or API Route:\n * import { cookies } from 'next/headers';\n *\n * const authCallbacks = {\n * getTokens: async () => {\n * const token = cookies().get('auth_token')?.value;\n * return token ? { accessToken: token } : null;\n * },\n * onAuthError: () => {\n * // Handle auth error (e.g., redirect, clear cookies)\n * }\n * };\n *\n * initializeServerClient(authCallbacks);\n */\nexport const initializeServerClient = (authCallbacks: AuthCallbacks) => {\n serverClient = createAPIClient(apiConfig, authCallbacks) as any;\n return serverClient;\n};\n\n// Export for custom usage\nexport { createAPIClient };\nexport type { AuthCallbacks };\n`;\n }\n\n private generateAPIClientMethodTypes(): string {\n const methods: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const queryType = endpoint.query\n ? `Types.${this.getQueryTypeName(name)}`\n : null;\n const bodyType = endpoint.body\n ? `Types.${this.getInputTypeName(name)}`\n : null;\n\n let signature = \"\";\n if (endpoint.method === \"GET\") {\n if (paramsType && queryType) {\n signature = `(params: ${paramsType}, query?: ${queryType}, headers?: Record<string, string>) => Promise<${responseType}>`;\n } else if (paramsType) {\n signature = `(params: ${paramsType}, headers?: Record<string, string>) => Promise<${responseType}>`;\n } else if (queryType) {\n signature = `(query?: ${queryType}, headers?: Record<string, string>) => Promise<${responseType}>`;\n } else {\n signature = `(headers?: Record<string, string>) => Promise<${responseType}>`;\n }\n } else {\n if (paramsType && bodyType) {\n signature = `(params: ${paramsType}, body: ${bodyType}, headers?: Record<string, string>) => Promise<${responseType}>`;\n } else if (paramsType) {\n signature = `(params: ${paramsType}, headers?: Record<string, string>) => Promise<${responseType}>`;\n } else if (bodyType) {\n signature = `(body: ${bodyType}, headers?: Record<string, string>) => Promise<${responseType}>`;\n } else {\n signature = `(headers?: Record<string, string>) => Promise<${responseType}>`;\n }\n }\n\n methods.push(` ${name}: ${signature};`);\n },\n );\n\n return methods.join(\"\\n\");\n }\n\n private generateApiClientMethods(): string {\n const methods: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const queryType = endpoint.query\n ? `Types.${this.getQueryTypeName(name)}`\n : null;\n const bodyType = endpoint.body\n ? `Types.${this.getInputTypeName(name)}`\n : null;\n\n if (endpoint.method === \"GET\") {\n if (paramsType && queryType) {\n methods.push(` ${name}(params: ${paramsType}, query?: ${queryType}, headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(params, query, headers);\n },`);\n } else if (paramsType) {\n methods.push(` ${name}(params: ${paramsType}, headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(params, headers);\n },`);\n } else if (queryType) {\n methods.push(` ${name}(query?: ${queryType}, headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(query, headers);\n },`);\n } else {\n methods.push(` ${name}(headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(headers);\n },`);\n }\n } else {\n if (paramsType && bodyType) {\n methods.push(` ${name}(params: ${paramsType}, body: ${bodyType}, headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(params, body, headers);\n },`);\n } else if (paramsType) {\n methods.push(` ${name}(params: ${paramsType}, headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(params, headers);\n },`);\n } else if (bodyType) {\n methods.push(` ${name}(body: ${bodyType}, headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(body, headers);\n },`);\n } else {\n methods.push(` ${name}(headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(headers);\n },`);\n }\n }\n },\n );\n\n return methods.join(\"\\n\");\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class QueryKeysGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(\n this.context.config.outputDir,\n \"query-keys.ts\",\n );\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.ts$/, \"\");\n\n const content = `// Auto-generated query keys\nimport type * as Types from './types';\n\nexport const queryKeys = {\n${this.generateQueryKeysContent()}\n} as const;\n`;\n return content;\n }\n\n private generateQueryKeysContent(): string {\n const resourceGroups = this.groupEndpointsByResource();\n const keys: string[] = [];\n\n Object.entries(resourceGroups).forEach(([resource, endpoints]) => {\n const queryEndpoints = endpoints.filter(\n ({ endpoint }) => endpoint.method === \"GET\",\n );\n if (queryEndpoints.length === 0) return;\n\n const resourceKeys: string[] = [` all: ['${resource}'] as const,`];\n const added = new Set<string>();\n\n queryEndpoints.forEach(({ name, endpoint }) => {\n const keyName = this.getEndpointKeyName(name);\n if (added.has(keyName)) return;\n\n if (endpoint.params || endpoint.query) {\n const params: string[] = [];\n if (endpoint.params)\n params.push(`params?: Types.${this.getParamsTypeName(name)}`);\n if (endpoint.query)\n params.push(`query?: Types.${this.getQueryTypeName(name)}`);\n\n resourceKeys.push(` ${keyName}: (${params.join(\", \")}) =>\n ['${resource}', '${keyName}', ${endpoint.params ? \"params\" : \"undefined\"}, ${endpoint.query ? \"query\" : \"undefined\"}] as const,`);\n } else {\n resourceKeys.push(\n ` ${keyName}: () => ['${resource}', '${keyName}'] as const,`,\n );\n }\n added.add(keyName);\n });\n\n keys.push(` ${resource}: {\\n${resourceKeys.join(\"\\n\")}\\n },`);\n });\n\n return keys.join(\"\\n\");\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class QueryOptionsGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(\n this.context.config.outputDir,\n \"query-options.ts\",\n );\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n private generateContent(): string {\n const content = `// Auto-generated query options\nimport { queryOptions } from '@tanstack/react-query';\nimport { apiClient } from './client';\nimport { queryKeys } from './query-keys';\nimport type * as Types from './types';\n\n${this.generateQueryOptionsContent()}\n\nexport const apiQueryOptions = {\n${this.generateQueryOptionsExports()}\n} as const;\n`;\n\n return content;\n }\n\n private generateQueryOptionsContent(): string {\n const groups = this.groupEndpointsByResource();\n const options: string[] = [];\n\n Object.entries(groups).forEach(([resource, endpoints]) => {\n const queries = endpoints.filter(\n ({ endpoint }) => endpoint.method === \"GET\",\n );\n if (queries.length === 0) return;\n\n const resourceOptions: string[] = [];\n queries.forEach(({ name, endpoint }) => {\n const optionName = this.getEndpointKeyName(name);\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const queryType = endpoint.query\n ? `Types.${this.getQueryTypeName(name)}`\n : null;\n\n const params: string[] = [];\n let apiCall = \"\";\n\n if (paramsType && queryType) {\n params.push(`params: ${paramsType}`, `filters?: ${queryType}`);\n apiCall = `apiClient.${name}(params, filters)`;\n } else if (paramsType) {\n params.push(`params: ${paramsType}`);\n apiCall = `apiClient.${name}(params)`;\n } else if (queryType) {\n params.push(`filters?: ${queryType}`);\n apiCall = `apiClient.${name}(filters)`;\n } else {\n apiCall = `apiClient.${name}()`;\n }\n\n const keyCall = this.generateQueryKeyCall(resource, name, endpoint);\n\n resourceOptions.push(` ${optionName}: (${params.join(\", \")}) =>\n queryOptions({\n queryKey: ${keyCall},\n queryFn: (): Promise<${responseType}> => ${apiCall},\n staleTime: 1000 * 60 * 5,\n }),`);\n });\n\n options.push(\n `const ${resource}QueryOptions = {\\n${resourceOptions.join(\"\\n\")}\\n};\\n`,\n );\n });\n\n return options.join(\"\\n\");\n }\n\n private generateQueryOptionsExports(): string {\n const groups = this.groupEndpointsByResource();\n const exports: string[] = [];\n\n Object.keys(groups).forEach((resource) => {\n const hasQueries = groups[resource].some(\n ({ endpoint }) => endpoint.method === \"GET\",\n );\n if (hasQueries) exports.push(` ${resource}: ${resource}QueryOptions,`);\n });\n\n return exports.join(\"\\n\");\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"@cushin/api-runtime\";\n\nexport class PrefetchGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"prefetchs.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const content = `// Auto-generated prefetch utilities\nimport { type QueryClient } from '@tanstack/react-query';\n${this.hasQueryOptions() ? \"import { apiQueryOptions } from './query-options';\" : \"\"}\nimport type * as Types from './types';\n\n${this.generatePrefetchFunctions()}\n`;\n return content;\n }\n\n private generatePrefetchFunctions(): string {\n const funcs: string[] = [];\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n if (endpoint.method === \"GET\")\n funcs.push(this.generatePrefetchFunction(name, endpoint));\n },\n );\n return funcs.join(\"\\n\\n\");\n }\n\n private generatePrefetchFunction(\n name: string,\n endpoint: APIEndpoint,\n ): string {\n const prefetchName = `prefetch${this.capitalize(name)}`;\n const resource = this.getResourceFromEndpoint(name, endpoint);\n const optionName = this.getEndpointKeyName(name);\n\n const params: string[] = [\"queryClient: QueryClient\"];\n const optionParams: string[] = [];\n\n if (endpoint.params) {\n params.push(`params: Types.${this.getParamsTypeName(name)}`);\n optionParams.push(\"params\");\n }\n if (endpoint.query) {\n params.push(`filters?: Types.${this.getQueryTypeName(name)}`);\n optionParams.push(\"filters\");\n }\n\n return `export const ${prefetchName} = async (${params.join(\",\\n \")}) => {\n return await queryClient.ensureQueryData(apiQueryOptions.${resource}.${optionName}(${optionParams.join(\", \")}));\n};`;\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class IndexGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"index.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.ts$/, \"\");\n\n const content = `// Auto-generated exports\nexport * from './types';\nexport * from './client';\nexport * from './query-keys';\n${this.hasQueryOptions() ? \"export * from './query-options';\" : \"\"}\nexport * from './hooks';\nexport * from './prefetchs';\nexport { z } from 'zod';\nexport { apiConfig } from '${relativePath}';\n`;\n return content;\n }\n}\n","import { HooksGenerator } from \"./hooks.js\";\nimport { ServerActionsGenerator } from \"./actions.js\";\nimport { ServerQueriesGenerator } from \"./queries.js\";\nimport { TypesGenerator } from \"./types.js\";\nimport { ClientGenerator } from \"./client.js\";\nimport type { GeneratorContext } from \"./base.js\";\nimport { QueryKeysGenerator } from \"./query-keys.js\";\nimport { QueryOptionsGenerator } from \"./query-options.js\";\nimport { PrefetchGenerator } from \"./prefetch.js\";\nimport { IndexGenerator } from \"./generate-index.js\";\n\nexport class CodeGenerator {\n constructor(private context: GeneratorContext) {}\n\n async generate(): Promise<void> {\n const generators = this.getGenerators();\n\n for (const generator of generators) {\n await generator.generate();\n }\n }\n\n private getGenerators() {\n const generators: Array<any> = [];\n\n // Always generate types\n generators.push(new TypesGenerator(this.context));\n generators.push(new IndexGenerator(this.context));\n\n // Generate client if enabled\n if (this.context.config.generateClient) {\n generators.push(new ClientGenerator(this.context));\n }\n\n // Generate hooks if enabled\n if (this.context.config.generateHooks) {\n generators.push(new QueryKeysGenerator(this.context));\n generators.push(new QueryOptionsGenerator(this.context));\n generators.push(new HooksGenerator(this.context));\n }\n\n if (this.context.config.generatePrefetch) {\n generators.push(new PrefetchGenerator(this.context));\n }\n\n // Generate server actions if enabled (Next.js only)\n if (\n this.context.config.generateServerActions &&\n this.context.config.provider === \"nextjs\"\n ) {\n generators.push(new ServerActionsGenerator(this.context));\n }\n\n // Generate server queries if enabled (Next.js only)\n if (\n this.context.config.generateServerQueries &&\n this.context.config.provider === \"nextjs\"\n ) {\n generators.push(new ServerQueriesGenerator(this.context));\n }\n\n return generators;\n }\n}\n"],"mappings":";;;AAEA,SAAS,eAAe;AACxB,SAAS,iBAAiB,sBAAsB,kBAAkB,4BAA4B;;;ACH9F,SAAS,mBAAmB;AAC5B,OAAO,UAAU;AAmGjB,IAAM,WAAW,YAAY,eAAe;AAAA,EAC1C,cAAc;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF,CAAC;AAED,eAAsB,WACpB,YACgC;AAChC,MAAI;AACF,UAAM,SAAS,aACX,MAAM,SAAS,KAAK,UAAU,IAC9B,MAAM,SAAS,OAAO;AAE1B,QAAI,CAAC,UAAU,CAAC,OAAO,QAAQ;AAC7B,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,OAAO;AAC1B,UAAM,UAAU,KAAK,QAAQ,OAAO,QAAQ;AAG5C,UAAM,gBAAgB,KAAK,QAAQ,SAAS,WAAW,SAAS;AAChE,UAAM,YAAY,KAAK,QAAQ,SAAS,WAAW,MAAM;AAGzD,UAAM,gBAAgB,WAAW,iBAAiB;AAClD,UAAM,wBACJ,WAAW,yBAAyB,WAAW,aAAa;AAC9D,UAAM,wBACJ,WAAW,yBAAyB,WAAW,aAAa;AAC9D,UAAM,iBAAiB,WAAW,kBAAkB;AACpD,UAAM,mBAAmB,WAAW,oBAAoB;AAExD,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAClF;AAAA,EACF;AACF;AAKO,SAAS,eAAe,QAA0B;AACvD,MAAI,CAAC,OAAO,WAAW;AACrB,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AAEA,MAAI,CAAC,OAAO,UAAU;AACpB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,CAAC,QAAQ,QAAQ,EAAE,SAAS,OAAO,QAAQ,GAAG;AACjD,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,OAAO,QAAQ;AAClB,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AACF;;;ACrLA,SAAS,kBAAkB;;;ACA3B,OAAO,QAAQ;AACf,OAAOA,WAAU;;;ACOV,IAAe,gBAAf,MAA6B;AAAA,EAClC,YAAsBC,UAA2B;AAA3B,mBAAAA;AAAA,EAA4B;AAAA,EAIxC,gBAAgB,UAAgC;AACxD,WAAO,SAAS,WAAW;AAAA,EAC7B;AAAA,EAEU,mBAAmB,UAAgC;AAC3D,WAAO,CAAC,KAAK,gBAAgB,QAAQ;AAAA,EACvC;AAAA,EAEU,WAAW,KAAqB;AACxC,WAAO,IAAI,OAAO,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC;AAAA,EAClD;AAAA,EAEU,aAAa,UAAiC;AACtD,WAAO,SAAS,QAAQ,CAAC;AAAA,EAC3B;AAAA,EAEU,oBAAoB,UAAiC;AAC7D,UAAM,OAAO,SAAS,QAAQ,CAAC;AAC/B,WAAO,KAAK,OAAO,CAAC,QAAQ,QAAQ,WAAW,QAAQ,UAAU;AAAA,EACnE;AAAA,EAEU,UAAU,UAAgC;AAClD,WAAO,CAAC,CAAC,SAAS;AAAA,EACpB;AAAA,EAEU,SAAS,UAAgC;AACjD,WAAO,CAAC,CAAC,SAAS;AAAA,EACpB;AAAA,EAEU,QAAQ,UAAgC;AAChD,WAAO,CAAC,CAAC,SAAS;AAAA,EACpB;AAAA,EAEU,qBACR,MACA,UASA;AACA,UAAM,YAAY,KAAK,UAAU,QAAQ;AACzC,UAAM,WAAW,KAAK,SAAS,QAAQ;AACvC,UAAM,UAAU,KAAK,QAAQ,QAAQ;AAErC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,YAAY,KAAK,aAAa,8BAA8B,IAAI,SAAS,IAAI;AAAA,MACxF,WAAW,WAAW,KAAK,aAAa,8BAA8B,IAAI,QAAQ,IAAI;AAAA,MACtF,UAAU,UAAU,KAAK,aAAa,8BAA8B,IAAI,OAAO,IAAI;AAAA,MACnF,cAAc,KAAK,aAAa,8BAA8B,IAAI,WAAW;AAAA,IAC/E;AAAA,EACF;AAAA,EAEU,qBACR,MACA,WACA,SACQ;AACR,QAAI,aAAa,SAAS;AACxB,aAAO,oBAAoB,IAAI;AAAA,IACjC,WAAW,WAAW;AACpB,aAAO,oBAAoB,IAAI;AAAA,IACjC,WAAW,SAAS;AAClB,aAAO,oBAAoB,IAAI;AAAA,IACjC,OAAO;AACL,aAAO,oBAAoB,IAAI;AAAA,IACjC;AAAA,EACF;AAAA,EAEU,aAAa,MAAsB;AAC3C,WAAO,uBAAuB,IAAI;AAAA,EACpC;AAAA,EAEU,YAAY,KAAqB;AACzC,WAAO,IACJ,YAAY,EACZ,QAAQ,gBAAgB,CAAC,GAAG,MAAO,IAAI,EAAE,YAAY,IAAI,EAAG,EAC5D,QAAQ,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC;AAAA,EACzC;AAAA,EAEU,wBACR,OACA,UACQ;AACR,UAAM,MAAM,SAAS,MAAM,KAAK,CAAC,MAAM,MAAM,WAAW,MAAM,UAAU;AACxE,QAAI,IAAK,QAAO,KAAK,YAAY,GAAG;AACpC,UAAM,QAAQ,SAAS,KAAK,MAAM,YAAY;AAC9C,WAAO,QAAQ,KAAK,YAAY,MAAM,CAAC,CAAC,IAAI;AAAA,EAC9C;AAAA,EAEU,2BAA2B;AACnC,UAAM,SAGF,CAAC;AACL,WAAO,QAAQ,KAAK,QAAQ,UAAU,SAAS,EAAE;AAAA,MAC/C,CAAC,CAAC,MAAM,QAAQ,MAAM;AACpB,cAAM,MAAM,KAAK,wBAAwB,MAAM,QAAQ;AACvD,YAAI,CAAC,OAAO,GAAG,EAAG,QAAO,GAAG,IAAI,CAAC;AACjC,eAAO,GAAG,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAAA,MACrC;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEU,0BAA0B,UAA2B;AAC7D,WACE,KAAK,yBAAyB,EAAE,QAAQ,GAAG;AAAA,MACzC,CAAC,EAAE,SAAS,MAAM,SAAS,WAAW;AAAA,IACxC,KAAK;AAAA,EAET;AAAA,EAEU,mBAAmB,MAAsB;AACjD,WAAO,KAAK,WAAW,KAAK,IACxB,KAAK,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,IACpC;AAAA,EACN;AAAA,EAEU,qBACR,UACA,MACA,UACQ;AACR,UAAM,MAAM,KAAK,mBAAmB,IAAI;AACxC,UAAM,OAAiB,CAAC;AACxB,QAAI,SAAS,OAAQ,MAAK,KAAK,QAAQ;AACvC,QAAI,SAAS,MAAO,MAAK,KAAK,SAAS;AACvC,WAAO,KAAK,SACR,aAAa,QAAQ,IAAI,GAAG,IAAI,KAAK,KAAK,IAAI,CAAC,MAC/C,aAAa,QAAQ,IAAI,GAAG;AAAA,EAClC;AAAA,EAEU,kBAAkB;AAC1B,WAAO,OAAO,OAAO,KAAK,QAAQ,UAAU,SAAS,EAAE;AAAA,MACrD,CAAC,MAAM,EAAE,WAAW;AAAA,IACtB;AAAA,EACF;AAAA;AAAA,EAGU,oBAAoB,MAAsB;AAClD,WAAO,GAAG,KAAK,WAAW,IAAI,CAAC;AAAA,EACjC;AAAA,EAEU,iBAAiB,MAAsB;AAC/C,WAAO,GAAG,KAAK,WAAW,IAAI,CAAC;AAAA,EACjC;AAAA,EAEU,iBAAiB,MAAsB;AAC/C,WAAO,GAAG,KAAK,WAAW,IAAI,CAAC;AAAA,EACjC;AAAA,EAEU,kBAAkB,MAAsB;AAChD,WAAO,GAAG,KAAK,WAAW,IAAI,CAAC;AAAA,EACjC;AACF;;;AD1KO,IAAM,iBAAN,cAA6B,cAAc;AAAA,EAChD,MAAM,WAA0B;AAC9B,UAAM,UAAU,KAAK,gBAAgB;AACrC,UAAM,aAAaC,MAAK,KAAK,KAAK,QAAQ,OAAO,WAAW,UAAU;AAEtE,UAAM,GAAG,MAAMA,MAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,UAAM,GAAG,UAAU,YAAY,SAAS,OAAO;AAAA,EACjD;AAAA,EAEQ,kBAA0B;AAChC,UAAM,qBACJ,KAAK,QAAQ,OAAO,SAAS,sBAAsB;AAErD,UAAM,UAAU,GAAG,qBAAqB,oBAAoB,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhE,KAAK,mBAAmB,CAAC;AAAA,EACzB,KAAK,sBAAsB,CAAC;AAAA;AAG1B,WAAO;AAAA,EACT;AAAA,EAEQ,qBAA6B;AACnC,UAAM,QAAkB,CAAC;AACzB,WAAO,QAAQ,KAAK,QAAQ,UAAU,SAAS,EAAE;AAAA,MAC/C,CAAC,CAAC,MAAM,QAAQ,MAAM;AACpB,YAAI,SAAS,WAAW;AACtB,gBAAM,KAAK,KAAK,kBAAkB,MAAM,QAAQ,CAAC;AAAA,MACrD;AAAA,IACF;AACA,WAAO,MAAM,KAAK,MAAM;AAAA,EAC1B;AAAA,EAEQ,kBAAkB,MAAc,UAA+B;AACrE,UAAM,WAAW,MAAM,KAAK,WAAW,IAAI,CAAC;AAC5C,UAAM,WAAW,KAAK,wBAAwB,MAAM,QAAQ;AAC5D,UAAM,aAAa,KAAK,mBAAmB,IAAI;AAE/C,UAAM,eAAe,SAAS,KAAK,oBAAoB,IAAI,CAAC;AAC5D,UAAM,aAAa,SAAS,SACxB,SAAS,KAAK,kBAAkB,IAAI,CAAC,KACrC;AACJ,UAAM,YAAY,SAAS,QACvB,SAAS,KAAK,iBAAiB,IAAI,CAAC,KACpC;AAEJ,UAAM,SAAmB,CAAC;AAC1B,UAAM,eAAyB,CAAC;AAEhC,UAAM,YAAY,KAAK,aAAa,QAAQ;AAE5C,QAAI,YAAY;AACd,aAAO,KAAK,WAAW,UAAU,EAAE;AACnC,mBAAa,KAAK,QAAQ;AAAA,IAC5B;AACA,QAAI,WAAW;AACb,aAAO,KAAK,aAAa,SAAS,EAAE;AACpC,mBAAa,KAAK,SAAS;AAAA,IAC7B;AAEA,WAAO,KAAK;AAAA;AAAA,wBAEQ,YAAY,WAAW,YAAY;AAAA,IACvD;AAEA,WAAO;AAAA,KACN,SAAS,eAAe,kBAAkB,IAAI,EAAE;AAAA,WAC1C,UAAU,KAAK,IAAI,KAAK,MAAM;AAAA;AAAA,kBAEvB,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC;AAAA;AAAA,yBAEzB,QAAQ,IAAI,UAAU,IAAI,aAAa,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA,EAIxE;AAAA,EAEQ,wBAAgC;AACtC,UAAM,QAAkB,CAAC;AACzB,WAAO,QAAQ,KAAK,QAAQ,UAAU,SAAS,EAAE;AAAA,MAC/C,CAAC,CAAC,MAAM,QAAQ,MAAM;AACpB,YAAI,SAAS,WAAW;AACtB,gBAAM,KAAK,KAAK,qBAAqB,MAAM,QAAQ,CAAC;AAAA,MACxD;AAAA,IACF;AACA,WAAO,MAAM,KAAK,MAAM;AAAA,EAC1B;AAAA,EAEQ,qBAAqB,MAAc,UAA+B;AACxE,UAAM,WAAW,MAAM,KAAK,WAAW,IAAI,CAAC;AAC5C,UAAM,WAAW,KAAK,wBAAwB,MAAM,QAAQ;AAE5D,UAAM,eAAe,SAAS,KAAK,oBAAoB,IAAI,CAAC;AAC5D,UAAM,aAAa,SAAS,SACxB,SAAS,KAAK,kBAAkB,IAAI,CAAC,KACrC;AACJ,UAAM,WAAW,SAAS,OAAO,SAAS,KAAK,iBAAiB,IAAI,CAAC,KAAK;AAE1E,UAAM,qBAAqB,KAAK,0BAA0B,QAAQ;AAElE,QAAI;AACJ,QAAI;AAEJ,QAAI,cAAc,UAAU;AAC1B,kBAAY,aAAa,UAAU,WAAW,QAAQ;AACtD,eAAS,sBAAsB,SAAS,kBAAkB,IAAI;AAAA,IAChE,WAAW,YAAY;AACrB,kBAAY;AACZ,eAAS,YAAY,SAAS,kBAAkB,IAAI;AAAA,IACtD,WAAW,UAAU;AACnB,kBAAY;AACZ,eAAS,UAAU,SAAS,kBAAkB,IAAI;AAAA,IACpD,OAAO;AACL,kBAAY;AACZ,eAAS,mBAAmB,IAAI;AAAA,IAClC;AAEA,UAAM,aAAa,qBACf,uDAAuD,QAAQ,aAC/D;AAEJ,WAAO;AAAA,KACN,SAAS,eAAe,qBAAqB,IAAI,EAAE;AAAA,WAC7C,SAAS,MAAM,KAAK,IAAI,KAAK,MAAM;AAAA;AAAA,kBAE5B,QAAQ;AAAA,uBACH,YAAY,gBAAgB,SAAS;AAAA,wCACpB,SAAS;AAAA,uBAC1B,YAAY,iDAAiD,SAAS;AAAA,2BAClE,SAAS;AAAA;AAAA,IAEhC,aAAa,0CAA0C,EAAE;AAAA;AAAA,kBAE3C,MAAM;AAAA;AAAA,QAEhB,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQhB;AACF;;;AE1JA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAIV,IAAM,yBAAN,cAAqC,cAAc;AAAA,EACxD,MAAM,WAA0B;AAC9B,UAAM,UAAU,KAAK,gBAAgB;AACrC,UAAM,aAAaC,MAAK,KAAK,KAAK,QAAQ,OAAO,WAAW,YAAY;AAExE,UAAMC,IAAG,MAAMD,MAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,UAAMC,IAAG,UAAU,YAAY,SAAS,OAAO;AAAA,EACjD;AAAA,EAEQ,kBAA0B;AAChC,UAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWhB,UAAM,UAAoB,CAAC;AAE3B,WAAO,QAAQ,KAAK,QAAQ,UAAU,SAAS,EAAE;AAAA,MAC/C,CAAC,CAAC,MAAM,QAAQ,MAAM;AACpB,YAAI,KAAK,mBAAmB,QAAQ,GAAG;AACrC,kBAAQ,KAAK,KAAK,qBAAqB,MAAM,QAAQ,CAAC;AAAA,QACxD;AAAA,MACF;AAAA,IACF;AAEA,WAAO,UAAU,OAAO,QAAQ,KAAK,MAAM;AAAA,EAC7C;AAAA,EAEQ,qBAAqB,MAAc,UAA+B;AACxE,UAAM,eAAe,KAAK,QAAQ,OAAO,SAAS,gBAAgB;AAClE,UAAM,aAAa,GAAG,IAAI,GAAG,YAAY;AACzC,UAAM,mBAAmB,KAAK,oBAAoB,QAAQ;AAE1D,UAAM,eAAe,SAAS,KAAK,oBAAoB,IAAI,CAAC;AAC5D,UAAM,aAAa,SAAS,SACxB,SAAS,KAAK,kBAAkB,IAAI,CAAC,KACrC;AACJ,UAAM,WAAW,SAAS,OAAO,SAAS,KAAK,iBAAiB,IAAI,CAAC,KAAK;AAE1E,QAAI,YAAY;AAChB,QAAI,WAAW;AACf,QAAI,cAAc,UAAU;AAC1B,kBAAY,oBAAoB,UAAU,WAAW,QAAQ;AAC7D,iBAAW;AAAA,IACb,WAAW,YAAY;AACrB,kBAAY,WAAW,UAAU;AACjC,iBAAW;AAAA,IACb,WAAW,UAAU;AACnB,kBAAY,SAAS,QAAQ;AAC7B,iBAAW;AAAA,IACb;AAEA,UAAM,uBACJ,iBAAiB,SAAS,IACtB,iBACG,IAAI,CAAC,QAAQ,sBAAsB,GAAG,YAAY,EAClD,KAAK,IAAI,IACZ;AAEN,WAAO;AAAA,KACN,SAAS,eAAe,qBAAqB,IAAI,EAAE;AAAA,WAC7C,SAAS,MAAM,KAAK,IAAI,KAAK,MAAM;AAAA;AAAA,wBAEtB,UAAU;AAAA,IAC9B,SAAS;AAAA,0BACa,YAAY;AAAA;AAAA,iDAEW,IAAI,IAAI,QAAQ;AAAA;AAAA;AAAA,EAG/D,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWpB;AACF;;;AC7FA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAIV,IAAM,yBAAN,cAAqC,cAAc;AAAA,EACxD,MAAM,WAA0B;AAC9B,UAAM,UAAU,KAAK,gBAAgB;AACrC,UAAM,aAAaC,MAAK,KAAK,KAAK,QAAQ,OAAO,WAAW,YAAY;AAExE,UAAMC,IAAG,MAAMD,MAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,UAAMC,IAAG,UAAU,YAAY,SAAS,OAAO;AAAA,EACjD;AAAA,EAEQ,kBAA0B;AAChC,UAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAMhB,UAAM,UAAoB,CAAC;AAE3B,WAAO,QAAQ,KAAK,QAAQ,UAAU,SAAS,EAAE;AAAA,MAC/C,CAAC,CAAC,MAAM,QAAQ,MAAM;AACpB,YAAI,KAAK,gBAAgB,QAAQ,GAAG;AAClC,kBAAQ,KAAK,KAAK,oBAAoB,MAAM,QAAQ,CAAC;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AAEA,WAAO,UAAU,OAAO,QAAQ,KAAK,MAAM;AAAA,EAC7C;AAAA,EAEQ,oBAAoB,MAAc,UAA+B;AACvE,UAAM,YAAY,GAAG,IAAI;AACzB,UAAM,YAAY,KAAK,aAAa,QAAQ;AAE5C,UAAM,eAAe,SAAS,KAAK,oBAAoB,IAAI,CAAC;AAC5D,UAAM,aAAa,SAAS,SACxB,SAAS,KAAK,kBAAkB,IAAI,CAAC,KACrC;AACJ,UAAM,YAAY,SAAS,QACvB,SAAS,KAAK,iBAAiB,IAAI,CAAC,KACpC;AAEJ,UAAM,WAAW,aAAa,WAAW,UAAU,KAAK;AACxD,UAAM,WAAW,YAAY,WAAW,SAAS,KAAK;AACtD,UAAM,aAAa,CAAC,UAAU,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,OAAO;AAGpE,QAAI,aAAa;AACjB,QAAI,cAAc,WAAW;AAC3B,mBAAa,yBAAyB,IAAI;AAAA,IAC5C,WAAW,YAAY;AACrB,mBAAa,yBAAyB,IAAI;AAAA,IAC5C,WAAW,WAAW;AACpB,mBAAa,yBAAyB,IAAI;AAAA,IAC5C,OAAO;AACL,mBAAa,yBAAyB,IAAI;AAAA,IAC5C;AAGA,UAAM,gBAA0B,CAAC,IAAI,IAAI,GAAG;AAC5C,QAAI,WAAY,eAAc,KAAK,wBAAwB;AAC3D,QAAI;AACF,oBAAc,KAAK,4CAA4C;AAEjE,WAAO;AAAA,KACN,SAAS,eAAe,oBAAoB,IAAI,EAAE;AAAA,WAC5C,UAAU,KAAK,IAAI,KAAK,MAAM;AAAA;AAAA,eAE1B,SAAS;AAAA,IACpB,UAAU;AAAA,aACD,YAAY;AAAA;AAAA,kBAEP,UAAU;AAAA,OACrB,cAAc,KAAK,IAAI,CAAC;AAAA;AAAA,eAEhB,UAAU,IAAI,CAAC,QAAQ,IAAI,GAAG,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAK1D;AACF;;;ACrFA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAGV,IAAM,iBAAN,cAA6B,cAAc;AAAA,EAChD,MAAM,WAA0B;AAC9B,UAAM,UAAU,KAAK,gBAAgB;AACrC,UAAM,aAAaC,MAAK,KAAK,KAAK,QAAQ,OAAO,WAAW,UAAU;AAEtE,UAAMC,IAAG,MAAMD,MAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,UAAMC,IAAG,UAAU,YAAY,SAAS,OAAO;AAAA,EACjD;AAAA,EAEQ,kBAA0B;AAChC,UAAM,aAAaD,MAAK,KAAK,KAAK,QAAQ,OAAO,WAAW,UAAU;AACtE,UAAM,gBAAgBA,MAAK,KAAK,KAAK,QAAQ,OAAO,aAAa;AACjE,UAAM,eAAeA,MAClB,SAASA,MAAK,QAAQ,UAAU,GAAG,aAAa,EAChD,QAAQ,OAAO,GAAG,EAClB,QAAQ,SAAS,EAAE;AAEtB,WAAO;AAAA;AAAA;AAAA;AAAA,6BAIkB,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMvC,KAAK,sBAAsB,CAAC;AAAA;AAAA,EAE5B;AAAA,EAEQ,wBAAgC;AACtC,UAAM,QAAkB,CAAC;AAEzB,WAAO,QAAQ,KAAK,QAAQ,UAAU,SAAS,EAAE;AAAA,MAC/C,CAAC,CAAC,MAAM,QAAQ,MAAM;AACpB,cAAM,MAAM,KAAK,WAAW,IAAI;AAGhC,cAAM;AAAA,UACJ,eAAe,GAAG,6DAA6D,IAAI;AAAA,QACrF;AAGA,YAAI,SAAS,MAAM;AACjB,gBAAM;AAAA,YACJ,eAAe,GAAG,0DAA0D,IAAI;AAAA,UAClF;AAAA,QACF;AAGA,YAAI,SAAS,OAAO;AAClB,gBAAM;AAAA,YACJ,eAAe,GAAG,0DAA0D,IAAI;AAAA,UAClF;AAAA,QACF;AAGA,YAAI,SAAS,QAAQ;AACnB,gBAAM;AAAA,YACJ,eAAe,GAAG,2DAA2D,IAAI;AAAA,UACnF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AACF;;;ACxEA,OAAOE,SAAQ;AACf,OAAOC,WAAU;AAGV,IAAM,kBAAN,cAA8B,cAAc;AAAA,EACjD,MAAM,WAA0B;AAC9B,UAAM,KAAK,mBAAmB;AAE9B,QAAI,KAAK,QAAQ,OAAO,aAAa,UAAU;AAC7C,YAAM,KAAK,yBAAyB;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,MAAc,qBAAoC;AAChD,UAAM,UAAU,KAAK,sBAAsB;AAC3C,UAAM,aAAaC,MAAK,KAAK,KAAK,QAAQ,OAAO,WAAW,WAAW;AAEvE,UAAMC,IAAG,MAAMD,MAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,UAAMC,IAAG,UAAU,YAAY,SAAS,OAAO;AAAA,EACjD;AAAA,EAEA,MAAc,2BAA0C;AACtD,UAAM,UAAU,KAAK,4BAA4B;AACjD,UAAM,aAAaD,MAAK;AAAA,MACtB,KAAK,QAAQ,OAAO;AAAA,MACpB;AAAA,IACF;AAEA,UAAMC,IAAG,MAAMD,MAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,UAAMC,IAAG,UAAU,YAAY,SAAS,OAAO;AAAA,EACjD;AAAA,EAEQ,wBAAgC;AACtC,UAAM,qBACJ,KAAK,QAAQ,OAAO,SAAS,sBAAsB;AACrD,UAAM,aAAaD,MAAK,KAAK,KAAK,QAAQ,OAAO,WAAW,UAAU;AACtE,UAAM,gBAAgBA,MAAK,KAAK,KAAK,QAAQ,OAAO,aAAa;AACjE,UAAM,eAAeA,MAClB,SAASA,MAAK,QAAQ,UAAU,GAAG,aAAa,EAChD,QAAQ,OAAO,GAAG,EAClB,QAAQ,SAAS,EAAE;AAEtB,WAAO,GAAG,qBAAqB,oBAAoB,EAAE;AAAA;AAAA;AAAA,6BAG5B,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,EAKvC,KAAK,6BAA6B,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUnC,KAAK,yBAAyB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2B/B;AAAA,EAEQ,8BAAsC;AAC5C,UAAM,aAAaA,MAAK,KAAK,KAAK,QAAQ,OAAO,WAAW,UAAU;AACtE,UAAM,gBAAgBA,MAAK,KAAK,KAAK,QAAQ,OAAO,aAAa;AACjE,UAAM,eAAeA,MAClB,SAASA,MAAK,QAAQ,UAAU,GAAG,aAAa,EAChD,QAAQ,OAAO,GAAG,EAClB,QAAQ,SAAS,EAAE;AAEtB,WAAO;AAAA;AAAA,6BAEkB,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,EAKvC,KAAK,6BAA6B,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyCnC;AAAA,EAEQ,+BAAuC;AAC7C,UAAM,UAAoB,CAAC;AAE3B,WAAO,QAAQ,KAAK,QAAQ,UAAU,SAAS,EAAE;AAAA,MAC/C,CAAC,CAAC,MAAM,QAAQ,MAAM;AACpB,cAAM,eAAe,SAAS,KAAK,oBAAoB,IAAI,CAAC;AAC5D,cAAM,aAAa,SAAS,SACxB,SAAS,KAAK,kBAAkB,IAAI,CAAC,KACrC;AACJ,cAAM,YAAY,SAAS,QACvB,SAAS,KAAK,iBAAiB,IAAI,CAAC,KACpC;AACJ,cAAM,WAAW,SAAS,OACtB,SAAS,KAAK,iBAAiB,IAAI,CAAC,KACpC;AAEJ,YAAI,YAAY;AAChB,YAAI,SAAS,WAAW,OAAO;AAC7B,cAAI,cAAc,WAAW;AAC3B,wBAAY,YAAY,UAAU,aAAa,SAAS,kDAAkD,YAAY;AAAA,UACxH,WAAW,YAAY;AACrB,wBAAY,YAAY,UAAU,kDAAkD,YAAY;AAAA,UAClG,WAAW,WAAW;AACpB,wBAAY,YAAY,SAAS,kDAAkD,YAAY;AAAA,UACjG,OAAO;AACL,wBAAY,iDAAiD,YAAY;AAAA,UAC3E;AAAA,QACF,OAAO;AACL,cAAI,cAAc,UAAU;AAC1B,wBAAY,YAAY,UAAU,WAAW,QAAQ,kDAAkD,YAAY;AAAA,UACrH,WAAW,YAAY;AACrB,wBAAY,YAAY,UAAU,kDAAkD,YAAY;AAAA,UAClG,WAAW,UAAU;AACnB,wBAAY,UAAU,QAAQ,kDAAkD,YAAY;AAAA,UAC9F,OAAO;AACL,wBAAY,iDAAiD,YAAY;AAAA,UAC3E;AAAA,QACF;AAEA,gBAAQ,KAAK,KAAK,IAAI,KAAK,SAAS,GAAG;AAAA,MACzC;AAAA,IACF;AAEA,WAAO,QAAQ,KAAK,IAAI;AAAA,EAC1B;AAAA,EAEQ,2BAAmC;AACzC,UAAM,UAAoB,CAAC;AAE3B,WAAO,QAAQ,KAAK,QAAQ,UAAU,SAAS,EAAE;AAAA,MAC/C,CAAC,CAAC,MAAM,QAAQ,MAAM;AACpB,cAAM,eAAe,SAAS,KAAK,oBAAoB,IAAI,CAAC;AAC5D,cAAM,aAAa,SAAS,SACxB,SAAS,KAAK,kBAAkB,IAAI,CAAC,KACrC;AACJ,cAAM,YAAY,SAAS,QACvB,SAAS,KAAK,iBAAiB,IAAI,CAAC,KACpC;AACJ,cAAM,WAAW,SAAS,OACtB,SAAS,KAAK,iBAAiB,IAAI,CAAC,KACpC;AAEJ,YAAI,SAAS,WAAW,OAAO;AAC7B,cAAI,cAAc,WAAW;AAC3B,oBAAQ,KAAK,KAAK,IAAI,YAAY,UAAU,aAAa,SAAS,gDAAgD,YAAY;AAAA;AAAA,wBAElH,IAAI;AAAA,KACvB;AAAA,UACK,WAAW,YAAY;AACrB,oBAAQ,KAAK,KAAK,IAAI,YAAY,UAAU,gDAAgD,YAAY;AAAA;AAAA,wBAE5F,IAAI;AAAA,KACvB;AAAA,UACK,WAAW,WAAW;AACpB,oBAAQ,KAAK,KAAK,IAAI,YAAY,SAAS,gDAAgD,YAAY;AAAA;AAAA,wBAE3F,IAAI;AAAA,KACvB;AAAA,UACK,OAAO;AACL,oBAAQ,KAAK,KAAK,IAAI,+CAA+C,YAAY;AAAA;AAAA,wBAErE,IAAI;AAAA,KACvB;AAAA,UACK;AAAA,QACF,OAAO;AACL,cAAI,cAAc,UAAU;AAC1B,oBAAQ,KAAK,KAAK,IAAI,YAAY,UAAU,WAAW,QAAQ,gDAAgD,YAAY;AAAA;AAAA,wBAE/G,IAAI;AAAA,KACvB;AAAA,UACK,WAAW,YAAY;AACrB,oBAAQ,KAAK,KAAK,IAAI,YAAY,UAAU,gDAAgD,YAAY;AAAA;AAAA,wBAE5F,IAAI;AAAA,KACvB;AAAA,UACK,WAAW,UAAU;AACnB,oBAAQ,KAAK,KAAK,IAAI,UAAU,QAAQ,gDAAgD,YAAY;AAAA;AAAA,wBAExF,IAAI;AAAA,KACvB;AAAA,UACK,OAAO;AACL,oBAAQ,KAAK,KAAK,IAAI,+CAA+C,YAAY;AAAA;AAAA,wBAErE,IAAI;AAAA,KACvB;AAAA,UACK;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO,QAAQ,KAAK,IAAI;AAAA,EAC1B;AACF;;;ACnQA,OAAOE,SAAQ;AACf,OAAOC,WAAU;AAGV,IAAM,qBAAN,cAAiC,cAAc;AAAA,EACpD,MAAM,WAA0B;AAC9B,UAAM,UAAU,KAAK,gBAAgB;AACrC,UAAM,aAAaC,MAAK;AAAA,MACtB,KAAK,QAAQ,OAAO;AAAA,MACpB;AAAA,IACF;AAEA,UAAMC,IAAG,MAAMD,MAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,UAAMC,IAAG,UAAU,YAAY,SAAS,OAAO;AAAA,EACjD;AAAA,EAEQ,kBAA0B;AAChC,UAAM,aAAaD,MAAK,KAAK,KAAK,QAAQ,OAAO,WAAW,UAAU;AACtE,UAAM,gBAAgBA,MAAK,KAAK,KAAK,QAAQ,OAAO,aAAa;AACjE,UAAM,eAAeA,MAClB,SAASA,MAAK,QAAQ,UAAU,GAAG,aAAa,EAChD,QAAQ,OAAO,GAAG,EAClB,QAAQ,SAAS,EAAE;AAEtB,UAAM,UAAU;AAAA;AAAA;AAAA;AAAA,EAIlB,KAAK,yBAAyB,CAAC;AAAA;AAAA;AAG7B,WAAO;AAAA,EACT;AAAA,EAEQ,2BAAmC;AACzC,UAAM,iBAAiB,KAAK,yBAAyB;AACrD,UAAM,OAAiB,CAAC;AAExB,WAAO,QAAQ,cAAc,EAAE,QAAQ,CAAC,CAAC,UAAU,SAAS,MAAM;AAChE,YAAM,iBAAiB,UAAU;AAAA,QAC/B,CAAC,EAAE,SAAS,MAAM,SAAS,WAAW;AAAA,MACxC;AACA,UAAI,eAAe,WAAW,EAAG;AAEjC,YAAM,eAAyB,CAAC,cAAc,QAAQ,cAAc;AACpE,YAAM,QAAQ,oBAAI,IAAY;AAE9B,qBAAe,QAAQ,CAAC,EAAE,MAAM,SAAS,MAAM;AAC7C,cAAM,UAAU,KAAK,mBAAmB,IAAI;AAC5C,YAAI,MAAM,IAAI,OAAO,EAAG;AAExB,YAAI,SAAS,UAAU,SAAS,OAAO;AACrC,gBAAM,SAAmB,CAAC;AAC1B,cAAI,SAAS;AACX,mBAAO,KAAK,kBAAkB,KAAK,kBAAkB,IAAI,CAAC,EAAE;AAC9D,cAAI,SAAS;AACX,mBAAO,KAAK,iBAAiB,KAAK,iBAAiB,IAAI,CAAC,EAAE;AAE5D,uBAAa,KAAK,OAAO,OAAO,MAAM,OAAO,KAAK,IAAI,CAAC;AAAA,UACvD,QAAQ,OAAO,OAAO,MAAM,SAAS,SAAS,WAAW,WAAW,KAAK,SAAS,QAAQ,UAAU,WAAW,aAAa;AAAA,QAC9H,OAAO;AACL,uBAAa;AAAA,YACX,OAAO,OAAO,aAAa,QAAQ,OAAO,OAAO;AAAA,UACnD;AAAA,QACF;AACA,cAAM,IAAI,OAAO;AAAA,MACnB,CAAC;AAED,WAAK,KAAK,KAAK,QAAQ;AAAA,EAAQ,aAAa,KAAK,IAAI,CAAC;AAAA,KAAQ;AAAA,IAChE,CAAC;AAED,WAAO,KAAK,KAAK,IAAI;AAAA,EACvB;AACF;;;ACzEA,OAAOE,SAAQ;AACf,OAAOC,WAAU;AAGV,IAAM,wBAAN,cAAoC,cAAc;AAAA,EACvD,MAAM,WAA0B;AAC9B,UAAM,UAAU,KAAK,gBAAgB;AACrC,UAAM,aAAaC,MAAK;AAAA,MACtB,KAAK,QAAQ,OAAO;AAAA,MACpB;AAAA,IACF;AAEA,UAAMC,IAAG,MAAMD,MAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,UAAMC,IAAG,UAAU,YAAY,SAAS,OAAO;AAAA,EACjD;AAAA,EACQ,kBAA0B;AAChC,UAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMlB,KAAK,4BAA4B,CAAC;AAAA;AAAA;AAAA,EAGlC,KAAK,4BAA4B,CAAC;AAAA;AAAA;AAIhC,WAAO;AAAA,EACT;AAAA,EAEQ,8BAAsC;AAC5C,UAAM,SAAS,KAAK,yBAAyB;AAC7C,UAAM,UAAoB,CAAC;AAE3B,WAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU,SAAS,MAAM;AACxD,YAAM,UAAU,UAAU;AAAA,QACxB,CAAC,EAAE,SAAS,MAAM,SAAS,WAAW;AAAA,MACxC;AACA,UAAI,QAAQ,WAAW,EAAG;AAE1B,YAAM,kBAA4B,CAAC;AACnC,cAAQ,QAAQ,CAAC,EAAE,MAAM,SAAS,MAAM;AACtC,cAAM,aAAa,KAAK,mBAAmB,IAAI;AAC/C,cAAM,eAAe,SAAS,KAAK,oBAAoB,IAAI,CAAC;AAC5D,cAAM,aAAa,SAAS,SACxB,SAAS,KAAK,kBAAkB,IAAI,CAAC,KACrC;AACJ,cAAM,YAAY,SAAS,QACvB,SAAS,KAAK,iBAAiB,IAAI,CAAC,KACpC;AAEJ,cAAM,SAAmB,CAAC;AAC1B,YAAI,UAAU;AAEd,YAAI,cAAc,WAAW;AAC3B,iBAAO,KAAK,WAAW,UAAU,IAAI,aAAa,SAAS,EAAE;AAC7D,oBAAU,aAAa,IAAI;AAAA,QAC7B,WAAW,YAAY;AACrB,iBAAO,KAAK,WAAW,UAAU,EAAE;AACnC,oBAAU,aAAa,IAAI;AAAA,QAC7B,WAAW,WAAW;AACpB,iBAAO,KAAK,aAAa,SAAS,EAAE;AACpC,oBAAU,aAAa,IAAI;AAAA,QAC7B,OAAO;AACL,oBAAU,aAAa,IAAI;AAAA,QAC7B;AAEA,cAAM,UAAU,KAAK,qBAAqB,UAAU,MAAM,QAAQ;AAElE,wBAAgB,KAAK,KAAK,UAAU,MAAM,OAAO,KAAK,IAAI,CAAC;AAAA;AAAA,kBAEjD,OAAO;AAAA,6BACI,YAAY,QAAQ,OAAO;AAAA;AAAA,QAEhD;AAAA,MACF,CAAC;AAED,cAAQ;AAAA,QACN,SAAS,QAAQ;AAAA,EAAqB,gBAAgB,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,MAClE;AAAA,IACF,CAAC;AAED,WAAO,QAAQ,KAAK,IAAI;AAAA,EAC1B;AAAA,EAEQ,8BAAsC;AAC5C,UAAM,SAAS,KAAK,yBAAyB;AAC7C,UAAM,UAAoB,CAAC;AAE3B,WAAO,KAAK,MAAM,EAAE,QAAQ,CAAC,aAAa;AACxC,YAAM,aAAa,OAAO,QAAQ,EAAE;AAAA,QAClC,CAAC,EAAE,SAAS,MAAM,SAAS,WAAW;AAAA,MACxC;AACA,UAAI,WAAY,SAAQ,KAAK,KAAK,QAAQ,KAAK,QAAQ,eAAe;AAAA,IACxE,CAAC;AAED,WAAO,QAAQ,KAAK,IAAI;AAAA,EAC1B;AACF;;;ACpGA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAIV,IAAM,oBAAN,cAAgC,cAAc;AAAA,EACnD,MAAM,WAA0B;AAC9B,UAAM,UAAU,KAAK,gBAAgB;AACrC,UAAM,aAAaC,MAAK,KAAK,KAAK,QAAQ,OAAO,WAAW,cAAc;AAE1E,UAAMC,IAAG,MAAMD,MAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,UAAMC,IAAG,UAAU,YAAY,SAAS,OAAO;AAAA,EACjD;AAAA,EAEQ,kBAA0B;AAChC,UAAM,UAAU;AAAA;AAAA,EAElB,KAAK,gBAAgB,IAAI,uDAAuD,EAAE;AAAA;AAAA;AAAA,EAGlF,KAAK,0BAA0B,CAAC;AAAA;AAE9B,WAAO;AAAA,EACT;AAAA,EAEQ,4BAAoC;AAC1C,UAAM,QAAkB,CAAC;AACzB,WAAO,QAAQ,KAAK,QAAQ,UAAU,SAAS,EAAE;AAAA,MAC/C,CAAC,CAAC,MAAM,QAAQ,MAAM;AACpB,YAAI,SAAS,WAAW;AACtB,gBAAM,KAAK,KAAK,yBAAyB,MAAM,QAAQ,CAAC;AAAA,MAC5D;AAAA,IACF;AACA,WAAO,MAAM,KAAK,MAAM;AAAA,EAC1B;AAAA,EAEQ,yBACN,MACA,UACQ;AACR,UAAM,eAAe,WAAW,KAAK,WAAW,IAAI,CAAC;AACrD,UAAM,WAAW,KAAK,wBAAwB,MAAM,QAAQ;AAC5D,UAAM,aAAa,KAAK,mBAAmB,IAAI;AAE/C,UAAM,SAAmB,CAAC,0BAA0B;AACpD,UAAM,eAAyB,CAAC;AAEhC,QAAI,SAAS,QAAQ;AACnB,aAAO,KAAK,iBAAiB,KAAK,kBAAkB,IAAI,CAAC,EAAE;AAC3D,mBAAa,KAAK,QAAQ;AAAA,IAC5B;AACA,QAAI,SAAS,OAAO;AAClB,aAAO,KAAK,mBAAmB,KAAK,iBAAiB,IAAI,CAAC,EAAE;AAC5D,mBAAa,KAAK,SAAS;AAAA,IAC7B;AAEA,WAAO,gBAAgB,YAAY,aAAa,OAAO,KAAK,OAAO,CAAC;AAAA,6DACX,QAAQ,IAAI,UAAU,IAAI,aAAa,KAAK,IAAI,CAAC;AAAA;AAAA,EAE5G;AACF;;;AC5DA,OAAOC,SAAQ;AACf,OAAOC,YAAU;AAGV,IAAM,iBAAN,cAA6B,cAAc;AAAA,EAChD,MAAM,WAA0B;AAC9B,UAAM,UAAU,KAAK,gBAAgB;AACrC,UAAM,aAAaC,OAAK,KAAK,KAAK,QAAQ,OAAO,WAAW,UAAU;AAEtE,UAAMC,IAAG,MAAMD,OAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,UAAMC,IAAG,UAAU,YAAY,SAAS,OAAO;AAAA,EACjD;AAAA,EAEQ,kBAA0B;AAChC,UAAM,aAAaD,OAAK,KAAK,KAAK,QAAQ,OAAO,WAAW,UAAU;AACtE,UAAM,gBAAgBA,OAAK,KAAK,KAAK,QAAQ,OAAO,aAAa;AACjE,UAAM,eAAeA,OAClB,SAASA,OAAK,QAAQ,UAAU,GAAG,aAAa,EAChD,QAAQ,OAAO,GAAG,EAClB,QAAQ,SAAS,EAAE;AAEtB,UAAM,UAAU;AAAA;AAAA;AAAA;AAAA,EAIlB,KAAK,gBAAgB,IAAI,qCAAqC,EAAE;AAAA;AAAA;AAAA;AAAA,6BAIrC,YAAY;AAAA;AAErC,WAAO;AAAA,EACT;AACF;;;ACtBO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAAoBE,UAA2B;AAA3B,mBAAAA;AAAA,EAA4B;AAAA,EAEhD,MAAM,WAA0B;AAC9B,UAAM,aAAa,KAAK,cAAc;AAEtC,eAAW,aAAa,YAAY;AAClC,YAAM,UAAU,SAAS;AAAA,IAC3B;AAAA,EACF;AAAA,EAEQ,gBAAgB;AACtB,UAAM,aAAyB,CAAC;AAGhC,eAAW,KAAK,IAAI,eAAe,KAAK,OAAO,CAAC;AAChD,eAAW,KAAK,IAAI,eAAe,KAAK,OAAO,CAAC;AAGhD,QAAI,KAAK,QAAQ,OAAO,gBAAgB;AACtC,iBAAW,KAAK,IAAI,gBAAgB,KAAK,OAAO,CAAC;AAAA,IACnD;AAGA,QAAI,KAAK,QAAQ,OAAO,eAAe;AACrC,iBAAW,KAAK,IAAI,mBAAmB,KAAK,OAAO,CAAC;AACpD,iBAAW,KAAK,IAAI,sBAAsB,KAAK,OAAO,CAAC;AACvD,iBAAW,KAAK,IAAI,eAAe,KAAK,OAAO,CAAC;AAAA,IAClD;AAEA,QAAI,KAAK,QAAQ,OAAO,kBAAkB;AACxC,iBAAW,KAAK,IAAI,kBAAkB,KAAK,OAAO,CAAC;AAAA,IACrD;AAGA,QACE,KAAK,QAAQ,OAAO,yBACpB,KAAK,QAAQ,OAAO,aAAa,UACjC;AACA,iBAAW,KAAK,IAAI,uBAAuB,KAAK,OAAO,CAAC;AAAA,IAC1D;AAGA,QACE,KAAK,QAAQ,OAAO,yBACpB,KAAK,QAAQ,OAAO,aAAa,UACjC;AACA,iBAAW,KAAK,IAAI,uBAAuB,KAAK,OAAO,CAAC;AAAA,IAC1D;AAEA,WAAO;AAAA,EACT;AACF;;;AX3DA,SAAS,qBAAqB;AAEvB,IAAM,cAAN,MAAkB;AAAA,EACvB,YAAoB,QAAwB;AAAxB;AAAA,EAAyB;AAAA,EAE7C,MAAM,UAAyB;AAE7B,UAAM,YAAY,MAAM,KAAK,cAAc;AAG3C,SAAK,OAAO,YAAY;AAGxB,UAAM,YAAY,IAAI,cAAc;AAAA,MAClC,QAAQ,KAAK;AAAA,MACb;AAAA,IACF,CAAC;AAED,UAAM,UAAU,SAAS;AAAA,EAC3B;AAAA,EAEA,MAAc,gBAAoC;AAChD,QAAI;AAEF,YAAM,OAAO,WAAW,cAAc,YAAY,GAAG,GAAG;AAAA,QACtD,gBAAgB;AAAA,MAClB,CAAC;AAED,YAAM,SAAU,MAAM,KAAK,OAAO,KAAK,OAAO,aAAa;AAG3D,YAAM,YACJ,OAAO,aACP,OAAO,SAAS,aAChB,OAAO,WACP;AAEF,UAAI,CAAC,aAAa,CAAC,UAAU,WAAW;AACtC,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAGA,UAAI,KAAK,OAAO,gBAAgB;AAC9B,kBAAU,iBAAiB,KAAK,OAAO;AAAA,MACzC;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI;AAAA,QACR,kCAAkC,KAAK,OAAO,aAAa,MACzD,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AFvDA,OAAOC,YAAU;AAEjB,IAAM,UAAU,IAAI,QAAQ;AAG5B,gBAAgB,OAAO;AAGvB,IAAM,UAAU;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe,CAAC,aAAqB,IAAI,IAAI,UAAUA,OAAK,QAAQ,QAAQ,CAAC,EAAE;AACjF;AAEA,qBAAqB,SAAS,OAAO;AACrC,iBAAiB,OAAO;AACxB,qBAAqB,SAAS,OAAO;AAErC,QAAQ,MAAM;","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
@@ -359,7 +359,7 @@ export type ActionResult<T> =
359
359
  inputType = `body: ${bodyType}`;
360
360
  callArgs = "body";
361
361
  }
362
- const revalidateStatements = invalidationTags.length > 0 ? invalidationTags.map((tag) => ` revalidateTag('${tag}');`).join("\n") : " // No automatic revalidations";
362
+ const revalidateStatements = invalidationTags.length > 0 ? invalidationTags.map((tag) => ` revalidateTag('${tag}', 'max');`).join("\n") : " // No automatic revalidations";
363
363
  return `/**
364
364
  * ${endpoint.description || `Server action for ${name}`}
365
365
  * @tags ${endpoint.tags?.join(", ") || "none"}
@@ -590,6 +590,7 @@ export type { AuthCallbacks };
590
590
  const endpointsPath = path6.join(this.context.config.endpointsPath);
591
591
  const relativePath = path6.relative(path6.dirname(outputPath), endpointsPath).replace(/\\/g, "/").replace(/\.ts$/, "");
592
592
  return `import { createAPIClient } from '@cushin/api-runtime';
593
+ import type { AuthCallbacks } from '@cushin/api-runtime';
593
594
  import { apiConfig } from '${relativePath}';
594
595
  import type * as Types from './types';
595
596
 
@@ -598,11 +599,43 @@ type APIClientMethods = {
598
599
  ${this.generateAPIClientMethodTypes()}
599
600
  };
600
601
 
602
+ // Export singleton instance (will be initialized later if auth is needed)
603
+ export let serverClient: APIClientMethods & {
604
+ refreshAuth: () => Promise<void>;
605
+ updateAuthCallbacks: (callbacks: AuthCallbacks) => void;
606
+ };
607
+
608
+ // Initialize without auth by default
609
+ serverClient = createAPIClient(apiConfig) as any;
610
+
601
611
  /**
602
- * Server-side API client (no auth, direct API calls)
603
- * Use this in Server Components, Server Actions, and Route Handlers
612
+ * Initialize server-side API client with auth callbacks
613
+ * Call this in Server Actions or Route Handlers where you need authentication
614
+ *
615
+ * @example
616
+ * // In a Server Action or API Route:
617
+ * import { cookies } from 'next/headers';
618
+ *
619
+ * const authCallbacks = {
620
+ * getTokens: async () => {
621
+ * const token = cookies().get('auth_token')?.value;
622
+ * return token ? { accessToken: token } : null;
623
+ * },
624
+ * onAuthError: () => {
625
+ * // Handle auth error (e.g., redirect, clear cookies)
626
+ * }
627
+ * };
628
+ *
629
+ * initializeServerClient(authCallbacks);
604
630
  */
605
- export const serverClient = createAPIClient(apiConfig) as APIClientMethods;
631
+ export const initializeServerClient = (authCallbacks: AuthCallbacks) => {
632
+ serverClient = createAPIClient(apiConfig, authCallbacks) as any;
633
+ return serverClient;
634
+ };
635
+
636
+ // Export for custom usage
637
+ export { createAPIClient };
638
+ export type { AuthCallbacks };
606
639
  `;
607
640
  }
608
641
  generateAPIClientMethodTypes() {
@@ -616,23 +649,23 @@ export const serverClient = createAPIClient(apiConfig) as APIClientMethods;
616
649
  let signature = "";
617
650
  if (endpoint.method === "GET") {
618
651
  if (paramsType && queryType) {
619
- signature = `(params: ${paramsType}, query?: ${queryType}) => Promise<${responseType}>`;
652
+ signature = `(params: ${paramsType}, query?: ${queryType}, headers?: Record<string, string>) => Promise<${responseType}>`;
620
653
  } else if (paramsType) {
621
- signature = `(params: ${paramsType}) => Promise<${responseType}>`;
654
+ signature = `(params: ${paramsType}, headers?: Record<string, string>) => Promise<${responseType}>`;
622
655
  } else if (queryType) {
623
- signature = `(query?: ${queryType}) => Promise<${responseType}>`;
656
+ signature = `(query?: ${queryType}, headers?: Record<string, string>) => Promise<${responseType}>`;
624
657
  } else {
625
- signature = `() => Promise<${responseType}>`;
658
+ signature = `(headers?: Record<string, string>) => Promise<${responseType}>`;
626
659
  }
627
660
  } else {
628
661
  if (paramsType && bodyType) {
629
- signature = `(params: ${paramsType}, body: ${bodyType}) => Promise<${responseType}>`;
662
+ signature = `(params: ${paramsType}, body: ${bodyType}, headers?: Record<string, string>) => Promise<${responseType}>`;
630
663
  } else if (paramsType) {
631
- signature = `(params: ${paramsType}) => Promise<${responseType}>`;
664
+ signature = `(params: ${paramsType}, headers?: Record<string, string>) => Promise<${responseType}>`;
632
665
  } else if (bodyType) {
633
- signature = `(body: ${bodyType}) => Promise<${responseType}>`;
666
+ signature = `(body: ${bodyType}, headers?: Record<string, string>) => Promise<${responseType}>`;
634
667
  } else {
635
- signature = `() => Promise<${responseType}>`;
668
+ signature = `(headers?: Record<string, string>) => Promise<${responseType}>`;
636
669
  }
637
670
  }
638
671
  methods.push(` ${name}: ${signature};`);
@@ -650,46 +683,46 @@ export const serverClient = createAPIClient(apiConfig) as APIClientMethods;
650
683
  const bodyType = endpoint.body ? `Types.${this.getInputTypeName(name)}` : null;
651
684
  if (endpoint.method === "GET") {
652
685
  if (paramsType && queryType) {
653
- methods.push(` ${name}(params: ${paramsType}, query?: ${queryType}): Promise<${responseType}> {
686
+ methods.push(` ${name}(params: ${paramsType}, query?: ${queryType}, headers?: Record<string, string>): Promise<${responseType}> {
654
687
  if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');
655
- return baseClient.${name}(params, query);
688
+ return baseClient.${name}(params, query, headers);
656
689
  },`);
657
690
  } else if (paramsType) {
658
- methods.push(` ${name}(params: ${paramsType}): Promise<${responseType}> {
691
+ methods.push(` ${name}(params: ${paramsType}, headers?: Record<string, string>): Promise<${responseType}> {
659
692
  if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');
660
- return baseClient.${name}(params);
693
+ return baseClient.${name}(params, headers);
661
694
  },`);
662
695
  } else if (queryType) {
663
- methods.push(` ${name}(query?: ${queryType}): Promise<${responseType}> {
696
+ methods.push(` ${name}(query?: ${queryType}, headers?: Record<string, string>): Promise<${responseType}> {
664
697
  if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');
665
- return baseClient.${name}(query);
698
+ return baseClient.${name}(query, headers);
666
699
  },`);
667
700
  } else {
668
- methods.push(` ${name}(): Promise<${responseType}> {
701
+ methods.push(` ${name}(headers?: Record<string, string>): Promise<${responseType}> {
669
702
  if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');
670
- return baseClient.${name}();
703
+ return baseClient.${name}(headers);
671
704
  },`);
672
705
  }
673
706
  } else {
674
707
  if (paramsType && bodyType) {
675
- methods.push(` ${name}(params: ${paramsType}, body: ${bodyType}): Promise<${responseType}> {
708
+ methods.push(` ${name}(params: ${paramsType}, body: ${bodyType}, headers?: Record<string, string>): Promise<${responseType}> {
676
709
  if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');
677
- return baseClient.${name}(params, body);
710
+ return baseClient.${name}(params, body, headers);
678
711
  },`);
679
712
  } else if (paramsType) {
680
- methods.push(` ${name}(params: ${paramsType}): Promise<${responseType}> {
713
+ methods.push(` ${name}(params: ${paramsType}, headers?: Record<string, string>): Promise<${responseType}> {
681
714
  if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');
682
- return baseClient.${name}(params);
715
+ return baseClient.${name}(params, headers);
683
716
  },`);
684
717
  } else if (bodyType) {
685
- methods.push(` ${name}(body: ${bodyType}): Promise<${responseType}> {
718
+ methods.push(` ${name}(body: ${bodyType}, headers?: Record<string, string>): Promise<${responseType}> {
686
719
  if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');
687
- return baseClient.${name}(body);
720
+ return baseClient.${name}(body, headers);
688
721
  },`);
689
722
  } else {
690
- methods.push(` ${name}(): Promise<${responseType}> {
723
+ methods.push(` ${name}(headers?: Record<string, string>): Promise<${responseType}> {
691
724
  if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');
692
- return baseClient.${name}();
725
+ return baseClient.${name}(headers);
693
726
  },`);
694
727
  }
695
728
  }
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/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 * Accept-Encoding header value for API requests\n * @default \"gzip, deflate, br\"\n * @example \"br, gzip, deflate\" (prioritize Brotli, exclude zstd)\n */\n acceptEncoding?: string;\n\n /**\n * Path to the endpoints configuration file\n */\n endpoints: string;\n\n /**\n * Provider type: 'vite' | 'nextjs'\n */\n provider: \"vite\" | \"nextjs\";\n\n /**\n * Output directory for generated files\n */\n output: string;\n\n /**\n * Whether to generate React Query hooks (for client-side)\n * @default true for vite, nextjs\n */\n generateHooks?: boolean;\n\n /**\n * Whether to generate server actions (Next.js only)\n * @default true for nextjs, false for vite\n */\n generateServerActions?: boolean;\n\n /**\n * Whether to generate server queries (Next.js only)\n * @default true for nextjs, false for vite\n */\n generateServerQueries?: boolean;\n\n /**\n * Whether to generate API client\n * @default true\n */\n generateClient?: boolean;\n\n /**\n * Whether to generate prefetch utilities\n * @default true\n */\n generatePrefetch?: boolean;\n\n /**\n * Custom templates directory\n */\n templatesDir?: string;\n\n /**\n * Additional options\n */\n options?: {\n /**\n * Use 'use client' directive\n */\n useClientDirective?: boolean;\n\n /**\n * Custom imports to add to generated files\n */\n customImports?: Record<string, string[]>;\n\n /**\n * Prefix for generated hook names\n */\n hookPrefix?: string;\n\n /**\n * Suffix for generated action names\n */\n actionSuffix?: string;\n };\n}\n\nexport interface ResolvedConfig extends UserConfig {\n rootDir: string;\n endpointsPath: string;\n outputDir: string;\n apiConfig?: APIConfig;\n}\n\nconst explorer = cosmiconfig(\"api-codegen\", {\n searchPlaces: [\n \"api-codegen.config.js\",\n \"api-codegen.config.mjs\",\n \"api-codegen.config.ts\",\n \"api-codegen.config.json\",\n \".api-codegenrc\",\n \".api-codegenrc.json\",\n \".api-codegenrc.js\",\n ],\n});\n\nexport async function loadConfig(\n configPath?: string,\n): Promise<ResolvedConfig | null> {\n try {\n const result = configPath\n ? await explorer.load(configPath)\n : await explorer.search();\n\n if (!result || !result.config) {\n return null;\n }\n\n const userConfig = result.config as UserConfig;\n const rootDir = path.dirname(result.filepath);\n\n // Resolve paths\n const endpointsPath = path.resolve(rootDir, userConfig.endpoints);\n const outputDir = path.resolve(rootDir, userConfig.output);\n\n // Set defaults based on provider\n const generateHooks = userConfig.generateHooks ?? true;\n const generateServerActions =\n userConfig.generateServerActions ?? userConfig.provider === \"nextjs\";\n const generateServerQueries =\n userConfig.generateServerQueries ?? userConfig.provider === \"nextjs\";\n const generateClient = userConfig.generateClient ?? true;\n const generatePrefetch = userConfig.generatePrefetch ?? true;\n\n return {\n ...userConfig,\n rootDir,\n endpointsPath,\n outputDir,\n generateHooks,\n generateServerActions,\n generateServerQueries,\n generateClient,\n generatePrefetch,\n };\n } catch (error) {\n throw new Error(\n `Failed to load config: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\n/**\n * Validate user config\n */\nexport function validateConfig(config: UserConfig): void {\n if (!config.endpoints) {\n throw new Error('Config error: \"endpoints\" path is required');\n }\n\n if (!config.provider) {\n throw new Error(\n 'Config error: \"provider\" must be specified (vite or nextjs)',\n );\n }\n\n if (![\"vite\", \"nextjs\"].includes(config.provider)) {\n throw new Error(\n 'Config error: \"provider\" must be either \"vite\" or \"nextjs\"',\n );\n }\n\n if (!config.output) {\n throw new Error('Config error: \"output\" directory is required');\n }\n}\n","import { createJiti } from \"jiti\";\nimport type { APIConfig } from \"@cushin/api-runtime\";\nimport type { ResolvedConfig } from \"../config/index.js\";\nimport { CodeGenerator } from \"../generators/index.js\";\nimport { fileURLToPath } from \"url\";\n\nexport class CodegenCore {\n constructor(private config: ResolvedConfig) {}\n\n async execute(): Promise<void> {\n // Load API configuration\n const apiConfig = await this.loadAPIConfig();\n\n // Store in config for generators\n this.config.apiConfig = apiConfig;\n\n // Generate code\n const generator = new CodeGenerator({\n config: this.config,\n apiConfig,\n });\n\n await generator.generate();\n }\n\n private async loadAPIConfig(): Promise<APIConfig> {\n try {\n // Use jiti to load TypeScript files\n const jiti = createJiti(fileURLToPath(import.meta.url), {\n interopDefault: true,\n });\n\n const module = (await jiti.import(this.config.endpointsPath)) as any;\n\n // Try different export patterns\n const apiConfig =\n module.apiConfig ||\n module.default?.apiConfig ||\n module.default ||\n module;\n\n if (!apiConfig || !apiConfig.endpoints) {\n throw new Error(\n 'Invalid API config: must export an object with \"endpoints\" property',\n );\n }\n\n // Merge acceptEncoding from user config if provided\n if (this.config.acceptEncoding) {\n apiConfig.acceptEncoding = this.config.acceptEncoding;\n }\n\n return apiConfig;\n } catch (error) {\n throw new Error(\n `Failed to load endpoints from \"${this.config.endpointsPath}\": ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"@cushin/api-runtime\";\n\nexport class HooksGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"hooks.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const useClientDirective =\n this.context.config.options?.useClientDirective ?? true;\n\n const content = `${useClientDirective ? \"'use client';\\n\" : \"\"}\nimport { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { apiClient } from \"./client\";\nimport { queryKeys } from \"./query-keys\";\nimport { apiQueryOptions } from \"./query-options\";\nimport type * as Types from \"./types\";\n\n${this.generateQueryHooks()}\n${this.generateMutationHooks()}\n`;\n\n return content;\n }\n\n private generateQueryHooks(): string {\n const hooks: string[] = [];\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n if (endpoint.method === \"GET\")\n hooks.push(this.generateQueryHook(name, endpoint));\n },\n );\n return hooks.join(\"\\n\\n\");\n }\n\n private generateQueryHook(name: string, endpoint: APIEndpoint): string {\n const hookName = `use${this.capitalize(name)}`;\n const resource = this.getResourceFromEndpoint(name, endpoint);\n const optionName = this.getEndpointKeyName(name);\n\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const queryType = endpoint.query\n ? `Types.${this.getQueryTypeName(name)}`\n : null;\n\n const params: string[] = [];\n const optionParams: string[] = [];\n\n const queryTags = this.getQueryTags(endpoint);\n\n if (paramsType) {\n params.push(`params: ${paramsType}`);\n optionParams.push(\"params\");\n }\n if (queryType) {\n params.push(`filters?: ${queryType}`);\n optionParams.push(\"filters\");\n }\n\n params.push(`options?: {\n enabled?: boolean;\n select?: <TData = ${responseType}>(data: ${responseType}) => TData;\n }`);\n\n return `/**\n * ${endpoint.description || `Query hook for ${name}`}\n * @tags ${queryTags.join(\", \") || \"none\"}\n */\nexport function ${hookName}(${params.join(\",\\n \")}) {\n return useQuery({\n ...apiQueryOptions.${resource}.${optionName}(${optionParams.join(\", \")}),\n ...options,\n });\n}`;\n }\n\n private generateMutationHooks(): string {\n const hooks: string[] = [];\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n if (endpoint.method !== \"GET\")\n hooks.push(this.generateMutationHook(name, endpoint));\n },\n );\n return hooks.join(\"\\n\\n\");\n }\n\n private generateMutationHook(name: string, endpoint: APIEndpoint): string {\n const hookName = `use${this.capitalize(name)}`;\n const resource = this.getResourceFromEndpoint(name, endpoint);\n\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const bodyType = endpoint.body ? `Types.${this.getInputTypeName(name)}` : null;\n\n const resourceHasQueries = this.resourceHasQueryEndpoints(resource);\n\n let inputType: string;\n let fnBody: string;\n\n if (paramsType && bodyType) {\n inputType = `{ params: ${paramsType}; body: ${bodyType}; }`;\n fnBody = `({ params, body }: ${inputType}) => apiClient.${name}(params, body)`;\n } else if (paramsType) {\n inputType = paramsType;\n fnBody = `(params: ${inputType}) => apiClient.${name}(params)`;\n } else if (bodyType) {\n inputType = bodyType;\n fnBody = `(body: ${inputType}) => apiClient.${name}(body)`;\n } else {\n inputType = \"void\";\n fnBody = `() => apiClient.${name}()`;\n }\n\n const invalidate = resourceHasQueries\n ? `queryClient.invalidateQueries({ queryKey: queryKeys.${resource}.all });`\n : \"\";\n\n return `/**\n * ${endpoint.description || `Mutation hook for ${name}`}\n * @tags ${endpoint.tags?.join(\", \") || \"none\"}\n */\nexport function ${hookName}(options?: {\n onSuccess?: (data: ${responseType}, variables: ${inputType}, context: unknown) => void;\n onError?: (error: Error, variables: ${inputType}, context: unknown) => void;\n onSettled?: (data: ${responseType} | undefined, error: Error | null, variables: ${inputType}, context: unknown) => void;\n onMutate?: (variables: ${inputType}) => Promise<unknown> | unknown;\n}) {\n ${invalidate ? \"const queryClient = useQueryClient();\" : \"\"}\n return useMutation({\n mutationFn: ${fnBody},\n onSuccess: (data, variables, context) => {\n ${invalidate}\n options?.onSuccess?.(data, variables, context);\n },\n onError: options?.onError,\n onSettled: options?.onSettled,\n onMutate: options?.onMutate,\n });\n}`;\n }\n}\n","import type { APIConfig, APIEndpoint } from \"@cushin/api-runtime\";\nimport type { ResolvedConfig } from \"../config/index.js\";\n\nexport interface GeneratorContext {\n config: ResolvedConfig;\n apiConfig: APIConfig;\n}\n\nexport abstract class BaseGenerator {\n constructor(protected context: GeneratorContext) {}\n\n abstract generate(): Promise<void>;\n\n protected isQueryEndpoint(endpoint: APIEndpoint): boolean {\n return endpoint.method === \"GET\";\n }\n\n protected isMutationEndpoint(endpoint: APIEndpoint): boolean {\n return !this.isQueryEndpoint(endpoint);\n }\n\n protected capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n\n protected getQueryTags(endpoint: APIEndpoint): string[] {\n return endpoint.tags || [];\n }\n\n protected getInvalidationTags(endpoint: APIEndpoint): string[] {\n const tags = endpoint.tags || [];\n return tags.filter((tag) => tag !== \"query\" && tag !== \"mutation\");\n }\n\n protected hasParams(endpoint: APIEndpoint): boolean {\n return !!endpoint.params;\n }\n\n protected hasQuery(endpoint: APIEndpoint): boolean {\n return !!endpoint.query;\n }\n\n protected hasBody(endpoint: APIEndpoint): boolean {\n return !!endpoint.body;\n }\n\n protected getEndpointSignature(\n name: string,\n endpoint: APIEndpoint,\n ): {\n hasParams: boolean;\n hasQuery: boolean;\n hasBody: boolean;\n paramType: string;\n queryType: string;\n bodyType: string;\n responseType: string;\n } {\n const hasParams = this.hasParams(endpoint);\n const hasQuery = this.hasQuery(endpoint);\n const hasBody = this.hasBody(endpoint);\n\n return {\n hasParams,\n hasQuery,\n hasBody,\n paramType: hasParams ? this.inferNonNull(`typeof apiConfig.endpoints.${name}.params`) : \"never\",\n queryType: hasQuery ? this.inferNonNull(`typeof apiConfig.endpoints.${name}.query`) : \"never\",\n bodyType: hasBody ? this.inferNonNull(`typeof apiConfig.endpoints.${name}.body`) : \"never\",\n responseType: this.inferNonNull(`typeof apiConfig.endpoints.${name}.response`),\n };\n }\n\n protected generateMutationCall(\n name: string,\n hasParams: boolean,\n hasBody: boolean,\n ): string {\n if (hasParams && hasBody) {\n return `return apiClient.${name}(input.params, input.body);`;\n } else if (hasParams) {\n return `return apiClient.${name}(input);`;\n } else if (hasBody) {\n return `return apiClient.${name}(input);`;\n } else {\n return `return apiClient.${name}();`;\n }\n }\n\n protected inferNonNull(expr: string): string {\n return `z.infer<NonNullable<${expr}>>`;\n }\n\n protected toCamelCase(str: string): string {\n return str\n .toLowerCase()\n .replace(/[-_\\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : \"\"))\n .replace(/^./, (c) => c.toLowerCase());\n }\n\n protected getResourceFromEndpoint(\n _name: string,\n endpoint: APIEndpoint,\n ): string {\n const tag = endpoint.tags?.find((t) => t !== \"query\" && t !== \"mutation\");\n if (tag) return this.toCamelCase(tag);\n const match = endpoint.path.match(/^\\/([^/]+)/);\n return match ? this.toCamelCase(match[1]) : \"general\";\n }\n\n protected groupEndpointsByResource() {\n const groups: Record<\n string,\n Array<{ name: string; endpoint: APIEndpoint }>\n > = {};\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n const res = this.getResourceFromEndpoint(name, endpoint);\n if (!groups[res]) groups[res] = [];\n groups[res].push({ name, endpoint });\n },\n );\n return groups;\n }\n\n protected resourceHasQueryEndpoints(resource: string): boolean {\n return (\n this.groupEndpointsByResource()[resource]?.some(\n ({ endpoint }) => endpoint.method === \"GET\",\n ) ?? false\n );\n }\n\n protected getEndpointKeyName(name: string): string {\n return name.startsWith(\"get\")\n ? name[3].toLowerCase() + name.slice(4)\n : name;\n }\n\n protected generateQueryKeyCall(\n resource: string,\n name: string,\n endpoint: APIEndpoint,\n ): string {\n const key = this.getEndpointKeyName(name);\n const args: string[] = [];\n if (endpoint.params) args.push(\"params\");\n if (endpoint.query) args.push(\"filters\");\n return args.length\n ? `queryKeys.${resource}.${key}(${args.join(\", \")})`\n : `queryKeys.${resource}.${key}()`;\n }\n\n protected hasQueryOptions() {\n return Object.values(this.context.apiConfig.endpoints).some(\n (e) => e.method === \"GET\",\n );\n }\n\n // Helper methods to get named type references\n protected getResponseTypeName(name: string): string {\n return `${this.capitalize(name)}Response`;\n }\n\n protected getInputTypeName(name: string): string {\n return `${this.capitalize(name)}Input`;\n }\n\n protected getQueryTypeName(name: string): string {\n return `${this.capitalize(name)}Query`;\n }\n\n protected getParamsTypeName(name: string): string {\n return `${this.capitalize(name)}Params`;\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"@cushin/api-runtime\";\n\nexport class ServerActionsGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"actions.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const imports = `'use server';\n\nimport { revalidateTag, revalidatePath } from 'next/cache';\nimport { serverClient } from './server-client';\nimport type * as Types from './types';\n\nexport type ActionResult<T> =\n | { success: true; data: T }\n | { success: false; error: string };\n`;\n\n const actions: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n if (this.isMutationEndpoint(endpoint)) {\n actions.push(this.generateServerAction(name, endpoint));\n }\n },\n );\n\n return imports + \"\\n\" + actions.join(\"\\n\\n\");\n }\n\n private generateServerAction(name: string, endpoint: APIEndpoint): string {\n const actionSuffix = this.context.config.options?.actionSuffix || \"Action\";\n const actionName = `${name}${actionSuffix}`;\n const invalidationTags = this.getInvalidationTags(endpoint);\n\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const bodyType = endpoint.body ? `Types.${this.getInputTypeName(name)}` : null;\n\n let inputType = \"\";\n let callArgs = \"\";\n if (paramsType && bodyType) {\n inputType = `input: { params: ${paramsType}; body: ${bodyType} }`;\n callArgs = \"input.params, input.body\";\n } else if (paramsType) {\n inputType = `params: ${paramsType}`;\n callArgs = \"params\";\n } else if (bodyType) {\n inputType = `body: ${bodyType}`;\n callArgs = \"body\";\n }\n\n const revalidateStatements =\n invalidationTags.length > 0\n ? invalidationTags\n .map((tag) => ` revalidateTag('${tag}');`)\n .join(\"\\n\")\n : \" // No automatic revalidations\";\n\n return `/**\n * ${endpoint.description || `Server action for ${name}`}\n * @tags ${endpoint.tags?.join(\", \") || \"none\"}\n */\nexport async function ${actionName}(\n ${inputType}\n): Promise<ActionResult<${responseType}>> {\n try {\n const result = await (serverClient as any).${name}(${callArgs});\n\n // Revalidate related data\n${revalidateStatements}\n\n return { success: true, data: result };\n } catch (error) {\n console.error('[Server Action Error]:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n };\n }\n}`;\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"@cushin/api-runtime\";\n\nexport class ServerQueriesGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"queries.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const imports = `import { cache } from 'react';\nimport { unstable_cache } from 'next/cache';\nimport { serverClient } from './server-client';\nimport type * as Types from './types';\n`;\n\n const queries: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n if (this.isQueryEndpoint(endpoint)) {\n queries.push(this.generateServerQuery(name, endpoint));\n }\n },\n );\n\n return imports + \"\\n\" + queries.join(\"\\n\\n\");\n }\n\n private generateServerQuery(name: string, endpoint: APIEndpoint): string {\n const queryName = `${name}Query`;\n const queryTags = this.getQueryTags(endpoint);\n\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const queryType = endpoint.query\n ? `Types.${this.getQueryTypeName(name)}`\n : null;\n\n const paramDef = paramsType ? `params: ${paramsType}` : \"\";\n const queryDef = queryType ? `query?: ${queryType}` : \"\";\n const paramsList = [paramDef, queryDef].filter(Boolean).join(\",\\n \");\n\n // Build client call with proper argument handling\n let clientCall = \"\";\n if (paramsType && queryType) {\n clientCall = `(serverClient as any).${name}(params, query)`;\n } else if (paramsType) {\n clientCall = `(serverClient as any).${name}(params)`;\n } else if (queryType) {\n clientCall = `(serverClient as any).${name}(query)`;\n } else {\n clientCall = `(serverClient as any).${name}()`;\n }\n\n // Generate cache key based on params\n const cacheKeyParts: string[] = [`'${name}'`];\n if (paramsType) cacheKeyParts.push(\"JSON.stringify(params)\");\n if (queryType)\n cacheKeyParts.push(\"query ? JSON.stringify(query) : 'no-query'\");\n\n return `/**\n * ${endpoint.description || `Server query for ${name}`}\n * @tags ${queryTags.join(\", \") || \"none\"}\n */\nexport const ${queryName} = cache(async (\n ${paramsList}\n): Promise<${responseType}> => {\n return unstable_cache(\n async () => ${clientCall},\n [${cacheKeyParts.join(\", \")}],\n {\n tags: [${queryTags.map((tag) => `'${tag}'`).join(\", \")}],\n revalidate: 3600, // 1 hour default, can be overridden\n }\n )();\n});`;\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class TypesGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.ts$/, \"\");\n\n return `// Auto-generated type definitions\n// Do not edit this file manually\n\nimport type { z } from 'zod';\nimport { apiConfig } from '${relativePath}';\n\n\n// Re-export endpoint configuration types\nexport type { APIConfig, APIEndpoint, HTTPMethod } from '@cushin/api-runtime';\n\n${this.generateEndpointTypes()}\n`;\n }\n\n private generateEndpointTypes(): string {\n const types: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n const cap = this.capitalize(name);\n\n // Always generate Response type\n types.push(\n `export type ${cap}Response = z.infer<NonNullable<typeof apiConfig.endpoints.${name}.response>>;`,\n );\n\n // Generate Input type for body (if exists)\n if (endpoint.body) {\n types.push(\n `export type ${cap}Input = z.infer<NonNullable<typeof apiConfig.endpoints.${name}.body>>;`,\n );\n }\n\n // Generate Query type (if exists)\n if (endpoint.query) {\n types.push(\n `export type ${cap}Query = z.infer<NonNullable<typeof apiConfig.endpoints.${name}.query>>;`,\n );\n }\n\n // Generate Params type (if exists)\n if (endpoint.params) {\n types.push(\n `export type ${cap}Params = z.infer<NonNullable<typeof apiConfig.endpoints.${name}.params>>;`,\n );\n }\n },\n );\n\n return types.join(\"\\n\");\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class ClientGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n await this.generateClientFile();\n\n if (this.context.config.provider === \"nextjs\") {\n await this.generateServerClientFile();\n }\n }\n\n private async generateClientFile(): Promise<void> {\n const content = this.generateClientContent();\n const outputPath = path.join(this.context.config.outputDir, \"client.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private async generateServerClientFile(): Promise<void> {\n const content = this.generateServerClientContent();\n const outputPath = path.join(\n this.context.config.outputDir,\n \"server-client.ts\",\n );\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateClientContent(): string {\n const useClientDirective =\n this.context.config.options?.useClientDirective ?? true;\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.ts$/, \"\");\n\n return `${useClientDirective ? \"'use client';\\n\" : \"\"}\nimport { createAPIClient } from '@cushin/api-runtime';\nimport type { AuthCallbacks } from '@cushin/api-runtime';\nimport { apiConfig } from '${relativePath}';\nimport type * as Types from './types';\n\n// Type the methods based on generated types\ntype APIClientMethods = {\n${this.generateAPIClientMethodTypes()}\n};\n\n// Export singleton instance (will be initialized later)\nexport let baseClient: APIClientMethods & {\n refreshAuth: () => Promise<void>;\n updateAuthCallbacks: (callbacks: AuthCallbacks) => void;\n};\n\nexport const apiClient = {\n${this.generateApiClientMethods()}\n};\n\n/**\n * Initialize API client with auth callbacks\n * Call this function in your auth provider setup\n *\n * @example\n * const authCallbacks = {\n * getTokens: () => getStoredTokens(),\n * onAuthError: () => router.push('/login'),\n * onRefreshToken: async () => {\n * await refreshAccessToken();\n * },\n * };\n *\n * initializeAPIClient(authCallbacks);\n */\nexport const initializeAPIClient = (authCallbacks: AuthCallbacks) => {\n baseClient = createAPIClient(apiConfig, authCallbacks) as any;\n return baseClient;\n};\n\n// Export for custom usage\nexport { createAPIClient };\nexport type { AuthCallbacks };\n`;\n }\n\n private generateServerClientContent(): string {\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.ts$/, \"\");\n\n return `import { createAPIClient } from '@cushin/api-runtime';\nimport { apiConfig } from '${relativePath}';\nimport type * as Types from './types';\n\n// Type the methods based on generated types\ntype APIClientMethods = {\n${this.generateAPIClientMethodTypes()}\n};\n\n/**\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 generateAPIClientMethodTypes(): string {\n const methods: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const queryType = endpoint.query\n ? `Types.${this.getQueryTypeName(name)}`\n : null;\n const bodyType = endpoint.body\n ? `Types.${this.getInputTypeName(name)}`\n : null;\n\n let signature = \"\";\n if (endpoint.method === \"GET\") {\n if (paramsType && queryType) {\n signature = `(params: ${paramsType}, query?: ${queryType}) => Promise<${responseType}>`;\n } else if (paramsType) {\n signature = `(params: ${paramsType}) => Promise<${responseType}>`;\n } else if (queryType) {\n signature = `(query?: ${queryType}) => Promise<${responseType}>`;\n } else {\n signature = `() => Promise<${responseType}>`;\n }\n } else {\n if (paramsType && bodyType) {\n signature = `(params: ${paramsType}, body: ${bodyType}) => Promise<${responseType}>`;\n } else if (paramsType) {\n signature = `(params: ${paramsType}) => Promise<${responseType}>`;\n } else if (bodyType) {\n signature = `(body: ${bodyType}) => Promise<${responseType}>`;\n } else {\n signature = `() => Promise<${responseType}>`;\n }\n }\n\n methods.push(` ${name}: ${signature};`);\n },\n );\n\n return methods.join(\"\\n\");\n }\n\n private generateApiClientMethods(): string {\n const methods: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const queryType = endpoint.query\n ? `Types.${this.getQueryTypeName(name)}`\n : null;\n const bodyType = endpoint.body\n ? `Types.${this.getInputTypeName(name)}`\n : null;\n\n if (endpoint.method === \"GET\") {\n if (paramsType && queryType) {\n methods.push(` ${name}(params: ${paramsType}, query?: ${queryType}): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(params, query);\n },`);\n } else if (paramsType) {\n methods.push(` ${name}(params: ${paramsType}): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(params);\n },`);\n } else if (queryType) {\n methods.push(` ${name}(query?: ${queryType}): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(query);\n },`);\n } else {\n methods.push(` ${name}(): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}();\n },`);\n }\n } else {\n if (paramsType && bodyType) {\n methods.push(` ${name}(params: ${paramsType}, body: ${bodyType}): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(params, body);\n },`);\n } else if (paramsType) {\n methods.push(` ${name}(params: ${paramsType}): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(params);\n },`);\n } else if (bodyType) {\n methods.push(` ${name}(body: ${bodyType}): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(body);\n },`);\n } else {\n methods.push(` ${name}(): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}();\n },`);\n }\n }\n },\n );\n\n return methods.join(\"\\n\");\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class QueryKeysGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(\n this.context.config.outputDir,\n \"query-keys.ts\",\n );\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.ts$/, \"\");\n\n const content = `// Auto-generated query keys\nimport type * as Types from './types';\n\nexport const queryKeys = {\n${this.generateQueryKeysContent()}\n} as const;\n`;\n return content;\n }\n\n private generateQueryKeysContent(): string {\n const resourceGroups = this.groupEndpointsByResource();\n const keys: string[] = [];\n\n Object.entries(resourceGroups).forEach(([resource, endpoints]) => {\n const queryEndpoints = endpoints.filter(\n ({ endpoint }) => endpoint.method === \"GET\",\n );\n if (queryEndpoints.length === 0) return;\n\n const resourceKeys: string[] = [` all: ['${resource}'] as const,`];\n const added = new Set<string>();\n\n queryEndpoints.forEach(({ name, endpoint }) => {\n const keyName = this.getEndpointKeyName(name);\n if (added.has(keyName)) return;\n\n if (endpoint.params || endpoint.query) {\n const params: string[] = [];\n if (endpoint.params)\n params.push(`params?: Types.${this.getParamsTypeName(name)}`);\n if (endpoint.query)\n params.push(`query?: Types.${this.getQueryTypeName(name)}`);\n\n resourceKeys.push(` ${keyName}: (${params.join(\", \")}) =>\n ['${resource}', '${keyName}', ${endpoint.params ? \"params\" : \"undefined\"}, ${endpoint.query ? \"query\" : \"undefined\"}] as const,`);\n } else {\n resourceKeys.push(\n ` ${keyName}: () => ['${resource}', '${keyName}'] as const,`,\n );\n }\n added.add(keyName);\n });\n\n keys.push(` ${resource}: {\\n${resourceKeys.join(\"\\n\")}\\n },`);\n });\n\n return keys.join(\"\\n\");\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class QueryOptionsGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(\n this.context.config.outputDir,\n \"query-options.ts\",\n );\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n private generateContent(): string {\n const content = `// Auto-generated query options\nimport { queryOptions } from '@tanstack/react-query';\nimport { apiClient } from './client';\nimport { queryKeys } from './query-keys';\nimport type * as Types from './types';\n\n${this.generateQueryOptionsContent()}\n\nexport const apiQueryOptions = {\n${this.generateQueryOptionsExports()}\n} as const;\n`;\n\n return content;\n }\n\n private generateQueryOptionsContent(): string {\n const groups = this.groupEndpointsByResource();\n const options: string[] = [];\n\n Object.entries(groups).forEach(([resource, endpoints]) => {\n const queries = endpoints.filter(\n ({ endpoint }) => endpoint.method === \"GET\",\n );\n if (queries.length === 0) return;\n\n const resourceOptions: string[] = [];\n queries.forEach(({ name, endpoint }) => {\n const optionName = this.getEndpointKeyName(name);\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const queryType = endpoint.query\n ? `Types.${this.getQueryTypeName(name)}`\n : null;\n\n const params: string[] = [];\n let apiCall = \"\";\n\n if (paramsType && queryType) {\n params.push(`params: ${paramsType}`, `filters?: ${queryType}`);\n apiCall = `apiClient.${name}(params, filters)`;\n } else if (paramsType) {\n params.push(`params: ${paramsType}`);\n apiCall = `apiClient.${name}(params)`;\n } else if (queryType) {\n params.push(`filters?: ${queryType}`);\n apiCall = `apiClient.${name}(filters)`;\n } else {\n apiCall = `apiClient.${name}()`;\n }\n\n const keyCall = this.generateQueryKeyCall(resource, name, endpoint);\n\n resourceOptions.push(` ${optionName}: (${params.join(\", \")}) =>\n queryOptions({\n queryKey: ${keyCall},\n queryFn: (): Promise<${responseType}> => ${apiCall},\n staleTime: 1000 * 60 * 5,\n }),`);\n });\n\n options.push(\n `const ${resource}QueryOptions = {\\n${resourceOptions.join(\"\\n\")}\\n};\\n`,\n );\n });\n\n return options.join(\"\\n\");\n }\n\n private generateQueryOptionsExports(): string {\n const groups = this.groupEndpointsByResource();\n const exports: string[] = [];\n\n Object.keys(groups).forEach((resource) => {\n const hasQueries = groups[resource].some(\n ({ endpoint }) => endpoint.method === \"GET\",\n );\n if (hasQueries) exports.push(` ${resource}: ${resource}QueryOptions,`);\n });\n\n return exports.join(\"\\n\");\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"@cushin/api-runtime\";\n\nexport class PrefetchGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"prefetchs.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const content = `// Auto-generated prefetch utilities\nimport { type QueryClient } from '@tanstack/react-query';\n${this.hasQueryOptions() ? \"import { apiQueryOptions } from './query-options';\" : \"\"}\nimport type * as Types from './types';\n\n${this.generatePrefetchFunctions()}\n`;\n return content;\n }\n\n private generatePrefetchFunctions(): string {\n const funcs: string[] = [];\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n if (endpoint.method === \"GET\")\n funcs.push(this.generatePrefetchFunction(name, endpoint));\n },\n );\n return funcs.join(\"\\n\\n\");\n }\n\n private generatePrefetchFunction(\n name: string,\n endpoint: APIEndpoint,\n ): string {\n const prefetchName = `prefetch${this.capitalize(name)}`;\n const resource = this.getResourceFromEndpoint(name, endpoint);\n const optionName = this.getEndpointKeyName(name);\n\n const params: string[] = [\"queryClient: QueryClient\"];\n const optionParams: string[] = [];\n\n if (endpoint.params) {\n params.push(`params: Types.${this.getParamsTypeName(name)}`);\n optionParams.push(\"params\");\n }\n if (endpoint.query) {\n params.push(`filters?: Types.${this.getQueryTypeName(name)}`);\n optionParams.push(\"filters\");\n }\n\n return `export const ${prefetchName} = async (${params.join(\",\\n \")}) => {\n return await queryClient.ensureQueryData(apiQueryOptions.${resource}.${optionName}(${optionParams.join(\", \")}));\n};`;\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class IndexGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"index.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.ts$/, \"\");\n\n const content = `// Auto-generated exports\nexport * from './types';\nexport * from './client';\nexport * from './query-keys';\n${this.hasQueryOptions() ? \"export * from './query-options';\" : \"\"}\nexport * from './hooks';\nexport * from './prefetchs';\nexport { z } from 'zod';\nexport { apiConfig } from '${relativePath}';\n`;\n return content;\n }\n}\n","import { HooksGenerator } from \"./hooks.js\";\nimport { ServerActionsGenerator } from \"./actions.js\";\nimport { ServerQueriesGenerator } from \"./queries.js\";\nimport { TypesGenerator } from \"./types.js\";\nimport { ClientGenerator } from \"./client.js\";\nimport type { GeneratorContext } from \"./base.js\";\nimport { QueryKeysGenerator } from \"./query-keys.js\";\nimport { QueryOptionsGenerator } from \"./query-options.js\";\nimport { PrefetchGenerator } from \"./prefetch.js\";\nimport { IndexGenerator } from \"./generate-index.js\";\n\nexport class CodeGenerator {\n constructor(private context: GeneratorContext) {}\n\n async generate(): Promise<void> {\n const generators = this.getGenerators();\n\n for (const generator of generators) {\n await generator.generate();\n }\n }\n\n private getGenerators() {\n const generators: Array<any> = [];\n\n // Always generate types\n generators.push(new TypesGenerator(this.context));\n generators.push(new IndexGenerator(this.context));\n\n // Generate client if enabled\n if (this.context.config.generateClient) {\n generators.push(new ClientGenerator(this.context));\n }\n\n // Generate hooks if enabled\n if (this.context.config.generateHooks) {\n generators.push(new QueryKeysGenerator(this.context));\n generators.push(new QueryOptionsGenerator(this.context));\n generators.push(new HooksGenerator(this.context));\n }\n\n if (this.context.config.generatePrefetch) {\n generators.push(new PrefetchGenerator(this.context));\n }\n\n // Generate server actions if enabled (Next.js only)\n if (\n this.context.config.generateServerActions &&\n this.context.config.provider === \"nextjs\"\n ) {\n generators.push(new ServerActionsGenerator(this.context));\n }\n\n // Generate server queries if enabled (Next.js only)\n if (\n this.context.config.generateServerQueries &&\n this.context.config.provider === \"nextjs\"\n ) {\n generators.push(new ServerQueriesGenerator(this.context));\n }\n\n return generators;\n }\n}\n"],"mappings":";AACA,cAAc;;;ACDd,SAAS,mBAAmB;AAC5B,OAAO,UAAU;AAmGjB,IAAM,WAAW,YAAY,eAAe;AAAA,EAC1C,cAAc;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF,CAAC;AAED,eAAsB,WACpB,YACgC;AAChC,MAAI;AACF,UAAM,SAAS,aACX,MAAM,SAAS,KAAK,UAAU,IAC9B,MAAM,SAAS,OAAO;AAE1B,QAAI,CAAC,UAAU,CAAC,OAAO,QAAQ;AAC7B,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,OAAO;AAC1B,UAAM,UAAU,KAAK,QAAQ,OAAO,QAAQ;AAG5C,UAAM,gBAAgB,KAAK,QAAQ,SAAS,WAAW,SAAS;AAChE,UAAM,YAAY,KAAK,QAAQ,SAAS,WAAW,MAAM;AAGzD,UAAM,gBAAgB,WAAW,iBAAiB;AAClD,UAAM,wBACJ,WAAW,yBAAyB,WAAW,aAAa;AAC9D,UAAM,wBACJ,WAAW,yBAAyB,WAAW,aAAa;AAC9D,UAAM,iBAAiB,WAAW,kBAAkB;AACpD,UAAM,mBAAmB,WAAW,oBAAoB;AAExD,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAClF;AAAA,EACF;AACF;AAKO,SAAS,eAAe,QAA0B;AACvD,MAAI,CAAC,OAAO,WAAW;AACrB,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AAEA,MAAI,CAAC,OAAO,UAAU;AACpB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,CAAC,QAAQ,QAAQ,EAAE,SAAS,OAAO,QAAQ,GAAG;AACjD,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,OAAO,QAAQ;AAClB,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AACF;;;ACrLA,SAAS,kBAAkB;;;ACA3B,OAAO,QAAQ;AACf,OAAOA,WAAU;;;ACOV,IAAe,gBAAf,MAA6B;AAAA,EAClC,YAAsB,SAA2B;AAA3B;AAAA,EAA4B;AAAA,EAIxC,gBAAgB,UAAgC;AACxD,WAAO,SAAS,WAAW;AAAA,EAC7B;AAAA,EAEU,mBAAmB,UAAgC;AAC3D,WAAO,CAAC,KAAK,gBAAgB,QAAQ;AAAA,EACvC;AAAA,EAEU,WAAW,KAAqB;AACxC,WAAO,IAAI,OAAO,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC;AAAA,EAClD;AAAA,EAEU,aAAa,UAAiC;AACtD,WAAO,SAAS,QAAQ,CAAC;AAAA,EAC3B;AAAA,EAEU,oBAAoB,UAAiC;AAC7D,UAAM,OAAO,SAAS,QAAQ,CAAC;AAC/B,WAAO,KAAK,OAAO,CAAC,QAAQ,QAAQ,WAAW,QAAQ,UAAU;AAAA,EACnE;AAAA,EAEU,UAAU,UAAgC;AAClD,WAAO,CAAC,CAAC,SAAS;AAAA,EACpB;AAAA,EAEU,SAAS,UAAgC;AACjD,WAAO,CAAC,CAAC,SAAS;AAAA,EACpB;AAAA,EAEU,QAAQ,UAAgC;AAChD,WAAO,CAAC,CAAC,SAAS;AAAA,EACpB;AAAA,EAEU,qBACR,MACA,UASA;AACA,UAAM,YAAY,KAAK,UAAU,QAAQ;AACzC,UAAM,WAAW,KAAK,SAAS,QAAQ;AACvC,UAAM,UAAU,KAAK,QAAQ,QAAQ;AAErC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,YAAY,KAAK,aAAa,8BAA8B,IAAI,SAAS,IAAI;AAAA,MACxF,WAAW,WAAW,KAAK,aAAa,8BAA8B,IAAI,QAAQ,IAAI;AAAA,MACtF,UAAU,UAAU,KAAK,aAAa,8BAA8B,IAAI,OAAO,IAAI;AAAA,MACnF,cAAc,KAAK,aAAa,8BAA8B,IAAI,WAAW;AAAA,IAC/E;AAAA,EACF;AAAA,EAEU,qBACR,MACA,WACA,SACQ;AACR,QAAI,aAAa,SAAS;AACxB,aAAO,oBAAoB,IAAI;AAAA,IACjC,WAAW,WAAW;AACpB,aAAO,oBAAoB,IAAI;AAAA,IACjC,WAAW,SAAS;AAClB,aAAO,oBAAoB,IAAI;AAAA,IACjC,OAAO;AACL,aAAO,oBAAoB,IAAI;AAAA,IACjC;AAAA,EACF;AAAA,EAEU,aAAa,MAAsB;AAC3C,WAAO,uBAAuB,IAAI;AAAA,EACpC;AAAA,EAEU,YAAY,KAAqB;AACzC,WAAO,IACJ,YAAY,EACZ,QAAQ,gBAAgB,CAAC,GAAG,MAAO,IAAI,EAAE,YAAY,IAAI,EAAG,EAC5D,QAAQ,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC;AAAA,EACzC;AAAA,EAEU,wBACR,OACA,UACQ;AACR,UAAM,MAAM,SAAS,MAAM,KAAK,CAAC,MAAM,MAAM,WAAW,MAAM,UAAU;AACxE,QAAI,IAAK,QAAO,KAAK,YAAY,GAAG;AACpC,UAAM,QAAQ,SAAS,KAAK,MAAM,YAAY;AAC9C,WAAO,QAAQ,KAAK,YAAY,MAAM,CAAC,CAAC,IAAI;AAAA,EAC9C;AAAA,EAEU,2BAA2B;AACnC,UAAM,SAGF,CAAC;AACL,WAAO,QAAQ,KAAK,QAAQ,UAAU,SAAS,EAAE;AAAA,MAC/C,CAAC,CAAC,MAAM,QAAQ,MAAM;AACpB,cAAM,MAAM,KAAK,wBAAwB,MAAM,QAAQ;AACvD,YAAI,CAAC,OAAO,GAAG,EAAG,QAAO,GAAG,IAAI,CAAC;AACjC,eAAO,GAAG,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAAA,MACrC;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEU,0BAA0B,UAA2B;AAC7D,WACE,KAAK,yBAAyB,EAAE,QAAQ,GAAG;AAAA,MACzC,CAAC,EAAE,SAAS,MAAM,SAAS,WAAW;AAAA,IACxC,KAAK;AAAA,EAET;AAAA,EAEU,mBAAmB,MAAsB;AACjD,WAAO,KAAK,WAAW,KAAK,IACxB,KAAK,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,IACpC;AAAA,EACN;AAAA,EAEU,qBACR,UACA,MACA,UACQ;AACR,UAAM,MAAM,KAAK,mBAAmB,IAAI;AACxC,UAAM,OAAiB,CAAC;AACxB,QAAI,SAAS,OAAQ,MAAK,KAAK,QAAQ;AACvC,QAAI,SAAS,MAAO,MAAK,KAAK,SAAS;AACvC,WAAO,KAAK,SACR,aAAa,QAAQ,IAAI,GAAG,IAAI,KAAK,KAAK,IAAI,CAAC,MAC/C,aAAa,QAAQ,IAAI,GAAG;AAAA,EAClC;AAAA,EAEU,kBAAkB;AAC1B,WAAO,OAAO,OAAO,KAAK,QAAQ,UAAU,SAAS,EAAE;AAAA,MACrD,CAAC,MAAM,EAAE,WAAW;AAAA,IACtB;AAAA,EACF;AAAA;AAAA,EAGU,oBAAoB,MAAsB;AAClD,WAAO,GAAG,KAAK,WAAW,IAAI,CAAC;AAAA,EACjC;AAAA,EAEU,iBAAiB,MAAsB;AAC/C,WAAO,GAAG,KAAK,WAAW,IAAI,CAAC;AAAA,EACjC;AAAA,EAEU,iBAAiB,MAAsB;AAC/C,WAAO,GAAG,KAAK,WAAW,IAAI,CAAC;AAAA,EACjC;AAAA,EAEU,kBAAkB,MAAsB;AAChD,WAAO,GAAG,KAAK,WAAW,IAAI,CAAC;AAAA,EACjC;AACF;;;AD1KO,IAAM,iBAAN,cAA6B,cAAc;AAAA,EAChD,MAAM,WAA0B;AAC9B,UAAM,UAAU,KAAK,gBAAgB;AACrC,UAAM,aAAaC,MAAK,KAAK,KAAK,QAAQ,OAAO,WAAW,UAAU;AAEtE,UAAM,GAAG,MAAMA,MAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,UAAM,GAAG,UAAU,YAAY,SAAS,OAAO;AAAA,EACjD;AAAA,EAEQ,kBAA0B;AAChC,UAAM,qBACJ,KAAK,QAAQ,OAAO,SAAS,sBAAsB;AAErD,UAAM,UAAU,GAAG,qBAAqB,oBAAoB,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhE,KAAK,mBAAmB,CAAC;AAAA,EACzB,KAAK,sBAAsB,CAAC;AAAA;AAG1B,WAAO;AAAA,EACT;AAAA,EAEQ,qBAA6B;AACnC,UAAM,QAAkB,CAAC;AACzB,WAAO,QAAQ,KAAK,QAAQ,UAAU,SAAS,EAAE;AAAA,MAC/C,CAAC,CAAC,MAAM,QAAQ,MAAM;AACpB,YAAI,SAAS,WAAW;AACtB,gBAAM,KAAK,KAAK,kBAAkB,MAAM,QAAQ,CAAC;AAAA,MACrD;AAAA,IACF;AACA,WAAO,MAAM,KAAK,MAAM;AAAA,EAC1B;AAAA,EAEQ,kBAAkB,MAAc,UAA+B;AACrE,UAAM,WAAW,MAAM,KAAK,WAAW,IAAI,CAAC;AAC5C,UAAM,WAAW,KAAK,wBAAwB,MAAM,QAAQ;AAC5D,UAAM,aAAa,KAAK,mBAAmB,IAAI;AAE/C,UAAM,eAAe,SAAS,KAAK,oBAAoB,IAAI,CAAC;AAC5D,UAAM,aAAa,SAAS,SACxB,SAAS,KAAK,kBAAkB,IAAI,CAAC,KACrC;AACJ,UAAM,YAAY,SAAS,QACvB,SAAS,KAAK,iBAAiB,IAAI,CAAC,KACpC;AAEJ,UAAM,SAAmB,CAAC;AAC1B,UAAM,eAAyB,CAAC;AAEhC,UAAM,YAAY,KAAK,aAAa,QAAQ;AAE5C,QAAI,YAAY;AACd,aAAO,KAAK,WAAW,UAAU,EAAE;AACnC,mBAAa,KAAK,QAAQ;AAAA,IAC5B;AACA,QAAI,WAAW;AACb,aAAO,KAAK,aAAa,SAAS,EAAE;AACpC,mBAAa,KAAK,SAAS;AAAA,IAC7B;AAEA,WAAO,KAAK;AAAA;AAAA,wBAEQ,YAAY,WAAW,YAAY;AAAA,IACvD;AAEA,WAAO;AAAA,KACN,SAAS,eAAe,kBAAkB,IAAI,EAAE;AAAA,WAC1C,UAAU,KAAK,IAAI,KAAK,MAAM;AAAA;AAAA,kBAEvB,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC;AAAA;AAAA,yBAEzB,QAAQ,IAAI,UAAU,IAAI,aAAa,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA,EAIxE;AAAA,EAEQ,wBAAgC;AACtC,UAAM,QAAkB,CAAC;AACzB,WAAO,QAAQ,KAAK,QAAQ,UAAU,SAAS,EAAE;AAAA,MAC/C,CAAC,CAAC,MAAM,QAAQ,MAAM;AACpB,YAAI,SAAS,WAAW;AACtB,gBAAM,KAAK,KAAK,qBAAqB,MAAM,QAAQ,CAAC;AAAA,MACxD;AAAA,IACF;AACA,WAAO,MAAM,KAAK,MAAM;AAAA,EAC1B;AAAA,EAEQ,qBAAqB,MAAc,UAA+B;AACxE,UAAM,WAAW,MAAM,KAAK,WAAW,IAAI,CAAC;AAC5C,UAAM,WAAW,KAAK,wBAAwB,MAAM,QAAQ;AAE5D,UAAM,eAAe,SAAS,KAAK,oBAAoB,IAAI,CAAC;AAC5D,UAAM,aAAa,SAAS,SACxB,SAAS,KAAK,kBAAkB,IAAI,CAAC,KACrC;AACJ,UAAM,WAAW,SAAS,OAAO,SAAS,KAAK,iBAAiB,IAAI,CAAC,KAAK;AAE1E,UAAM,qBAAqB,KAAK,0BAA0B,QAAQ;AAElE,QAAI;AACJ,QAAI;AAEJ,QAAI,cAAc,UAAU;AAC1B,kBAAY,aAAa,UAAU,WAAW,QAAQ;AACtD,eAAS,sBAAsB,SAAS,kBAAkB,IAAI;AAAA,IAChE,WAAW,YAAY;AACrB,kBAAY;AACZ,eAAS,YAAY,SAAS,kBAAkB,IAAI;AAAA,IACtD,WAAW,UAAU;AACnB,kBAAY;AACZ,eAAS,UAAU,SAAS,kBAAkB,IAAI;AAAA,IACpD,OAAO;AACL,kBAAY;AACZ,eAAS,mBAAmB,IAAI;AAAA,IAClC;AAEA,UAAM,aAAa,qBACf,uDAAuD,QAAQ,aAC/D;AAEJ,WAAO;AAAA,KACN,SAAS,eAAe,qBAAqB,IAAI,EAAE;AAAA,WAC7C,SAAS,MAAM,KAAK,IAAI,KAAK,MAAM;AAAA;AAAA,kBAE5B,QAAQ;AAAA,uBACH,YAAY,gBAAgB,SAAS;AAAA,wCACpB,SAAS;AAAA,uBAC1B,YAAY,iDAAiD,SAAS;AAAA,2BAClE,SAAS;AAAA;AAAA,IAEhC,aAAa,0CAA0C,EAAE;AAAA;AAAA,kBAE3C,MAAM;AAAA;AAAA,QAEhB,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQhB;AACF;;;AE1JA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAIV,IAAM,yBAAN,cAAqC,cAAc;AAAA,EACxD,MAAM,WAA0B;AAC9B,UAAM,UAAU,KAAK,gBAAgB;AACrC,UAAM,aAAaC,MAAK,KAAK,KAAK,QAAQ,OAAO,WAAW,YAAY;AAExE,UAAMC,IAAG,MAAMD,MAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,UAAMC,IAAG,UAAU,YAAY,SAAS,OAAO;AAAA,EACjD;AAAA,EAEQ,kBAA0B;AAChC,UAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWhB,UAAM,UAAoB,CAAC;AAE3B,WAAO,QAAQ,KAAK,QAAQ,UAAU,SAAS,EAAE;AAAA,MAC/C,CAAC,CAAC,MAAM,QAAQ,MAAM;AACpB,YAAI,KAAK,mBAAmB,QAAQ,GAAG;AACrC,kBAAQ,KAAK,KAAK,qBAAqB,MAAM,QAAQ,CAAC;AAAA,QACxD;AAAA,MACF;AAAA,IACF;AAEA,WAAO,UAAU,OAAO,QAAQ,KAAK,MAAM;AAAA,EAC7C;AAAA,EAEQ,qBAAqB,MAAc,UAA+B;AACxE,UAAM,eAAe,KAAK,QAAQ,OAAO,SAAS,gBAAgB;AAClE,UAAM,aAAa,GAAG,IAAI,GAAG,YAAY;AACzC,UAAM,mBAAmB,KAAK,oBAAoB,QAAQ;AAE1D,UAAM,eAAe,SAAS,KAAK,oBAAoB,IAAI,CAAC;AAC5D,UAAM,aAAa,SAAS,SACxB,SAAS,KAAK,kBAAkB,IAAI,CAAC,KACrC;AACJ,UAAM,WAAW,SAAS,OAAO,SAAS,KAAK,iBAAiB,IAAI,CAAC,KAAK;AAE1E,QAAI,YAAY;AAChB,QAAI,WAAW;AACf,QAAI,cAAc,UAAU;AAC1B,kBAAY,oBAAoB,UAAU,WAAW,QAAQ;AAC7D,iBAAW;AAAA,IACb,WAAW,YAAY;AACrB,kBAAY,WAAW,UAAU;AACjC,iBAAW;AAAA,IACb,WAAW,UAAU;AACnB,kBAAY,SAAS,QAAQ;AAC7B,iBAAW;AAAA,IACb;AAEA,UAAM,uBACJ,iBAAiB,SAAS,IACtB,iBACG,IAAI,CAAC,QAAQ,sBAAsB,GAAG,KAAK,EAC3C,KAAK,IAAI,IACZ;AAEN,WAAO;AAAA,KACN,SAAS,eAAe,qBAAqB,IAAI,EAAE;AAAA,WAC7C,SAAS,MAAM,KAAK,IAAI,KAAK,MAAM;AAAA;AAAA,wBAEtB,UAAU;AAAA,IAC9B,SAAS;AAAA,0BACa,YAAY;AAAA;AAAA,iDAEW,IAAI,IAAI,QAAQ;AAAA;AAAA;AAAA,EAG/D,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWpB;AACF;;;AC7FA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAIV,IAAM,yBAAN,cAAqC,cAAc;AAAA,EACxD,MAAM,WAA0B;AAC9B,UAAM,UAAU,KAAK,gBAAgB;AACrC,UAAM,aAAaC,MAAK,KAAK,KAAK,QAAQ,OAAO,WAAW,YAAY;AAExE,UAAMC,IAAG,MAAMD,MAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,UAAMC,IAAG,UAAU,YAAY,SAAS,OAAO;AAAA,EACjD;AAAA,EAEQ,kBAA0B;AAChC,UAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAMhB,UAAM,UAAoB,CAAC;AAE3B,WAAO,QAAQ,KAAK,QAAQ,UAAU,SAAS,EAAE;AAAA,MAC/C,CAAC,CAAC,MAAM,QAAQ,MAAM;AACpB,YAAI,KAAK,gBAAgB,QAAQ,GAAG;AAClC,kBAAQ,KAAK,KAAK,oBAAoB,MAAM,QAAQ,CAAC;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AAEA,WAAO,UAAU,OAAO,QAAQ,KAAK,MAAM;AAAA,EAC7C;AAAA,EAEQ,oBAAoB,MAAc,UAA+B;AACvE,UAAM,YAAY,GAAG,IAAI;AACzB,UAAM,YAAY,KAAK,aAAa,QAAQ;AAE5C,UAAM,eAAe,SAAS,KAAK,oBAAoB,IAAI,CAAC;AAC5D,UAAM,aAAa,SAAS,SACxB,SAAS,KAAK,kBAAkB,IAAI,CAAC,KACrC;AACJ,UAAM,YAAY,SAAS,QACvB,SAAS,KAAK,iBAAiB,IAAI,CAAC,KACpC;AAEJ,UAAM,WAAW,aAAa,WAAW,UAAU,KAAK;AACxD,UAAM,WAAW,YAAY,WAAW,SAAS,KAAK;AACtD,UAAM,aAAa,CAAC,UAAU,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,OAAO;AAGpE,QAAI,aAAa;AACjB,QAAI,cAAc,WAAW;AAC3B,mBAAa,yBAAyB,IAAI;AAAA,IAC5C,WAAW,YAAY;AACrB,mBAAa,yBAAyB,IAAI;AAAA,IAC5C,WAAW,WAAW;AACpB,mBAAa,yBAAyB,IAAI;AAAA,IAC5C,OAAO;AACL,mBAAa,yBAAyB,IAAI;AAAA,IAC5C;AAGA,UAAM,gBAA0B,CAAC,IAAI,IAAI,GAAG;AAC5C,QAAI,WAAY,eAAc,KAAK,wBAAwB;AAC3D,QAAI;AACF,oBAAc,KAAK,4CAA4C;AAEjE,WAAO;AAAA,KACN,SAAS,eAAe,oBAAoB,IAAI,EAAE;AAAA,WAC5C,UAAU,KAAK,IAAI,KAAK,MAAM;AAAA;AAAA,eAE1B,SAAS;AAAA,IACpB,UAAU;AAAA,aACD,YAAY;AAAA;AAAA,kBAEP,UAAU;AAAA,OACrB,cAAc,KAAK,IAAI,CAAC;AAAA;AAAA,eAEhB,UAAU,IAAI,CAAC,QAAQ,IAAI,GAAG,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAK1D;AACF;;;ACrFA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAGV,IAAM,iBAAN,cAA6B,cAAc;AAAA,EAChD,MAAM,WAA0B;AAC9B,UAAM,UAAU,KAAK,gBAAgB;AACrC,UAAM,aAAaC,MAAK,KAAK,KAAK,QAAQ,OAAO,WAAW,UAAU;AAEtE,UAAMC,IAAG,MAAMD,MAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,UAAMC,IAAG,UAAU,YAAY,SAAS,OAAO;AAAA,EACjD;AAAA,EAEQ,kBAA0B;AAChC,UAAM,aAAaD,MAAK,KAAK,KAAK,QAAQ,OAAO,WAAW,UAAU;AACtE,UAAM,gBAAgBA,MAAK,KAAK,KAAK,QAAQ,OAAO,aAAa;AACjE,UAAM,eAAeA,MAClB,SAASA,MAAK,QAAQ,UAAU,GAAG,aAAa,EAChD,QAAQ,OAAO,GAAG,EAClB,QAAQ,SAAS,EAAE;AAEtB,WAAO;AAAA;AAAA;AAAA;AAAA,6BAIkB,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMvC,KAAK,sBAAsB,CAAC;AAAA;AAAA,EAE5B;AAAA,EAEQ,wBAAgC;AACtC,UAAM,QAAkB,CAAC;AAEzB,WAAO,QAAQ,KAAK,QAAQ,UAAU,SAAS,EAAE;AAAA,MAC/C,CAAC,CAAC,MAAM,QAAQ,MAAM;AACpB,cAAM,MAAM,KAAK,WAAW,IAAI;AAGhC,cAAM;AAAA,UACJ,eAAe,GAAG,6DAA6D,IAAI;AAAA,QACrF;AAGA,YAAI,SAAS,MAAM;AACjB,gBAAM;AAAA,YACJ,eAAe,GAAG,0DAA0D,IAAI;AAAA,UAClF;AAAA,QACF;AAGA,YAAI,SAAS,OAAO;AAClB,gBAAM;AAAA,YACJ,eAAe,GAAG,0DAA0D,IAAI;AAAA,UAClF;AAAA,QACF;AAGA,YAAI,SAAS,QAAQ;AACnB,gBAAM;AAAA,YACJ,eAAe,GAAG,2DAA2D,IAAI;AAAA,UACnF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AACF;;;ACxEA,OAAOE,SAAQ;AACf,OAAOC,WAAU;AAGV,IAAM,kBAAN,cAA8B,cAAc;AAAA,EACjD,MAAM,WAA0B;AAC9B,UAAM,KAAK,mBAAmB;AAE9B,QAAI,KAAK,QAAQ,OAAO,aAAa,UAAU;AAC7C,YAAM,KAAK,yBAAyB;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,MAAc,qBAAoC;AAChD,UAAM,UAAU,KAAK,sBAAsB;AAC3C,UAAM,aAAaC,MAAK,KAAK,KAAK,QAAQ,OAAO,WAAW,WAAW;AAEvE,UAAMC,IAAG,MAAMD,MAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,UAAMC,IAAG,UAAU,YAAY,SAAS,OAAO;AAAA,EACjD;AAAA,EAEA,MAAc,2BAA0C;AACtD,UAAM,UAAU,KAAK,4BAA4B;AACjD,UAAM,aAAaD,MAAK;AAAA,MACtB,KAAK,QAAQ,OAAO;AAAA,MACpB;AAAA,IACF;AAEA,UAAMC,IAAG,MAAMD,MAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,UAAMC,IAAG,UAAU,YAAY,SAAS,OAAO;AAAA,EACjD;AAAA,EAEQ,wBAAgC;AACtC,UAAM,qBACJ,KAAK,QAAQ,OAAO,SAAS,sBAAsB;AACrD,UAAM,aAAaD,MAAK,KAAK,KAAK,QAAQ,OAAO,WAAW,UAAU;AACtE,UAAM,gBAAgBA,MAAK,KAAK,KAAK,QAAQ,OAAO,aAAa;AACjE,UAAM,eAAeA,MAClB,SAASA,MAAK,QAAQ,UAAU,GAAG,aAAa,EAChD,QAAQ,OAAO,GAAG,EAClB,QAAQ,SAAS,EAAE;AAEtB,WAAO,GAAG,qBAAqB,oBAAoB,EAAE;AAAA;AAAA;AAAA,6BAG5B,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,EAKvC,KAAK,6BAA6B,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUnC,KAAK,yBAAyB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2B/B;AAAA,EAEQ,8BAAsC;AAC5C,UAAM,aAAaA,MAAK,KAAK,KAAK,QAAQ,OAAO,WAAW,UAAU;AACtE,UAAM,gBAAgBA,MAAK,KAAK,KAAK,QAAQ,OAAO,aAAa;AACjE,UAAM,eAAeA,MAClB,SAASA,MAAK,QAAQ,UAAU,GAAG,aAAa,EAChD,QAAQ,OAAO,GAAG,EAClB,QAAQ,SAAS,EAAE;AAEtB,WAAO;AAAA,6BACkB,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,EAKvC,KAAK,6BAA6B,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASnC;AAAA,EAEQ,+BAAuC;AAC7C,UAAM,UAAoB,CAAC;AAE3B,WAAO,QAAQ,KAAK,QAAQ,UAAU,SAAS,EAAE;AAAA,MAC/C,CAAC,CAAC,MAAM,QAAQ,MAAM;AACpB,cAAM,eAAe,SAAS,KAAK,oBAAoB,IAAI,CAAC;AAC5D,cAAM,aAAa,SAAS,SACxB,SAAS,KAAK,kBAAkB,IAAI,CAAC,KACrC;AACJ,cAAM,YAAY,SAAS,QACvB,SAAS,KAAK,iBAAiB,IAAI,CAAC,KACpC;AACJ,cAAM,WAAW,SAAS,OACtB,SAAS,KAAK,iBAAiB,IAAI,CAAC,KACpC;AAEJ,YAAI,YAAY;AAChB,YAAI,SAAS,WAAW,OAAO;AAC7B,cAAI,cAAc,WAAW;AAC3B,wBAAY,YAAY,UAAU,aAAa,SAAS,gBAAgB,YAAY;AAAA,UACtF,WAAW,YAAY;AACrB,wBAAY,YAAY,UAAU,gBAAgB,YAAY;AAAA,UAChE,WAAW,WAAW;AACpB,wBAAY,YAAY,SAAS,gBAAgB,YAAY;AAAA,UAC/D,OAAO;AACL,wBAAY,iBAAiB,YAAY;AAAA,UAC3C;AAAA,QACF,OAAO;AACL,cAAI,cAAc,UAAU;AAC1B,wBAAY,YAAY,UAAU,WAAW,QAAQ,gBAAgB,YAAY;AAAA,UACnF,WAAW,YAAY;AACrB,wBAAY,YAAY,UAAU,gBAAgB,YAAY;AAAA,UAChE,WAAW,UAAU;AACnB,wBAAY,UAAU,QAAQ,gBAAgB,YAAY;AAAA,UAC5D,OAAO;AACL,wBAAY,iBAAiB,YAAY;AAAA,UAC3C;AAAA,QACF;AAEA,gBAAQ,KAAK,KAAK,IAAI,KAAK,SAAS,GAAG;AAAA,MACzC;AAAA,IACF;AAEA,WAAO,QAAQ,KAAK,IAAI;AAAA,EAC1B;AAAA,EAEQ,2BAAmC;AACzC,UAAM,UAAoB,CAAC;AAE3B,WAAO,QAAQ,KAAK,QAAQ,UAAU,SAAS,EAAE;AAAA,MAC/C,CAAC,CAAC,MAAM,QAAQ,MAAM;AACpB,cAAM,eAAe,SAAS,KAAK,oBAAoB,IAAI,CAAC;AAC5D,cAAM,aAAa,SAAS,SACxB,SAAS,KAAK,kBAAkB,IAAI,CAAC,KACrC;AACJ,cAAM,YAAY,SAAS,QACvB,SAAS,KAAK,iBAAiB,IAAI,CAAC,KACpC;AACJ,cAAM,WAAW,SAAS,OACtB,SAAS,KAAK,iBAAiB,IAAI,CAAC,KACpC;AAEJ,YAAI,SAAS,WAAW,OAAO;AAC7B,cAAI,cAAc,WAAW;AAC3B,oBAAQ,KAAK,KAAK,IAAI,YAAY,UAAU,aAAa,SAAS,cAAc,YAAY;AAAA;AAAA,wBAEhF,IAAI;AAAA,KACvB;AAAA,UACK,WAAW,YAAY;AACrB,oBAAQ,KAAK,KAAK,IAAI,YAAY,UAAU,cAAc,YAAY;AAAA;AAAA,wBAE1D,IAAI;AAAA,KACvB;AAAA,UACK,WAAW,WAAW;AACpB,oBAAQ,KAAK,KAAK,IAAI,YAAY,SAAS,cAAc,YAAY;AAAA;AAAA,wBAEzD,IAAI;AAAA,KACvB;AAAA,UACK,OAAO;AACL,oBAAQ,KAAK,KAAK,IAAI,eAAe,YAAY;AAAA;AAAA,wBAErC,IAAI;AAAA,KACvB;AAAA,UACK;AAAA,QACF,OAAO;AACL,cAAI,cAAc,UAAU;AAC1B,oBAAQ,KAAK,KAAK,IAAI,YAAY,UAAU,WAAW,QAAQ,cAAc,YAAY;AAAA;AAAA,wBAE7E,IAAI;AAAA,KACvB;AAAA,UACK,WAAW,YAAY;AACrB,oBAAQ,KAAK,KAAK,IAAI,YAAY,UAAU,cAAc,YAAY;AAAA;AAAA,wBAE1D,IAAI;AAAA,KACvB;AAAA,UACK,WAAW,UAAU;AACnB,oBAAQ,KAAK,KAAK,IAAI,UAAU,QAAQ,cAAc,YAAY;AAAA;AAAA,wBAEtD,IAAI;AAAA,KACvB;AAAA,UACK,OAAO;AACL,oBAAQ,KAAK,KAAK,IAAI,eAAe,YAAY;AAAA;AAAA,wBAErC,IAAI;AAAA,KACvB;AAAA,UACK;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO,QAAQ,KAAK,IAAI;AAAA,EAC1B;AACF;;;AClOA,OAAOE,SAAQ;AACf,OAAOC,WAAU;AAGV,IAAM,qBAAN,cAAiC,cAAc;AAAA,EACpD,MAAM,WAA0B;AAC9B,UAAM,UAAU,KAAK,gBAAgB;AACrC,UAAM,aAAaC,MAAK;AAAA,MACtB,KAAK,QAAQ,OAAO;AAAA,MACpB;AAAA,IACF;AAEA,UAAMC,IAAG,MAAMD,MAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,UAAMC,IAAG,UAAU,YAAY,SAAS,OAAO;AAAA,EACjD;AAAA,EAEQ,kBAA0B;AAChC,UAAM,aAAaD,MAAK,KAAK,KAAK,QAAQ,OAAO,WAAW,UAAU;AACtE,UAAM,gBAAgBA,MAAK,KAAK,KAAK,QAAQ,OAAO,aAAa;AACjE,UAAM,eAAeA,MAClB,SAASA,MAAK,QAAQ,UAAU,GAAG,aAAa,EAChD,QAAQ,OAAO,GAAG,EAClB,QAAQ,SAAS,EAAE;AAEtB,UAAM,UAAU;AAAA;AAAA;AAAA;AAAA,EAIlB,KAAK,yBAAyB,CAAC;AAAA;AAAA;AAG7B,WAAO;AAAA,EACT;AAAA,EAEQ,2BAAmC;AACzC,UAAM,iBAAiB,KAAK,yBAAyB;AACrD,UAAM,OAAiB,CAAC;AAExB,WAAO,QAAQ,cAAc,EAAE,QAAQ,CAAC,CAAC,UAAU,SAAS,MAAM;AAChE,YAAM,iBAAiB,UAAU;AAAA,QAC/B,CAAC,EAAE,SAAS,MAAM,SAAS,WAAW;AAAA,MACxC;AACA,UAAI,eAAe,WAAW,EAAG;AAEjC,YAAM,eAAyB,CAAC,cAAc,QAAQ,cAAc;AACpE,YAAM,QAAQ,oBAAI,IAAY;AAE9B,qBAAe,QAAQ,CAAC,EAAE,MAAM,SAAS,MAAM;AAC7C,cAAM,UAAU,KAAK,mBAAmB,IAAI;AAC5C,YAAI,MAAM,IAAI,OAAO,EAAG;AAExB,YAAI,SAAS,UAAU,SAAS,OAAO;AACrC,gBAAM,SAAmB,CAAC;AAC1B,cAAI,SAAS;AACX,mBAAO,KAAK,kBAAkB,KAAK,kBAAkB,IAAI,CAAC,EAAE;AAC9D,cAAI,SAAS;AACX,mBAAO,KAAK,iBAAiB,KAAK,iBAAiB,IAAI,CAAC,EAAE;AAE5D,uBAAa,KAAK,OAAO,OAAO,MAAM,OAAO,KAAK,IAAI,CAAC;AAAA,UACvD,QAAQ,OAAO,OAAO,MAAM,SAAS,SAAS,WAAW,WAAW,KAAK,SAAS,QAAQ,UAAU,WAAW,aAAa;AAAA,QAC9H,OAAO;AACL,uBAAa;AAAA,YACX,OAAO,OAAO,aAAa,QAAQ,OAAO,OAAO;AAAA,UACnD;AAAA,QACF;AACA,cAAM,IAAI,OAAO;AAAA,MACnB,CAAC;AAED,WAAK,KAAK,KAAK,QAAQ;AAAA,EAAQ,aAAa,KAAK,IAAI,CAAC;AAAA,KAAQ;AAAA,IAChE,CAAC;AAED,WAAO,KAAK,KAAK,IAAI;AAAA,EACvB;AACF;;;ACzEA,OAAOE,SAAQ;AACf,OAAOC,WAAU;AAGV,IAAM,wBAAN,cAAoC,cAAc;AAAA,EACvD,MAAM,WAA0B;AAC9B,UAAM,UAAU,KAAK,gBAAgB;AACrC,UAAM,aAAaC,MAAK;AAAA,MACtB,KAAK,QAAQ,OAAO;AAAA,MACpB;AAAA,IACF;AAEA,UAAMC,IAAG,MAAMD,MAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,UAAMC,IAAG,UAAU,YAAY,SAAS,OAAO;AAAA,EACjD;AAAA,EACQ,kBAA0B;AAChC,UAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMlB,KAAK,4BAA4B,CAAC;AAAA;AAAA;AAAA,EAGlC,KAAK,4BAA4B,CAAC;AAAA;AAAA;AAIhC,WAAO;AAAA,EACT;AAAA,EAEQ,8BAAsC;AAC5C,UAAM,SAAS,KAAK,yBAAyB;AAC7C,UAAM,UAAoB,CAAC;AAE3B,WAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU,SAAS,MAAM;AACxD,YAAM,UAAU,UAAU;AAAA,QACxB,CAAC,EAAE,SAAS,MAAM,SAAS,WAAW;AAAA,MACxC;AACA,UAAI,QAAQ,WAAW,EAAG;AAE1B,YAAM,kBAA4B,CAAC;AACnC,cAAQ,QAAQ,CAAC,EAAE,MAAM,SAAS,MAAM;AACtC,cAAM,aAAa,KAAK,mBAAmB,IAAI;AAC/C,cAAM,eAAe,SAAS,KAAK,oBAAoB,IAAI,CAAC;AAC5D,cAAM,aAAa,SAAS,SACxB,SAAS,KAAK,kBAAkB,IAAI,CAAC,KACrC;AACJ,cAAM,YAAY,SAAS,QACvB,SAAS,KAAK,iBAAiB,IAAI,CAAC,KACpC;AAEJ,cAAM,SAAmB,CAAC;AAC1B,YAAI,UAAU;AAEd,YAAI,cAAc,WAAW;AAC3B,iBAAO,KAAK,WAAW,UAAU,IAAI,aAAa,SAAS,EAAE;AAC7D,oBAAU,aAAa,IAAI;AAAA,QAC7B,WAAW,YAAY;AACrB,iBAAO,KAAK,WAAW,UAAU,EAAE;AACnC,oBAAU,aAAa,IAAI;AAAA,QAC7B,WAAW,WAAW;AACpB,iBAAO,KAAK,aAAa,SAAS,EAAE;AACpC,oBAAU,aAAa,IAAI;AAAA,QAC7B,OAAO;AACL,oBAAU,aAAa,IAAI;AAAA,QAC7B;AAEA,cAAM,UAAU,KAAK,qBAAqB,UAAU,MAAM,QAAQ;AAElE,wBAAgB,KAAK,KAAK,UAAU,MAAM,OAAO,KAAK,IAAI,CAAC;AAAA;AAAA,kBAEjD,OAAO;AAAA,6BACI,YAAY,QAAQ,OAAO;AAAA;AAAA,QAEhD;AAAA,MACF,CAAC;AAED,cAAQ;AAAA,QACN,SAAS,QAAQ;AAAA,EAAqB,gBAAgB,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,MAClE;AAAA,IACF,CAAC;AAED,WAAO,QAAQ,KAAK,IAAI;AAAA,EAC1B;AAAA,EAEQ,8BAAsC;AAC5C,UAAM,SAAS,KAAK,yBAAyB;AAC7C,UAAM,UAAoB,CAAC;AAE3B,WAAO,KAAK,MAAM,EAAE,QAAQ,CAAC,aAAa;AACxC,YAAM,aAAa,OAAO,QAAQ,EAAE;AAAA,QAClC,CAAC,EAAE,SAAS,MAAM,SAAS,WAAW;AAAA,MACxC;AACA,UAAI,WAAY,SAAQ,KAAK,KAAK,QAAQ,KAAK,QAAQ,eAAe;AAAA,IACxE,CAAC;AAED,WAAO,QAAQ,KAAK,IAAI;AAAA,EAC1B;AACF;;;ACpGA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAIV,IAAM,oBAAN,cAAgC,cAAc;AAAA,EACnD,MAAM,WAA0B;AAC9B,UAAM,UAAU,KAAK,gBAAgB;AACrC,UAAM,aAAaC,MAAK,KAAK,KAAK,QAAQ,OAAO,WAAW,cAAc;AAE1E,UAAMC,IAAG,MAAMD,MAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,UAAMC,IAAG,UAAU,YAAY,SAAS,OAAO;AAAA,EACjD;AAAA,EAEQ,kBAA0B;AAChC,UAAM,UAAU;AAAA;AAAA,EAElB,KAAK,gBAAgB,IAAI,uDAAuD,EAAE;AAAA;AAAA;AAAA,EAGlF,KAAK,0BAA0B,CAAC;AAAA;AAE9B,WAAO;AAAA,EACT;AAAA,EAEQ,4BAAoC;AAC1C,UAAM,QAAkB,CAAC;AACzB,WAAO,QAAQ,KAAK,QAAQ,UAAU,SAAS,EAAE;AAAA,MAC/C,CAAC,CAAC,MAAM,QAAQ,MAAM;AACpB,YAAI,SAAS,WAAW;AACtB,gBAAM,KAAK,KAAK,yBAAyB,MAAM,QAAQ,CAAC;AAAA,MAC5D;AAAA,IACF;AACA,WAAO,MAAM,KAAK,MAAM;AAAA,EAC1B;AAAA,EAEQ,yBACN,MACA,UACQ;AACR,UAAM,eAAe,WAAW,KAAK,WAAW,IAAI,CAAC;AACrD,UAAM,WAAW,KAAK,wBAAwB,MAAM,QAAQ;AAC5D,UAAM,aAAa,KAAK,mBAAmB,IAAI;AAE/C,UAAM,SAAmB,CAAC,0BAA0B;AACpD,UAAM,eAAyB,CAAC;AAEhC,QAAI,SAAS,QAAQ;AACnB,aAAO,KAAK,iBAAiB,KAAK,kBAAkB,IAAI,CAAC,EAAE;AAC3D,mBAAa,KAAK,QAAQ;AAAA,IAC5B;AACA,QAAI,SAAS,OAAO;AAClB,aAAO,KAAK,mBAAmB,KAAK,iBAAiB,IAAI,CAAC,EAAE;AAC5D,mBAAa,KAAK,SAAS;AAAA,IAC7B;AAEA,WAAO,gBAAgB,YAAY,aAAa,OAAO,KAAK,OAAO,CAAC;AAAA,6DACX,QAAQ,IAAI,UAAU,IAAI,aAAa,KAAK,IAAI,CAAC;AAAA;AAAA,EAE5G;AACF;;;AC5DA,OAAOC,SAAQ;AACf,OAAOC,YAAU;AAGV,IAAM,iBAAN,cAA6B,cAAc;AAAA,EAChD,MAAM,WAA0B;AAC9B,UAAM,UAAU,KAAK,gBAAgB;AACrC,UAAM,aAAaC,OAAK,KAAK,KAAK,QAAQ,OAAO,WAAW,UAAU;AAEtE,UAAMC,IAAG,MAAMD,OAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,UAAMC,IAAG,UAAU,YAAY,SAAS,OAAO;AAAA,EACjD;AAAA,EAEQ,kBAA0B;AAChC,UAAM,aAAaD,OAAK,KAAK,KAAK,QAAQ,OAAO,WAAW,UAAU;AACtE,UAAM,gBAAgBA,OAAK,KAAK,KAAK,QAAQ,OAAO,aAAa;AACjE,UAAM,eAAeA,OAClB,SAASA,OAAK,QAAQ,UAAU,GAAG,aAAa,EAChD,QAAQ,OAAO,GAAG,EAClB,QAAQ,SAAS,EAAE;AAEtB,UAAM,UAAU;AAAA;AAAA;AAAA;AAAA,EAIlB,KAAK,gBAAgB,IAAI,qCAAqC,EAAE;AAAA;AAAA;AAAA;AAAA,6BAIrC,YAAY;AAAA;AAErC,WAAO;AAAA,EACT;AACF;;;ACtBO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAAoB,SAA2B;AAA3B;AAAA,EAA4B;AAAA,EAEhD,MAAM,WAA0B;AAC9B,UAAM,aAAa,KAAK,cAAc;AAEtC,eAAW,aAAa,YAAY;AAClC,YAAM,UAAU,SAAS;AAAA,IAC3B;AAAA,EACF;AAAA,EAEQ,gBAAgB;AACtB,UAAM,aAAyB,CAAC;AAGhC,eAAW,KAAK,IAAI,eAAe,KAAK,OAAO,CAAC;AAChD,eAAW,KAAK,IAAI,eAAe,KAAK,OAAO,CAAC;AAGhD,QAAI,KAAK,QAAQ,OAAO,gBAAgB;AACtC,iBAAW,KAAK,IAAI,gBAAgB,KAAK,OAAO,CAAC;AAAA,IACnD;AAGA,QAAI,KAAK,QAAQ,OAAO,eAAe;AACrC,iBAAW,KAAK,IAAI,mBAAmB,KAAK,OAAO,CAAC;AACpD,iBAAW,KAAK,IAAI,sBAAsB,KAAK,OAAO,CAAC;AACvD,iBAAW,KAAK,IAAI,eAAe,KAAK,OAAO,CAAC;AAAA,IAClD;AAEA,QAAI,KAAK,QAAQ,OAAO,kBAAkB;AACxC,iBAAW,KAAK,IAAI,kBAAkB,KAAK,OAAO,CAAC;AAAA,IACrD;AAGA,QACE,KAAK,QAAQ,OAAO,yBACpB,KAAK,QAAQ,OAAO,aAAa,UACjC;AACA,iBAAW,KAAK,IAAI,uBAAuB,KAAK,OAAO,CAAC;AAAA,IAC1D;AAGA,QACE,KAAK,QAAQ,OAAO,yBACpB,KAAK,QAAQ,OAAO,aAAa,UACjC;AACA,iBAAW,KAAK,IAAI,uBAAuB,KAAK,OAAO,CAAC;AAAA,IAC1D;AAEA,WAAO;AAAA,EACT;AACF;;;AX3DA,SAAS,qBAAqB;AAEvB,IAAM,cAAN,MAAkB;AAAA,EACvB,YAAoB,QAAwB;AAAxB;AAAA,EAAyB;AAAA,EAE7C,MAAM,UAAyB;AAE7B,UAAM,YAAY,MAAM,KAAK,cAAc;AAG3C,SAAK,OAAO,YAAY;AAGxB,UAAM,YAAY,IAAI,cAAc;AAAA,MAClC,QAAQ,KAAK;AAAA,MACb;AAAA,IACF,CAAC;AAED,UAAM,UAAU,SAAS;AAAA,EAC3B;AAAA,EAEA,MAAc,gBAAoC;AAChD,QAAI;AAEF,YAAM,OAAO,WAAW,cAAc,YAAY,GAAG,GAAG;AAAA,QACtD,gBAAgB;AAAA,MAClB,CAAC;AAED,YAAM,SAAU,MAAM,KAAK,OAAO,KAAK,OAAO,aAAa;AAG3D,YAAM,YACJ,OAAO,aACP,OAAO,SAAS,aAChB,OAAO,WACP;AAEF,UAAI,CAAC,aAAa,CAAC,UAAU,WAAW;AACtC,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAGA,UAAI,KAAK,OAAO,gBAAgB;AAC9B,kBAAU,iBAAiB,KAAK,OAAO;AAAA,MACzC;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI;AAAA,QACR,kCAAkC,KAAK,OAAO,aAAa,MACzD,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;","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"]}
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 * Accept-Encoding header value for API requests\n * @default \"gzip, deflate, br\"\n * @example \"br, gzip, deflate\" (prioritize Brotli, exclude zstd)\n */\n acceptEncoding?: string;\n\n /**\n * Path to the endpoints configuration file\n */\n endpoints: string;\n\n /**\n * Provider type: 'vite' | 'nextjs'\n */\n provider: \"vite\" | \"nextjs\";\n\n /**\n * Output directory for generated files\n */\n output: string;\n\n /**\n * Whether to generate React Query hooks (for client-side)\n * @default true for vite, nextjs\n */\n generateHooks?: boolean;\n\n /**\n * Whether to generate server actions (Next.js only)\n * @default true for nextjs, false for vite\n */\n generateServerActions?: boolean;\n\n /**\n * Whether to generate server queries (Next.js only)\n * @default true for nextjs, false for vite\n */\n generateServerQueries?: boolean;\n\n /**\n * Whether to generate API client\n * @default true\n */\n generateClient?: boolean;\n\n /**\n * Whether to generate prefetch utilities\n * @default true\n */\n generatePrefetch?: boolean;\n\n /**\n * Custom templates directory\n */\n templatesDir?: string;\n\n /**\n * Additional options\n */\n options?: {\n /**\n * Use 'use client' directive\n */\n useClientDirective?: boolean;\n\n /**\n * Custom imports to add to generated files\n */\n customImports?: Record<string, string[]>;\n\n /**\n * Prefix for generated hook names\n */\n hookPrefix?: string;\n\n /**\n * Suffix for generated action names\n */\n actionSuffix?: string;\n };\n}\n\nexport interface ResolvedConfig extends UserConfig {\n rootDir: string;\n endpointsPath: string;\n outputDir: string;\n apiConfig?: APIConfig;\n}\n\nconst explorer = cosmiconfig(\"api-codegen\", {\n searchPlaces: [\n \"api-codegen.config.js\",\n \"api-codegen.config.mjs\",\n \"api-codegen.config.ts\",\n \"api-codegen.config.json\",\n \".api-codegenrc\",\n \".api-codegenrc.json\",\n \".api-codegenrc.js\",\n ],\n});\n\nexport async function loadConfig(\n configPath?: string,\n): Promise<ResolvedConfig | null> {\n try {\n const result = configPath\n ? await explorer.load(configPath)\n : await explorer.search();\n\n if (!result || !result.config) {\n return null;\n }\n\n const userConfig = result.config as UserConfig;\n const rootDir = path.dirname(result.filepath);\n\n // Resolve paths\n const endpointsPath = path.resolve(rootDir, userConfig.endpoints);\n const outputDir = path.resolve(rootDir, userConfig.output);\n\n // Set defaults based on provider\n const generateHooks = userConfig.generateHooks ?? true;\n const generateServerActions =\n userConfig.generateServerActions ?? userConfig.provider === \"nextjs\";\n const generateServerQueries =\n userConfig.generateServerQueries ?? userConfig.provider === \"nextjs\";\n const generateClient = userConfig.generateClient ?? true;\n const generatePrefetch = userConfig.generatePrefetch ?? true;\n\n return {\n ...userConfig,\n rootDir,\n endpointsPath,\n outputDir,\n generateHooks,\n generateServerActions,\n generateServerQueries,\n generateClient,\n generatePrefetch,\n };\n } catch (error) {\n throw new Error(\n `Failed to load config: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\n/**\n * Validate user config\n */\nexport function validateConfig(config: UserConfig): void {\n if (!config.endpoints) {\n throw new Error('Config error: \"endpoints\" path is required');\n }\n\n if (!config.provider) {\n throw new Error(\n 'Config error: \"provider\" must be specified (vite or nextjs)',\n );\n }\n\n if (![\"vite\", \"nextjs\"].includes(config.provider)) {\n throw new Error(\n 'Config error: \"provider\" must be either \"vite\" or \"nextjs\"',\n );\n }\n\n if (!config.output) {\n throw new Error('Config error: \"output\" directory is required');\n }\n}\n","import { createJiti } from \"jiti\";\nimport type { APIConfig } from \"@cushin/api-runtime\";\nimport type { ResolvedConfig } from \"../config/index.js\";\nimport { CodeGenerator } from \"../generators/index.js\";\nimport { fileURLToPath } from \"url\";\n\nexport class CodegenCore {\n constructor(private config: ResolvedConfig) {}\n\n async execute(): Promise<void> {\n // Load API configuration\n const apiConfig = await this.loadAPIConfig();\n\n // Store in config for generators\n this.config.apiConfig = apiConfig;\n\n // Generate code\n const generator = new CodeGenerator({\n config: this.config,\n apiConfig,\n });\n\n await generator.generate();\n }\n\n private async loadAPIConfig(): Promise<APIConfig> {\n try {\n // Use jiti to load TypeScript files\n const jiti = createJiti(fileURLToPath(import.meta.url), {\n interopDefault: true,\n });\n\n const module = (await jiti.import(this.config.endpointsPath)) as any;\n\n // Try different export patterns\n const apiConfig =\n module.apiConfig ||\n module.default?.apiConfig ||\n module.default ||\n module;\n\n if (!apiConfig || !apiConfig.endpoints) {\n throw new Error(\n 'Invalid API config: must export an object with \"endpoints\" property',\n );\n }\n\n // Merge acceptEncoding from user config if provided\n if (this.config.acceptEncoding) {\n apiConfig.acceptEncoding = this.config.acceptEncoding;\n }\n\n return apiConfig;\n } catch (error) {\n throw new Error(\n `Failed to load endpoints from \"${this.config.endpointsPath}\": ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"@cushin/api-runtime\";\n\nexport class HooksGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"hooks.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const useClientDirective =\n this.context.config.options?.useClientDirective ?? true;\n\n const content = `${useClientDirective ? \"'use client';\\n\" : \"\"}\nimport { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { apiClient } from \"./client\";\nimport { queryKeys } from \"./query-keys\";\nimport { apiQueryOptions } from \"./query-options\";\nimport type * as Types from \"./types\";\n\n${this.generateQueryHooks()}\n${this.generateMutationHooks()}\n`;\n\n return content;\n }\n\n private generateQueryHooks(): string {\n const hooks: string[] = [];\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n if (endpoint.method === \"GET\")\n hooks.push(this.generateQueryHook(name, endpoint));\n },\n );\n return hooks.join(\"\\n\\n\");\n }\n\n private generateQueryHook(name: string, endpoint: APIEndpoint): string {\n const hookName = `use${this.capitalize(name)}`;\n const resource = this.getResourceFromEndpoint(name, endpoint);\n const optionName = this.getEndpointKeyName(name);\n\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const queryType = endpoint.query\n ? `Types.${this.getQueryTypeName(name)}`\n : null;\n\n const params: string[] = [];\n const optionParams: string[] = [];\n\n const queryTags = this.getQueryTags(endpoint);\n\n if (paramsType) {\n params.push(`params: ${paramsType}`);\n optionParams.push(\"params\");\n }\n if (queryType) {\n params.push(`filters?: ${queryType}`);\n optionParams.push(\"filters\");\n }\n\n params.push(`options?: {\n enabled?: boolean;\n select?: <TData = ${responseType}>(data: ${responseType}) => TData;\n }`);\n\n return `/**\n * ${endpoint.description || `Query hook for ${name}`}\n * @tags ${queryTags.join(\", \") || \"none\"}\n */\nexport function ${hookName}(${params.join(\",\\n \")}) {\n return useQuery({\n ...apiQueryOptions.${resource}.${optionName}(${optionParams.join(\", \")}),\n ...options,\n });\n}`;\n }\n\n private generateMutationHooks(): string {\n const hooks: string[] = [];\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n if (endpoint.method !== \"GET\")\n hooks.push(this.generateMutationHook(name, endpoint));\n },\n );\n return hooks.join(\"\\n\\n\");\n }\n\n private generateMutationHook(name: string, endpoint: APIEndpoint): string {\n const hookName = `use${this.capitalize(name)}`;\n const resource = this.getResourceFromEndpoint(name, endpoint);\n\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const bodyType = endpoint.body ? `Types.${this.getInputTypeName(name)}` : null;\n\n const resourceHasQueries = this.resourceHasQueryEndpoints(resource);\n\n let inputType: string;\n let fnBody: string;\n\n if (paramsType && bodyType) {\n inputType = `{ params: ${paramsType}; body: ${bodyType}; }`;\n fnBody = `({ params, body }: ${inputType}) => apiClient.${name}(params, body)`;\n } else if (paramsType) {\n inputType = paramsType;\n fnBody = `(params: ${inputType}) => apiClient.${name}(params)`;\n } else if (bodyType) {\n inputType = bodyType;\n fnBody = `(body: ${inputType}) => apiClient.${name}(body)`;\n } else {\n inputType = \"void\";\n fnBody = `() => apiClient.${name}()`;\n }\n\n const invalidate = resourceHasQueries\n ? `queryClient.invalidateQueries({ queryKey: queryKeys.${resource}.all });`\n : \"\";\n\n return `/**\n * ${endpoint.description || `Mutation hook for ${name}`}\n * @tags ${endpoint.tags?.join(\", \") || \"none\"}\n */\nexport function ${hookName}(options?: {\n onSuccess?: (data: ${responseType}, variables: ${inputType}, context: unknown) => void;\n onError?: (error: Error, variables: ${inputType}, context: unknown) => void;\n onSettled?: (data: ${responseType} | undefined, error: Error | null, variables: ${inputType}, context: unknown) => void;\n onMutate?: (variables: ${inputType}) => Promise<unknown> | unknown;\n}) {\n ${invalidate ? \"const queryClient = useQueryClient();\" : \"\"}\n return useMutation({\n mutationFn: ${fnBody},\n onSuccess: (data, variables, context) => {\n ${invalidate}\n options?.onSuccess?.(data, variables, context);\n },\n onError: options?.onError,\n onSettled: options?.onSettled,\n onMutate: options?.onMutate,\n });\n}`;\n }\n}\n","import type { APIConfig, APIEndpoint } from \"@cushin/api-runtime\";\nimport type { ResolvedConfig } from \"../config/index.js\";\n\nexport interface GeneratorContext {\n config: ResolvedConfig;\n apiConfig: APIConfig;\n}\n\nexport abstract class BaseGenerator {\n constructor(protected context: GeneratorContext) {}\n\n abstract generate(): Promise<void>;\n\n protected isQueryEndpoint(endpoint: APIEndpoint): boolean {\n return endpoint.method === \"GET\";\n }\n\n protected isMutationEndpoint(endpoint: APIEndpoint): boolean {\n return !this.isQueryEndpoint(endpoint);\n }\n\n protected capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n\n protected getQueryTags(endpoint: APIEndpoint): string[] {\n return endpoint.tags || [];\n }\n\n protected getInvalidationTags(endpoint: APIEndpoint): string[] {\n const tags = endpoint.tags || [];\n return tags.filter((tag) => tag !== \"query\" && tag !== \"mutation\");\n }\n\n protected hasParams(endpoint: APIEndpoint): boolean {\n return !!endpoint.params;\n }\n\n protected hasQuery(endpoint: APIEndpoint): boolean {\n return !!endpoint.query;\n }\n\n protected hasBody(endpoint: APIEndpoint): boolean {\n return !!endpoint.body;\n }\n\n protected getEndpointSignature(\n name: string,\n endpoint: APIEndpoint,\n ): {\n hasParams: boolean;\n hasQuery: boolean;\n hasBody: boolean;\n paramType: string;\n queryType: string;\n bodyType: string;\n responseType: string;\n } {\n const hasParams = this.hasParams(endpoint);\n const hasQuery = this.hasQuery(endpoint);\n const hasBody = this.hasBody(endpoint);\n\n return {\n hasParams,\n hasQuery,\n hasBody,\n paramType: hasParams ? this.inferNonNull(`typeof apiConfig.endpoints.${name}.params`) : \"never\",\n queryType: hasQuery ? this.inferNonNull(`typeof apiConfig.endpoints.${name}.query`) : \"never\",\n bodyType: hasBody ? this.inferNonNull(`typeof apiConfig.endpoints.${name}.body`) : \"never\",\n responseType: this.inferNonNull(`typeof apiConfig.endpoints.${name}.response`),\n };\n }\n\n protected generateMutationCall(\n name: string,\n hasParams: boolean,\n hasBody: boolean,\n ): string {\n if (hasParams && hasBody) {\n return `return apiClient.${name}(input.params, input.body);`;\n } else if (hasParams) {\n return `return apiClient.${name}(input);`;\n } else if (hasBody) {\n return `return apiClient.${name}(input);`;\n } else {\n return `return apiClient.${name}();`;\n }\n }\n\n protected inferNonNull(expr: string): string {\n return `z.infer<NonNullable<${expr}>>`;\n }\n\n protected toCamelCase(str: string): string {\n return str\n .toLowerCase()\n .replace(/[-_\\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : \"\"))\n .replace(/^./, (c) => c.toLowerCase());\n }\n\n protected getResourceFromEndpoint(\n _name: string,\n endpoint: APIEndpoint,\n ): string {\n const tag = endpoint.tags?.find((t) => t !== \"query\" && t !== \"mutation\");\n if (tag) return this.toCamelCase(tag);\n const match = endpoint.path.match(/^\\/([^/]+)/);\n return match ? this.toCamelCase(match[1]) : \"general\";\n }\n\n protected groupEndpointsByResource() {\n const groups: Record<\n string,\n Array<{ name: string; endpoint: APIEndpoint }>\n > = {};\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n const res = this.getResourceFromEndpoint(name, endpoint);\n if (!groups[res]) groups[res] = [];\n groups[res].push({ name, endpoint });\n },\n );\n return groups;\n }\n\n protected resourceHasQueryEndpoints(resource: string): boolean {\n return (\n this.groupEndpointsByResource()[resource]?.some(\n ({ endpoint }) => endpoint.method === \"GET\",\n ) ?? false\n );\n }\n\n protected getEndpointKeyName(name: string): string {\n return name.startsWith(\"get\")\n ? name[3].toLowerCase() + name.slice(4)\n : name;\n }\n\n protected generateQueryKeyCall(\n resource: string,\n name: string,\n endpoint: APIEndpoint,\n ): string {\n const key = this.getEndpointKeyName(name);\n const args: string[] = [];\n if (endpoint.params) args.push(\"params\");\n if (endpoint.query) args.push(\"filters\");\n return args.length\n ? `queryKeys.${resource}.${key}(${args.join(\", \")})`\n : `queryKeys.${resource}.${key}()`;\n }\n\n protected hasQueryOptions() {\n return Object.values(this.context.apiConfig.endpoints).some(\n (e) => e.method === \"GET\",\n );\n }\n\n // Helper methods to get named type references\n protected getResponseTypeName(name: string): string {\n return `${this.capitalize(name)}Response`;\n }\n\n protected getInputTypeName(name: string): string {\n return `${this.capitalize(name)}Input`;\n }\n\n protected getQueryTypeName(name: string): string {\n return `${this.capitalize(name)}Query`;\n }\n\n protected getParamsTypeName(name: string): string {\n return `${this.capitalize(name)}Params`;\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"@cushin/api-runtime\";\n\nexport class ServerActionsGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"actions.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const imports = `'use server';\n\nimport { revalidateTag, revalidatePath } from 'next/cache';\nimport { serverClient } from './server-client';\nimport type * as Types from './types';\n\nexport type ActionResult<T> =\n | { success: true; data: T }\n | { success: false; error: string };\n`;\n\n const actions: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n if (this.isMutationEndpoint(endpoint)) {\n actions.push(this.generateServerAction(name, endpoint));\n }\n },\n );\n\n return imports + \"\\n\" + actions.join(\"\\n\\n\");\n }\n\n private generateServerAction(name: string, endpoint: APIEndpoint): string {\n const actionSuffix = this.context.config.options?.actionSuffix || \"Action\";\n const actionName = `${name}${actionSuffix}`;\n const invalidationTags = this.getInvalidationTags(endpoint);\n\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const bodyType = endpoint.body ? `Types.${this.getInputTypeName(name)}` : null;\n\n let inputType = \"\";\n let callArgs = \"\";\n if (paramsType && bodyType) {\n inputType = `input: { params: ${paramsType}; body: ${bodyType} }`;\n callArgs = \"input.params, input.body\";\n } else if (paramsType) {\n inputType = `params: ${paramsType}`;\n callArgs = \"params\";\n } else if (bodyType) {\n inputType = `body: ${bodyType}`;\n callArgs = \"body\";\n }\n\n const revalidateStatements =\n invalidationTags.length > 0\n ? invalidationTags\n .map((tag) => ` revalidateTag('${tag}', 'max');`)\n .join(\"\\n\")\n : \" // No automatic revalidations\";\n\n return `/**\n * ${endpoint.description || `Server action for ${name}`}\n * @tags ${endpoint.tags?.join(\", \") || \"none\"}\n */\nexport async function ${actionName}(\n ${inputType}\n): Promise<ActionResult<${responseType}>> {\n try {\n const result = await (serverClient as any).${name}(${callArgs});\n\n // Revalidate related data\n${revalidateStatements}\n\n return { success: true, data: result };\n } catch (error) {\n console.error('[Server Action Error]:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n };\n }\n}`;\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"@cushin/api-runtime\";\n\nexport class ServerQueriesGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"queries.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const imports = `import { cache } from 'react';\nimport { unstable_cache } from 'next/cache';\nimport { serverClient } from './server-client';\nimport type * as Types from './types';\n`;\n\n const queries: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n if (this.isQueryEndpoint(endpoint)) {\n queries.push(this.generateServerQuery(name, endpoint));\n }\n },\n );\n\n return imports + \"\\n\" + queries.join(\"\\n\\n\");\n }\n\n private generateServerQuery(name: string, endpoint: APIEndpoint): string {\n const queryName = `${name}Query`;\n const queryTags = this.getQueryTags(endpoint);\n\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const queryType = endpoint.query\n ? `Types.${this.getQueryTypeName(name)}`\n : null;\n\n const paramDef = paramsType ? `params: ${paramsType}` : \"\";\n const queryDef = queryType ? `query?: ${queryType}` : \"\";\n const paramsList = [paramDef, queryDef].filter(Boolean).join(\",\\n \");\n\n // Build client call with proper argument handling\n let clientCall = \"\";\n if (paramsType && queryType) {\n clientCall = `(serverClient as any).${name}(params, query)`;\n } else if (paramsType) {\n clientCall = `(serverClient as any).${name}(params)`;\n } else if (queryType) {\n clientCall = `(serverClient as any).${name}(query)`;\n } else {\n clientCall = `(serverClient as any).${name}()`;\n }\n\n // Generate cache key based on params\n const cacheKeyParts: string[] = [`'${name}'`];\n if (paramsType) cacheKeyParts.push(\"JSON.stringify(params)\");\n if (queryType)\n cacheKeyParts.push(\"query ? JSON.stringify(query) : 'no-query'\");\n\n return `/**\n * ${endpoint.description || `Server query for ${name}`}\n * @tags ${queryTags.join(\", \") || \"none\"}\n */\nexport const ${queryName} = cache(async (\n ${paramsList}\n): Promise<${responseType}> => {\n return unstable_cache(\n async () => ${clientCall},\n [${cacheKeyParts.join(\", \")}],\n {\n tags: [${queryTags.map((tag) => `'${tag}'`).join(\", \")}],\n revalidate: 3600, // 1 hour default, can be overridden\n }\n )();\n});`;\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class TypesGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.ts$/, \"\");\n\n return `// Auto-generated type definitions\n// Do not edit this file manually\n\nimport type { z } from 'zod';\nimport { apiConfig } from '${relativePath}';\n\n\n// Re-export endpoint configuration types\nexport type { APIConfig, APIEndpoint, HTTPMethod } from '@cushin/api-runtime';\n\n${this.generateEndpointTypes()}\n`;\n }\n\n private generateEndpointTypes(): string {\n const types: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n const cap = this.capitalize(name);\n\n // Always generate Response type\n types.push(\n `export type ${cap}Response = z.infer<NonNullable<typeof apiConfig.endpoints.${name}.response>>;`,\n );\n\n // Generate Input type for body (if exists)\n if (endpoint.body) {\n types.push(\n `export type ${cap}Input = z.infer<NonNullable<typeof apiConfig.endpoints.${name}.body>>;`,\n );\n }\n\n // Generate Query type (if exists)\n if (endpoint.query) {\n types.push(\n `export type ${cap}Query = z.infer<NonNullable<typeof apiConfig.endpoints.${name}.query>>;`,\n );\n }\n\n // Generate Params type (if exists)\n if (endpoint.params) {\n types.push(\n `export type ${cap}Params = z.infer<NonNullable<typeof apiConfig.endpoints.${name}.params>>;`,\n );\n }\n },\n );\n\n return types.join(\"\\n\");\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class ClientGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n await this.generateClientFile();\n\n if (this.context.config.provider === \"nextjs\") {\n await this.generateServerClientFile();\n }\n }\n\n private async generateClientFile(): Promise<void> {\n const content = this.generateClientContent();\n const outputPath = path.join(this.context.config.outputDir, \"client.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private async generateServerClientFile(): Promise<void> {\n const content = this.generateServerClientContent();\n const outputPath = path.join(\n this.context.config.outputDir,\n \"server-client.ts\",\n );\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateClientContent(): string {\n const useClientDirective =\n this.context.config.options?.useClientDirective ?? true;\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.ts$/, \"\");\n\n return `${useClientDirective ? \"'use client';\\n\" : \"\"}\nimport { createAPIClient } from '@cushin/api-runtime';\nimport type { AuthCallbacks } from '@cushin/api-runtime';\nimport { apiConfig } from '${relativePath}';\nimport type * as Types from './types';\n\n// Type the methods based on generated types\ntype APIClientMethods = {\n${this.generateAPIClientMethodTypes()}\n};\n\n// Export singleton instance (will be initialized later)\nexport let baseClient: APIClientMethods & {\n refreshAuth: () => Promise<void>;\n updateAuthCallbacks: (callbacks: AuthCallbacks) => void;\n};\n\nexport const apiClient = {\n${this.generateApiClientMethods()}\n};\n\n/**\n * Initialize API client with auth callbacks\n * Call this function in your auth provider setup\n *\n * @example\n * const authCallbacks = {\n * getTokens: () => getStoredTokens(),\n * onAuthError: () => router.push('/login'),\n * onRefreshToken: async () => {\n * await refreshAccessToken();\n * },\n * };\n *\n * initializeAPIClient(authCallbacks);\n */\nexport const initializeAPIClient = (authCallbacks: AuthCallbacks) => {\n baseClient = createAPIClient(apiConfig, authCallbacks) as any;\n return baseClient;\n};\n\n// Export for custom usage\nexport { createAPIClient };\nexport type { AuthCallbacks };\n`;\n }\n\n private generateServerClientContent(): string {\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.ts$/, \"\");\n\n return `import { createAPIClient } from '@cushin/api-runtime';\nimport type { AuthCallbacks } from '@cushin/api-runtime';\nimport { apiConfig } from '${relativePath}';\nimport type * as Types from './types';\n\n// Type the methods based on generated types\ntype APIClientMethods = {\n${this.generateAPIClientMethodTypes()}\n};\n\n// Export singleton instance (will be initialized later if auth is needed)\nexport let serverClient: APIClientMethods & {\n refreshAuth: () => Promise<void>;\n updateAuthCallbacks: (callbacks: AuthCallbacks) => void;\n};\n\n// Initialize without auth by default\nserverClient = createAPIClient(apiConfig) as any;\n\n/**\n * Initialize server-side API client with auth callbacks\n * Call this in Server Actions or Route Handlers where you need authentication\n *\n * @example\n * // In a Server Action or API Route:\n * import { cookies } from 'next/headers';\n *\n * const authCallbacks = {\n * getTokens: async () => {\n * const token = cookies().get('auth_token')?.value;\n * return token ? { accessToken: token } : null;\n * },\n * onAuthError: () => {\n * // Handle auth error (e.g., redirect, clear cookies)\n * }\n * };\n *\n * initializeServerClient(authCallbacks);\n */\nexport const initializeServerClient = (authCallbacks: AuthCallbacks) => {\n serverClient = createAPIClient(apiConfig, authCallbacks) as any;\n return serverClient;\n};\n\n// Export for custom usage\nexport { createAPIClient };\nexport type { AuthCallbacks };\n`;\n }\n\n private generateAPIClientMethodTypes(): string {\n const methods: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const queryType = endpoint.query\n ? `Types.${this.getQueryTypeName(name)}`\n : null;\n const bodyType = endpoint.body\n ? `Types.${this.getInputTypeName(name)}`\n : null;\n\n let signature = \"\";\n if (endpoint.method === \"GET\") {\n if (paramsType && queryType) {\n signature = `(params: ${paramsType}, query?: ${queryType}, headers?: Record<string, string>) => Promise<${responseType}>`;\n } else if (paramsType) {\n signature = `(params: ${paramsType}, headers?: Record<string, string>) => Promise<${responseType}>`;\n } else if (queryType) {\n signature = `(query?: ${queryType}, headers?: Record<string, string>) => Promise<${responseType}>`;\n } else {\n signature = `(headers?: Record<string, string>) => Promise<${responseType}>`;\n }\n } else {\n if (paramsType && bodyType) {\n signature = `(params: ${paramsType}, body: ${bodyType}, headers?: Record<string, string>) => Promise<${responseType}>`;\n } else if (paramsType) {\n signature = `(params: ${paramsType}, headers?: Record<string, string>) => Promise<${responseType}>`;\n } else if (bodyType) {\n signature = `(body: ${bodyType}, headers?: Record<string, string>) => Promise<${responseType}>`;\n } else {\n signature = `(headers?: Record<string, string>) => Promise<${responseType}>`;\n }\n }\n\n methods.push(` ${name}: ${signature};`);\n },\n );\n\n return methods.join(\"\\n\");\n }\n\n private generateApiClientMethods(): string {\n const methods: string[] = [];\n\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const queryType = endpoint.query\n ? `Types.${this.getQueryTypeName(name)}`\n : null;\n const bodyType = endpoint.body\n ? `Types.${this.getInputTypeName(name)}`\n : null;\n\n if (endpoint.method === \"GET\") {\n if (paramsType && queryType) {\n methods.push(` ${name}(params: ${paramsType}, query?: ${queryType}, headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(params, query, headers);\n },`);\n } else if (paramsType) {\n methods.push(` ${name}(params: ${paramsType}, headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(params, headers);\n },`);\n } else if (queryType) {\n methods.push(` ${name}(query?: ${queryType}, headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(query, headers);\n },`);\n } else {\n methods.push(` ${name}(headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(headers);\n },`);\n }\n } else {\n if (paramsType && bodyType) {\n methods.push(` ${name}(params: ${paramsType}, body: ${bodyType}, headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(params, body, headers);\n },`);\n } else if (paramsType) {\n methods.push(` ${name}(params: ${paramsType}, headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(params, headers);\n },`);\n } else if (bodyType) {\n methods.push(` ${name}(body: ${bodyType}, headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(body, headers);\n },`);\n } else {\n methods.push(` ${name}(headers?: Record<string, string>): Promise<${responseType}> {\n if (!baseClient) throw new Error('API client not initialized. Call initializeAPIClient() first.');\n return baseClient.${name}(headers);\n },`);\n }\n }\n },\n );\n\n return methods.join(\"\\n\");\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class QueryKeysGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(\n this.context.config.outputDir,\n \"query-keys.ts\",\n );\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.ts$/, \"\");\n\n const content = `// Auto-generated query keys\nimport type * as Types from './types';\n\nexport const queryKeys = {\n${this.generateQueryKeysContent()}\n} as const;\n`;\n return content;\n }\n\n private generateQueryKeysContent(): string {\n const resourceGroups = this.groupEndpointsByResource();\n const keys: string[] = [];\n\n Object.entries(resourceGroups).forEach(([resource, endpoints]) => {\n const queryEndpoints = endpoints.filter(\n ({ endpoint }) => endpoint.method === \"GET\",\n );\n if (queryEndpoints.length === 0) return;\n\n const resourceKeys: string[] = [` all: ['${resource}'] as const,`];\n const added = new Set<string>();\n\n queryEndpoints.forEach(({ name, endpoint }) => {\n const keyName = this.getEndpointKeyName(name);\n if (added.has(keyName)) return;\n\n if (endpoint.params || endpoint.query) {\n const params: string[] = [];\n if (endpoint.params)\n params.push(`params?: Types.${this.getParamsTypeName(name)}`);\n if (endpoint.query)\n params.push(`query?: Types.${this.getQueryTypeName(name)}`);\n\n resourceKeys.push(` ${keyName}: (${params.join(\", \")}) =>\n ['${resource}', '${keyName}', ${endpoint.params ? \"params\" : \"undefined\"}, ${endpoint.query ? \"query\" : \"undefined\"}] as const,`);\n } else {\n resourceKeys.push(\n ` ${keyName}: () => ['${resource}', '${keyName}'] as const,`,\n );\n }\n added.add(keyName);\n });\n\n keys.push(` ${resource}: {\\n${resourceKeys.join(\"\\n\")}\\n },`);\n });\n\n return keys.join(\"\\n\");\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class QueryOptionsGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(\n this.context.config.outputDir,\n \"query-options.ts\",\n );\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n private generateContent(): string {\n const content = `// Auto-generated query options\nimport { queryOptions } from '@tanstack/react-query';\nimport { apiClient } from './client';\nimport { queryKeys } from './query-keys';\nimport type * as Types from './types';\n\n${this.generateQueryOptionsContent()}\n\nexport const apiQueryOptions = {\n${this.generateQueryOptionsExports()}\n} as const;\n`;\n\n return content;\n }\n\n private generateQueryOptionsContent(): string {\n const groups = this.groupEndpointsByResource();\n const options: string[] = [];\n\n Object.entries(groups).forEach(([resource, endpoints]) => {\n const queries = endpoints.filter(\n ({ endpoint }) => endpoint.method === \"GET\",\n );\n if (queries.length === 0) return;\n\n const resourceOptions: string[] = [];\n queries.forEach(({ name, endpoint }) => {\n const optionName = this.getEndpointKeyName(name);\n const responseType = `Types.${this.getResponseTypeName(name)}`;\n const paramsType = endpoint.params\n ? `Types.${this.getParamsTypeName(name)}`\n : null;\n const queryType = endpoint.query\n ? `Types.${this.getQueryTypeName(name)}`\n : null;\n\n const params: string[] = [];\n let apiCall = \"\";\n\n if (paramsType && queryType) {\n params.push(`params: ${paramsType}`, `filters?: ${queryType}`);\n apiCall = `apiClient.${name}(params, filters)`;\n } else if (paramsType) {\n params.push(`params: ${paramsType}`);\n apiCall = `apiClient.${name}(params)`;\n } else if (queryType) {\n params.push(`filters?: ${queryType}`);\n apiCall = `apiClient.${name}(filters)`;\n } else {\n apiCall = `apiClient.${name}()`;\n }\n\n const keyCall = this.generateQueryKeyCall(resource, name, endpoint);\n\n resourceOptions.push(` ${optionName}: (${params.join(\", \")}) =>\n queryOptions({\n queryKey: ${keyCall},\n queryFn: (): Promise<${responseType}> => ${apiCall},\n staleTime: 1000 * 60 * 5,\n }),`);\n });\n\n options.push(\n `const ${resource}QueryOptions = {\\n${resourceOptions.join(\"\\n\")}\\n};\\n`,\n );\n });\n\n return options.join(\"\\n\");\n }\n\n private generateQueryOptionsExports(): string {\n const groups = this.groupEndpointsByResource();\n const exports: string[] = [];\n\n Object.keys(groups).forEach((resource) => {\n const hasQueries = groups[resource].some(\n ({ endpoint }) => endpoint.method === \"GET\",\n );\n if (hasQueries) exports.push(` ${resource}: ${resource}QueryOptions,`);\n });\n\n return exports.join(\"\\n\");\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\nimport type { APIEndpoint } from \"@cushin/api-runtime\";\n\nexport class PrefetchGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"prefetchs.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const content = `// Auto-generated prefetch utilities\nimport { type QueryClient } from '@tanstack/react-query';\n${this.hasQueryOptions() ? \"import { apiQueryOptions } from './query-options';\" : \"\"}\nimport type * as Types from './types';\n\n${this.generatePrefetchFunctions()}\n`;\n return content;\n }\n\n private generatePrefetchFunctions(): string {\n const funcs: string[] = [];\n Object.entries(this.context.apiConfig.endpoints).forEach(\n ([name, endpoint]) => {\n if (endpoint.method === \"GET\")\n funcs.push(this.generatePrefetchFunction(name, endpoint));\n },\n );\n return funcs.join(\"\\n\\n\");\n }\n\n private generatePrefetchFunction(\n name: string,\n endpoint: APIEndpoint,\n ): string {\n const prefetchName = `prefetch${this.capitalize(name)}`;\n const resource = this.getResourceFromEndpoint(name, endpoint);\n const optionName = this.getEndpointKeyName(name);\n\n const params: string[] = [\"queryClient: QueryClient\"];\n const optionParams: string[] = [];\n\n if (endpoint.params) {\n params.push(`params: Types.${this.getParamsTypeName(name)}`);\n optionParams.push(\"params\");\n }\n if (endpoint.query) {\n params.push(`filters?: Types.${this.getQueryTypeName(name)}`);\n optionParams.push(\"filters\");\n }\n\n return `export const ${prefetchName} = async (${params.join(\",\\n \")}) => {\n return await queryClient.ensureQueryData(apiQueryOptions.${resource}.${optionName}(${optionParams.join(\", \")}));\n};`;\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BaseGenerator } from \"./base.js\";\n\nexport class IndexGenerator extends BaseGenerator {\n async generate(): Promise<void> {\n const content = this.generateContent();\n const outputPath = path.join(this.context.config.outputDir, \"index.ts\");\n\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content, \"utf-8\");\n }\n\n private generateContent(): string {\n const outputPath = path.join(this.context.config.outputDir, \"types.ts\");\n const endpointsPath = path.join(this.context.config.endpointsPath);\n const relativePath = path\n .relative(path.dirname(outputPath), endpointsPath)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.ts$/, \"\");\n\n const content = `// Auto-generated exports\nexport * from './types';\nexport * from './client';\nexport * from './query-keys';\n${this.hasQueryOptions() ? \"export * from './query-options';\" : \"\"}\nexport * from './hooks';\nexport * from './prefetchs';\nexport { z } from 'zod';\nexport { apiConfig } from '${relativePath}';\n`;\n return content;\n }\n}\n","import { HooksGenerator } from \"./hooks.js\";\nimport { ServerActionsGenerator } from \"./actions.js\";\nimport { ServerQueriesGenerator } from \"./queries.js\";\nimport { TypesGenerator } from \"./types.js\";\nimport { ClientGenerator } from \"./client.js\";\nimport type { GeneratorContext } from \"./base.js\";\nimport { QueryKeysGenerator } from \"./query-keys.js\";\nimport { QueryOptionsGenerator } from \"./query-options.js\";\nimport { PrefetchGenerator } from \"./prefetch.js\";\nimport { IndexGenerator } from \"./generate-index.js\";\n\nexport class CodeGenerator {\n constructor(private context: GeneratorContext) {}\n\n async generate(): Promise<void> {\n const generators = this.getGenerators();\n\n for (const generator of generators) {\n await generator.generate();\n }\n }\n\n private getGenerators() {\n const generators: Array<any> = [];\n\n // Always generate types\n generators.push(new TypesGenerator(this.context));\n generators.push(new IndexGenerator(this.context));\n\n // Generate client if enabled\n if (this.context.config.generateClient) {\n generators.push(new ClientGenerator(this.context));\n }\n\n // Generate hooks if enabled\n if (this.context.config.generateHooks) {\n generators.push(new QueryKeysGenerator(this.context));\n generators.push(new QueryOptionsGenerator(this.context));\n generators.push(new HooksGenerator(this.context));\n }\n\n if (this.context.config.generatePrefetch) {\n generators.push(new PrefetchGenerator(this.context));\n }\n\n // Generate server actions if enabled (Next.js only)\n if (\n this.context.config.generateServerActions &&\n this.context.config.provider === \"nextjs\"\n ) {\n generators.push(new ServerActionsGenerator(this.context));\n }\n\n // Generate server queries if enabled (Next.js only)\n if (\n this.context.config.generateServerQueries &&\n this.context.config.provider === \"nextjs\"\n ) {\n generators.push(new ServerQueriesGenerator(this.context));\n }\n\n return generators;\n }\n}\n"],"mappings":"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","names":["path","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": "5.0.5",
3
+ "version": "5.0.7",
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,7 +60,7 @@
60
60
  "fast-glob": "^3.3.2",
61
61
  "jiti": "^2.6.1",
62
62
  "ora": "^8.0.0",
63
- "@cushin/api-runtime": "5.0.4",
63
+ "@cushin/api-runtime": "5.0.7",
64
64
  "@cushin/codegen-cli": "5.0.0"
65
65
  },
66
66
  "devDependencies": {