@jsheaven/astro-client-generator
Version:
Generates TypeScript API client code for your Astro endpoints. No manual `fetch()` code writing anymore.
64 lines (63 loc) • 3.85 kB
TypeScript
import type { AstroIntegration } from 'astro';
export interface ApiClientGeneratorOptions {
/** folder to the API directory on disk (source code), default: './src/pages/api' */
apiDir?: string;
/** API base URL for calling the API (only relevant if you host in a subdir, it's very unlikely), default: '' */
baseUrl?: string;
/** folder on disk to write the client code to, default: './src/pages/api-client' */
outDir?: string;
/** path to tsconfig.json, default: './tsconfig.json' as it is expected to run in project root */
tsConfigPath?: string;
/** parser to use. 'naive' comes with constraints (non-standard-compliant), 'baseline' is 900x slower, default: 'naive' */
parser?: 'naive' | 'baseline';
/** site URL to request from. Optional, usually auto-discovered from Astro config */
site?: string;
/** disable auto-discovery of site URL, default: false */
disableSiteAutoDiscovery?: boolean;
}
export declare const apiGeneratorOptionsDefaults: ApiClientGeneratorOptions;
export type HttpMethod = 'GET' | 'POST' | 'DELETE' | 'PATCH' | 'HEAD' | 'PUT' | 'OPTIONS';
export declare const AstroHttpEndpointMethodNames: string[];
export declare const HttpMethods: Array<HttpMethod>;
export type InterfacePosition = [number, number];
export declare const upperCaseFirst: (text: string) => string;
export declare const lowerCaseFirst: (text: string) => string;
export declare const cleanupInterfce: (codeLines: Array<string>) => string;
export declare const analyzeHttpMethodsImplemented: (code: string) => Array<HttpMethod>;
/** merges the default values granularly with the user-provided config overrides */
export declare const validateConfig: (apiGeneratorOptions: ApiClientGeneratorOptions) => {
apiDir?: string;
baseUrl?: string;
outDir?: string;
tsConfigPath?: string;
parser?: 'naive' | 'baseline';
site?: string;
disableSiteAutoDiscovery?: boolean;
};
/** Astro integration function to add to integrations [apiClientGenerator()] array in astro.config.js */
export declare const apiClientGenerator: (apiGeneratorOptions?: ApiClientGeneratorOptions) => AstroIntegration;
export interface ApiRouteParseResult {
apiRoute: string;
path: string;
imports: Array<string>;
relativePath: string;
method: HttpMethod;
camelCaseName: string;
requestInterface: string;
responseInterface: string;
genericInterfaces: Array<string>;
genericTypes: Array<string>;
}
/** baseline TypeScript syntax parser; has no limitations, but takes around 1000ms per endpoint */
export declare const parseApiRoutesBaseline: (apiRoutes: Array<string>, tsConfigPath: string) => Array<Partial<ApiRouteParseResult>>;
/** naive TypeScript syntax parser, comes with a few lexical limitations, but takes just 2ms per endpoint (see README) */
export declare const parseApiRoutesNaive: (apiRoutes: Array<string>) => Array<Partial<ApiRouteParseResult>>;
export interface ApiRouteParsedGrouped {
[apiRoutePath: string]: Array<ApiRouteParseResult>;
}
export declare const groupByApiRoute: (routes: Array<ApiRouteParseResult>) => ApiRouteParsedGrouped;
/** discovers the API endpoints, parses and statically analyzes their code: finally calls the codegen */
export declare const generateClientApis: (apiGeneratorOptions: ApiClientGeneratorOptions) => void;
export declare const produceClientApiRequestImplCode: (parseResult: ApiRouteParseResult, apiGeneratorOptions: ApiClientGeneratorOptions, requestParamDecl: string, bodyInst: string, hasMultipleEndpointsInOneFile: boolean) => string;
export declare const produceClientApiHeaderCode: (parseResult: ApiRouteParseResult, requestInterfaceDecl: string) => string;
export declare const produceClientApiCode: (parseResults: Array<ApiRouteParseResult>, apiGeneratorOptions: ApiClientGeneratorOptions) => string;