UNPKG

@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
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;