UNPKG

schemantic

Version:

A fully typed, extensible TypeScript type generator for FastAPI OpenAPI schemas

602 lines (400 loc) 13 kB
# API Reference ## Core Classes ### Schemantic The main class for generating TypeScript types and API clients from OpenAPI schemas. ```typescript import { Schemantic, SchemanticConfig } from "schemantic"; const config: SchemanticConfig = { schemaUrl: "http://localhost:8000/openapi.json", outputDir: "./src/generated", generateTypes: true, generateApiClient: true, }; const Schemantic = new Schemantic(config); ``` #### Methods ##### `generate(): Promise<GenerationResult>` Generates TypeScript types and API clients from the configured OpenAPI schema. **Returns:** `Promise<GenerationResult>` ```typescript const result = await Schemantic.generate(); if (result.success) { console.log(`Generated ${result.generatedFiles.length} files`); console.log(`Types: ${result.statistics.totalTypes}`); console.log(`Endpoints: ${result.statistics.totalEndpoints}`); } ``` ##### `validate(): Promise<ValidationResult>` Validates the OpenAPI schema without generating any files. **Returns:** `Promise<ValidationResult>` ```typescript const validation = await Schemantic.validate(); if (validation.isValid) { console.log("Schema is valid"); } else { console.log("Validation errors:", validation.errors); } ``` ##### `getPluginManager(): PluginManager` Returns the plugin manager instance for registering and managing plugins. **Returns:** `PluginManager` ```typescript const pluginManager = Schemantic.getPluginManager(); pluginManager.registerPlugin(customPlugin); ``` ##### `getConfig(): SchemanticConfig` Returns the current configuration. **Returns:** `SchemanticConfig` ### SchemanticConfig Configuration interface for the Schemantic class. ```typescript interface SchemanticConfig { // Input configuration schemaUrl?: string; schemaFile?: string; schemaData?: OpenAPISchema; // Output configuration outputDir: string; outputFileName?: string; // Generation options generateTypes: boolean; generateApiClient: boolean; generateHooks?: boolean; generateQueries?: boolean; // TypeScript configuration useStrictTypes: boolean; useOptionalChaining: boolean; useNullishCoalescing: boolean; // Naming conventions namingConvention: "camelCase" | "snake_case" | "PascalCase"; typePrefix?: string; typeSuffix?: string; // Customization customTypeMappings?: Record<string, string>; excludePaths?: string[]; includePaths?: string[]; excludeSchemas?: string[]; includeSchemas?: string[]; // Plugin configuration plugins?: PluginConfig[]; // Advanced options preserveComments: boolean; generateIndexFile: boolean; // Note: `generateBarrelExports` was removed in v0.3.0 — exports are consolidated in `index.ts`. } ``` ## Parser Classes ### ParserFactory Factory class for creating schema parsers. ```typescript import { ParserFactory } from "schemantic"; // Create parser by type const parser = ParserFactory.createParser("openapi", config); // Auto-detect parser type const autoParser = ParserFactory.autoCreateParser(input, config); ``` #### Methods ##### `createParser(type: ParserType, config: SchemanticConfig): SchemaParser` Creates a parser instance of the specified type. **Parameters:** - `type` - The parser type ('openapi', 'swagger', 'json-schema') - `config` - Schemantic configuration **Returns:** `SchemaParser` ##### `autoCreateParser(input: SchemaInput, config: SchemanticConfig): SchemaParser` Automatically detects the parser type and creates an appropriate instance. **Parameters:** - `input` - Schema input source - `config` - Schemantic configuration **Returns:** `SchemaParser` ##### `detectParserType(input: SchemaInput): ParserType` Detects the appropriate parser type from the input. **Parameters:** - `input` - Schema input source **Returns:** `ParserType` ### OpenAPIParser Parser implementation for OpenAPI 3.0+ specifications. ```typescript import { OpenAPIParser } from "schemantic"; const parser = new OpenAPIParser(config); ``` #### Methods ##### `parse(input: SchemaInput): Promise<OpenAPISchema>` Parses schema from various input sources. **Parameters:** - `input` - Schema input source **Returns:** `Promise<OpenAPISchema>` ##### `validate(schema: OpenAPISchema): Promise<ValidationResult>` Validates the parsed schema. **Parameters:** - `schema` - OpenAPI schema to validate **Returns:** `Promise<ValidationResult>` ##### `createResolver(schema: OpenAPISchema): SchemaResolver` Creates a schema resolver for the parsed schema. **Parameters:** - `schema` - OpenAPI schema **Returns:** `SchemaResolver` ## Generator Classes ### TypeGeneratorFactory Factory class for creating type generators. ```typescript import { TypeGeneratorFactory } from "schemantic"; // Create generators from config const generators = TypeGeneratorFactory.createFromConfig(config); // Generate type from schema const generatedType = TypeGeneratorFactory.generateType( schema, context, generators ); ``` #### Methods ##### `createFromConfig(config: SchemanticConfig): TypeGenerator[]` Creates type generators based on configuration. **Parameters:** - `config` - Schemantic configuration **Returns:** `TypeGenerator[]` ##### `generateType(schema: ResolvedSchema, context: GenerationContext, generators: TypeGenerator[]): GeneratedType | undefined` Generates a TypeScript type from a schema using available generators. **Parameters:** - `schema` - Resolved schema - `context` - Generation context - `generators` - Available generators **Returns:** `GeneratedType | undefined` ##### `getBestGenerator(schema: ResolvedSchema, generators: TypeGenerator[]): TypeGenerator | undefined` Finds the best generator for a given schema. **Parameters:** - `schema` - Resolved schema - `generators` - Available generators **Returns:** `TypeGenerator | undefined` ### ObjectTypeGenerator Generator for creating TypeScript interfaces from OpenAPI schema objects. ```typescript import { ObjectTypeGenerator } from "schemantic"; const generator = new ObjectTypeGenerator(options); ``` ### EnumTypeGenerator Generator for creating TypeScript enums from OpenAPI schema enums. ```typescript import { EnumTypeGenerator } from "schemantic"; const generator = new EnumTypeGenerator(options); ``` ### ApiClientGenerator Generator for creating TypeScript API client classes. ```typescript import { ApiClientGenerator } from "schemantic"; const generator = new ApiClientGenerator(context); const client = generator.generate(context); // The client is exported via the generated index file and can be imported from './generated' ``` ## Plugin System ### PluginManager Manages plugin registration and execution. ```typescript import { PluginManager } from "schemantic"; const pluginManager = new PluginManager(); ``` #### Methods ##### `registerPlugin(plugin: SchemanticPlugin): void` Registers a plugin with the manager. **Parameters:** - `plugin` - Plugin to register ##### `enablePlugin(name: string): void` Enables a registered plugin. **Parameters:** - `name` - Plugin name ##### `disablePlugin(name: string): void` Disables a registered plugin. **Parameters:** - `name` - Plugin name ##### `executeBeforeGeneration(context: GenerationContext): Promise<void>` Executes before generation hooks for all enabled plugins. **Parameters:** - `context` - Generation context **Returns:** `Promise<void>` ##### `executeAfterGeneration(context: GenerationContext, result: GenerationResult): Promise<void>` Executes after generation hooks for all enabled plugins. **Parameters:** - `context` - Generation context - `result` - Generation result **Returns:** `Promise<void>` ### PluginLoader Loads plugins from various sources. ```typescript import { PluginLoader } from "schemantic"; const loader = new PluginLoader(); ``` #### Methods ##### `loadPluginFromFile(filePath: string): Promise<SchemanticPlugin>` Loads a plugin from a file. **Parameters:** - `filePath` - Path to plugin file **Returns:** `Promise<SchemanticPlugin>` ##### `loadPluginFromPackage(packageName: string): Promise<SchemanticPlugin>` Loads a plugin from an npm package. **Parameters:** - `packageName` - Package name **Returns:** `Promise<SchemanticPlugin>` ##### `loadPluginsFromDirectory(directoryPath: string): Promise<SchemanticPlugin[]>` Loads all plugins from a directory. **Parameters:** - `directoryPath` - Directory path **Returns:** `Promise<SchemanticPlugin[]>` ### SchemanticPlugin Plugin interface for extending Schemantic functionality. ```typescript interface SchemanticPlugin { name: string; version: string; description: string; // Lifecycle hooks beforeGeneration?(context: GenerationContext): Promise<void> | void; afterGeneration?( context: GenerationContext, result: GenerationResult ): Promise<void> | void; // Type generation hooks beforeTypeGeneration?( typeName: string, schema: ResolvedSchema, context: GenerationContext ): Promise<void> | void; afterTypeGeneration?( typeName: string, generatedType: GeneratedType, context: GenerationContext ): Promise<void> | void; // Client generation hooks beforeClientGeneration?(context: GenerationContext): Promise<void> | void; afterClientGeneration?( generatedClient: GeneratedApiClient, context: GenerationContext ): Promise<void> | void; // Schema transformation hooks transformSchema?( schema: ResolvedSchema, context: GenerationContext ): ResolvedSchema; // Custom generators customTypeGenerators?: Record< string, (schema: ResolvedSchema, context: GenerationContext) => GeneratedType >; customClientGenerators?: Record< string, (context: GenerationContext) => GeneratedApiClient >; } ``` ## Type Definitions ### GeneratedType Represents a generated TypeScript type. ```typescript interface GeneratedType { name: string; content: string; dependencies: string[]; exports: string[]; isInterface: boolean; isEnum: boolean; isUnion: boolean; sourceSchema: ResolvedSchema; } ``` ### GeneratedApiClient Represents a generated API client. ```typescript interface GeneratedApiClient { name: string; content: string; dependencies: string[]; exports: string[]; endpoints: GeneratedEndpoint[]; } ``` ### GeneratedEndpoint Represents a generated API endpoint. ```typescript interface GeneratedEndpoint { operationId: string; method: string; path: string; parameters: GeneratedParameter[]; requestBody?: GeneratedRequestBody; responses: GeneratedResponse[]; returnType: string; functionName: string; } ``` ### GenerationResult Result of the generation process. ```typescript interface GenerationResult { success: boolean; generatedFiles: GeneratedFile[]; errors: GenerationError[]; warnings: GenerationWarning[]; statistics: GenerationStatistics; } ``` ### GenerationContext Context passed to plugins and generators. ```typescript interface GenerationContext { config: SchemanticConfig; schema: OpenAPISchema; resolvedSchemas: Map<string, ResolvedSchema>; generatedTypes: Map<string, GeneratedType>; generatedClients: Map<string, GeneratedApiClient>; typeRegistry: TypeRegistry; schemaResolver: SchemaResolver; } ``` ## Error Handling ### GenerationError Represents an error during generation. ```typescript interface GenerationError { code: string; message: string; source?: string; line?: number; column?: number; severity: "error" | "warning"; } ``` ### GenerationWarning Represents a warning during generation. ```typescript interface GenerationWarning { code: string; message: string; source?: string; suggestion?: string; } ``` ## Utility Functions ### Built-in Plugins ```typescript import { getBuiltinPlugins, getBuiltinPlugin } from "schemantic"; // Get all built-in plugins const plugins = getBuiltinPlugins(); // Get specific built-in plugin const jsdocPlugin = getBuiltinPlugin("jsdoc"); ``` ### Convenience Functions ```typescript import { createParser, autoCreateParser, createGenerators, generateType, } from "schemantic"; // Create parser const parser = createParser("openapi", config); // Auto-create parser const autoParser = autoCreateParser(input, config); // Create generators const generators = createGenerators(config); // Generate type const type = generateType(schema, context, generators); ```