oazapfts
Version:
OpenApi TypeScript client generator
553 lines (464 loc) • 21.5 kB
TypeScript
import { AsyncSeriesBailHook } from 'tapable';
import { AsyncSeriesHook } from 'tapable';
import { AsyncSeriesWaterfallHook } from 'tapable';
import { CustomHeaders } from '@oazapfts/runtime';
import { default as default_2 } from 'typescript';
import { InterfaceDeclaration } from 'typescript';
import { OpenAPIV3 } from 'openapi-types';
import { OpenAPIV3_1 } from 'openapi-types';
import { SourceFile } from 'typescript';
import { Statement } from 'typescript';
import { SyncWaterfallHook } from 'tapable';
import { TypeAliasDeclaration } from 'typescript';
import { TypeReferenceNode } from 'typescript';
declare function addComment<T extends default_2.Node>(node: T, comment?: string): T;
declare function appendNodes<T extends default_2.Node>(array: default_2.NodeArray<T>, ...nodes: T[]): default_2.NodeArray<T>;
declare type ArgumentStyle = (typeof argumentStyleOptions)[number];
declare const argumentStyleOptions: readonly ["positional", "object"];
declare function block(...statements: default_2.Statement[]): default_2.Block;
declare function changePropertyValue(o: default_2.ObjectLiteralExpression, property: string, value: default_2.Expression): void;
declare function createArrowFunction(parameters: default_2.ParameterDeclaration[], body: default_2.ConciseBody, { modifiers, typeParameters, type, equalsGreaterThanToken, }?: {
modifiers?: default_2.Modifier[];
typeParameters?: default_2.TypeParameterDeclaration[];
type?: default_2.TypeNode;
equalsGreaterThanToken?: default_2.EqualsGreaterThanToken;
}): default_2.ArrowFunction;
declare function createCall(expression: default_2.Expression | string, { typeArgs, args, }?: {
typeArgs?: Array<default_2.TypeNode>;
args?: Array<default_2.Expression>;
}): default_2.CallExpression;
declare function createClassDeclaration({ modifiers, name, typeParameters, heritageClauses, members, }: {
modifiers?: Array<default_2.Modifier>;
name?: string | default_2.Identifier;
typeParameters?: Array<default_2.TypeParameterDeclaration>;
heritageClauses?: Array<default_2.HeritageClause>;
members: Array<default_2.ClassElement>;
}): default_2.ClassDeclaration;
declare function createConstructor({ modifiers, parameters, body, }: {
modifiers?: Array<default_2.Modifier>;
parameters: Array<default_2.ParameterDeclaration>;
body?: default_2.Block;
}): default_2.ConstructorDeclaration;
declare function createEnumTypeNode(values: Array<string | boolean | number>): default_2.LiteralTypeNode | default_2.UnionTypeNode;
declare function createFunctionDeclaration(name: string | default_2.Identifier | undefined, { modifiers, asteriskToken, typeParameters, type, }: {
modifiers?: default_2.Modifier[];
asteriskToken?: default_2.AsteriskToken;
typeParameters?: default_2.TypeParameterDeclaration[];
type?: default_2.TypeNode;
}, parameters: default_2.ParameterDeclaration[], body?: default_2.Block): default_2.FunctionDeclaration;
declare function createIndexSignature(type: default_2.TypeNode, { modifiers, indexName, indexType, }?: {
indexName?: string;
indexType?: default_2.TypeNode;
modifiers?: Array<default_2.Modifier>;
}): default_2.IndexSignatureDeclaration;
declare function createInterfaceAliasDeclaration({ modifiers, name, typeParameters, type, inheritedNodeNames, }: {
modifiers?: Array<default_2.Modifier>;
name: string | default_2.Identifier;
typeParameters?: Array<default_2.TypeParameterDeclaration>;
type: default_2.TypeNode;
inheritedNodeNames?: (string | default_2.Identifier)[];
}): default_2.InterfaceDeclaration;
declare function createKeywordType(type: KeywordTypeName): default_2.KeywordTypeNode<default_2.SyntaxKind.AnyKeyword> | default_2.KeywordTypeNode<default_2.SyntaxKind.NumberKeyword> | default_2.KeywordTypeNode<default_2.SyntaxKind.ObjectKeyword> | default_2.KeywordTypeNode<default_2.SyntaxKind.StringKeyword> | default_2.KeywordTypeNode<default_2.SyntaxKind.BooleanKeyword> | default_2.KeywordTypeNode<default_2.SyntaxKind.UndefinedKeyword> | default_2.KeywordTypeNode<default_2.SyntaxKind.VoidKeyword> | default_2.KeywordTypeNode<default_2.SyntaxKind.NeverKeyword> | default_2.LiteralTypeNode | default_2.KeywordTypeNode<default_2.SyntaxKind.UnknownKeyword>;
declare function createLiteral(v: string | boolean | number): default_2.StringLiteral | default_2.TrueLiteral | default_2.FalseLiteral | default_2.NumericLiteral | default_2.PrefixUnaryExpression;
declare function createMethod(name: string | default_2.Identifier | default_2.StringLiteral | default_2.NumericLiteral | default_2.ComputedPropertyName, { modifiers, asteriskToken, questionToken, typeParameters, type, }?: {
modifiers?: default_2.Modifier[];
asteriskToken?: default_2.AsteriskToken;
questionToken?: default_2.QuestionToken | boolean;
typeParameters?: default_2.TypeParameterDeclaration[];
type?: default_2.TypeNode;
}, parameters?: default_2.ParameterDeclaration[], body?: default_2.Block): default_2.MethodDeclaration;
declare function createMethodCall(method: string, opts: {
typeArgs?: Array<default_2.TypeNode>;
args?: Array<default_2.Expression>;
}): default_2.CallExpression;
declare function createObjectBinding(elements: Array<{
name: string | default_2.BindingName;
dotDotDotToken?: default_2.DotDotDotToken;
propertyName?: string | default_2.PropertyName;
initializer?: default_2.Expression;
}>): default_2.ObjectBindingPattern;
declare function createObjectLiteral(props: [string, string | default_2.Expression][]): default_2.ObjectLiteralExpression;
declare function createParameter(name: string | default_2.BindingName, { modifiers, dotDotDotToken, questionToken, type, initializer, }: {
modifiers?: Array<default_2.Modifier>;
dotDotDotToken?: default_2.DotDotDotToken;
questionToken?: default_2.QuestionToken | boolean;
type?: default_2.TypeNode;
initializer?: default_2.Expression;
}): default_2.ParameterDeclaration;
declare function createPropertyAssignment(name: string, expression: default_2.Expression): default_2.PropertyAssignment | default_2.ShorthandPropertyAssignment;
declare function createPropertySignature({ modifiers, name, questionToken, type, }: {
modifiers?: Array<default_2.Modifier>;
name: default_2.PropertyName | string;
questionToken?: default_2.QuestionToken | boolean;
type?: default_2.TypeNode;
}): default_2.PropertySignature;
declare function createQuestionToken(token?: boolean | default_2.QuestionToken): default_2.QuestionToken | undefined;
declare function createTemplateString(head: string, spans: Array<{
literal: string;
expression: default_2.Expression;
}>): default_2.StringLiteral | default_2.TemplateExpression;
declare function createTypeAliasDeclaration({ modifiers, name, typeParameters, type, }: {
modifiers?: Array<default_2.Modifier>;
name: string | default_2.Identifier;
typeParameters?: Array<default_2.TypeParameterDeclaration>;
type: default_2.TypeNode;
}): default_2.TypeAliasDeclaration;
declare type DefaultImport = [string, {
from: string;
}];
declare type Defaults = {
baseUrl?: string;
headers?: CustomHeaders;
FormData?: default_2.ClassExpression | default_2.Identifier;
fetch?: default_2.FunctionExpression | default_2.ArrowFunction | default_2.Identifier;
};
declare type DiscriminatorObject = OpenAPIV3.DiscriminatorObject | OpenAPIV3_1.DiscriminatorObject;
declare type Document_2 = OpenAPIV3.Document | OpenAPIV3_1.Document;
declare type EnumStyle = (typeof enumStyleOptions)[number];
declare const enumStyleOptions: readonly ["union", "enum", "as-const"];
declare function findFirstVariableDeclaration(nodes: default_2.NodeArray<default_2.Node>, name: string): default_2.VariableDeclaration;
declare function findNode<T extends default_2.Node>(nodes: default_2.NodeArray<default_2.Node>, kind: T extends {
kind: infer K;
} ? K : never, test?: (node: T) => boolean | undefined): T;
/**
* Create an Typescript AST from an OpenAPI document.
*
* @param ctx - Oazapfts context
* @param UNSTABLE_plugins - Unstable plugins to apply
* @returns The generated TypeScript AST
*/
export declare function generateAst(ctx: OazapftsContext, UNSTABLE_plugins?: UNSTABLE_OazapftsPlugin[]): Promise<SourceFile>;
/**
* Create a a TypeScript source file from an OpenAPI spec.
*
* @param spec - Path to an OpenAPI spec file or source string
* @param opts - Options for the code generation
* @returns The generated TypeScript source file
*/
declare function generateSource(spec: string, opts?: OazapftsOptions): Promise<string>;
export default generateSource;
export { generateSource }
export { generateSource as oazapfts }
declare function getFirstDeclarationName(n: default_2.VariableStatement): string | (void & {
__escapedIdentifier: void;
});
declare function getName(name: default_2.Node): string | (void & {
__escapedIdentifier: void;
});
declare type HttpMethod = (typeof HttpMethods)[number];
declare const HttpMethods: readonly ["GET", "PUT", "POST", "DELETE", "OPTIONS", "HEAD", "PATCH", "TRACE"];
declare type Import = string | ImportsWithoutDefault | DefaultImport | ImportWithDefault | NamespaceImport;
declare type ImportSpecifier = {
name: string;
as?: string;
};
declare type ImportsWithoutDefault = [
(ImportSpecifier | string)[],
{
from: string;
}
];
declare type ImportWithDefault = [
string,
(ImportSpecifier | string)[],
{
from: string;
}
];
declare function isValidIdentifier(str: string): boolean;
declare const keywordType: {
any: default_2.KeywordTypeNode<default_2.SyntaxKind.AnyKeyword>;
number: default_2.KeywordTypeNode<default_2.SyntaxKind.NumberKeyword>;
integer: default_2.KeywordTypeNode<default_2.SyntaxKind.NumberKeyword>;
object: default_2.KeywordTypeNode<default_2.SyntaxKind.ObjectKeyword>;
string: default_2.KeywordTypeNode<default_2.SyntaxKind.StringKeyword>;
boolean: default_2.KeywordTypeNode<default_2.SyntaxKind.BooleanKeyword>;
undefined: default_2.KeywordTypeNode<default_2.SyntaxKind.UndefinedKeyword>;
void: default_2.KeywordTypeNode<default_2.SyntaxKind.VoidKeyword>;
never: default_2.KeywordTypeNode<default_2.SyntaxKind.NeverKeyword>;
null: default_2.LiteralTypeNode;
unknown: default_2.KeywordTypeNode<default_2.SyntaxKind.UnknownKeyword>;
};
declare type KeywordTypeName = keyof typeof keywordType;
declare type MediaTypeObject = OpenAPIV3.MediaTypeObject | OpenAPIV3_1.MediaTypeObject;
declare const modifier: {
async: default_2.ModifierToken<default_2.SyntaxKind.AsyncKeyword>;
export: default_2.ModifierToken<default_2.SyntaxKind.ExportKeyword>;
};
declare type NamespaceImport = [{
namespace: string;
}, {
from: string;
}];
declare type OazapftsContext = {
readonly opts: ReadonlyDeep<OazapftsOptions>;
readonly spec: Document_2;
readonly mode?: OnlyMode;
/** Banner comment at the top of the file (the text content, not including comment markers) */
banner: string;
/** Import declarations (AST nodes) */
imports: Import[];
/** Runtime defaults (baseUrl, etc.) - will be generated as `export const defaults = { ... }` */
defaults: Defaults;
/** Server definitions - will be generated as `export const servers = { ... }` */
servers: ServerObject[];
/** Initialization statements (e.g., `const oazapfts = Oazapfts.runtime(defaults)`) */
init: Statement[];
discriminatingSchemas: Set<SchemaObject>;
aliases: (TypeAliasDeclaration | InterfaceDeclaration)[];
enumAliases: Statement[];
enumRefs: Record<string, {
values: string;
type: TypeReferenceNode;
}>;
refs: Record<string, {
base: TypeReferenceNode;
readOnly?: TypeReferenceNode;
writeOnly?: TypeReferenceNode;
}>;
refsOnlyMode: Map<string, OnlyModes>;
typeAliases: Record<string, number>;
operationNames: Map<string, number>;
};
export declare type OazapftsOptions = {
include?: string[];
exclude?: string[];
optimistic?: boolean;
unionUndefined?: boolean;
/**
* @deprecated Use `enumStyle: "enum"` instead.
*/
useEnumType?: boolean;
/**
* Controls how enums are generated in TypeScript.
* Takes precedence over `useEnumType` if both are specified.
*/
enumStyle?: EnumStyle;
mergeReadWriteOnly?: boolean;
useUnknown?: boolean;
argumentStyle?: ArgumentStyle;
allSchemas?: boolean;
/**
* When true, serialize boolean query parameters as 1/0.
*/
numericBooleanQueryParameters?: boolean;
/**
* When true, skip generating deprecated legacy method aliases for backward
* compatibility. Only the primary normalized operationId-based names will
* be generated.
*/
futureStripLegacyMethods?: boolean;
/**
* Plugins to apply during code generation.
* Each plugin receives hooks and can tap into generation steps.
*/
UNSTABLE_plugins?: UNSTABLE_OazapftsPlugin[];
};
declare type OnlyMode = "readOnly" | "writeOnly";
declare type OnlyModes = Record<OnlyMode, boolean>;
declare namespace OpenAPI {
export {
SchemaObject,
UNSTABLE_DiscriminatingSchemaObject,
ReferenceObject,
ParameterObject,
Document_2 as Document,
DiscriminatorObject,
ResponseObject,
ResponsesObject,
RequestBodyObject,
MediaTypeObject,
OperationObject,
PathsObject,
PathItemObject,
ServerObject
}
}
export { OpenAPI }
declare type OperationObject = OpenAPIV3.OperationObject | OpenAPIV3_1.OperationObject;
declare type ParameterObject = OpenAPIV3.ParameterObject | OpenAPIV3_1.ParameterObject;
/**
* Parse an OpenAPI spec into a document object.
*
* @param spec - Path to a local OpenAPI spec file,
* or a URL to an OpenAPI spec file
* or a OpenAPI document object
* @returns The parsed OpenAPI document
*/
export declare function parseSpec(spec: string | OpenAPI.Document): Promise<OpenAPIV3< {}> | OpenAPIV3_1< {}>>;
declare type PathItemObject = OpenAPIV3.PathItemObject | OpenAPIV3_1.PathItemObject;
declare type PathsObject = OpenAPIV3.PathsObject | OpenAPIV3_1.PathsObject;
/**
* Print a TypeScript AST to a string.
*
* @param ast - The TypeScript AST to print
* @returns The printed TypeScript source
*/
export declare function printAst(ast: SourceFile): string;
declare function printFile(sourceFile: default_2.SourceFile): string;
declare function printNode(node: default_2.Node): string;
declare function printNodes(nodes: default_2.Node[]): string;
declare const questionToken: default_2.PunctuationToken<default_2.SyntaxKind.QuestionToken>;
declare type ReadonlyDeep<T> = {
readonly [P in keyof T]: ReadonlyDeep<T[P]>;
};
declare type ReferenceObject = OpenAPIV3.ReferenceObject | OpenAPIV3_1.ReferenceObject;
declare type RequestBodyObject = OpenAPIV3.RequestBodyObject | OpenAPIV3_1.RequestBodyObject;
declare type ResponseObject = OpenAPIV3.ResponseObject | OpenAPIV3_1.ResponseObject;
declare type ResponsesObject = OpenAPIV3.ResponsesObject | OpenAPIV3_1.ResponsesObject;
declare type SchemaObject = OpenAPIV3.SchemaObject | OpenAPIV3_1.SchemaObject | boolean;
declare type ServerObject = OpenAPIV3.ServerObject | OpenAPIV3_1.ServerObject;
declare function toExpression(ex: default_2.Expression | string): default_2.Expression;
declare function transform<T extends default_2.Node>(source: T, ...visitors: Visitor[]): T;
declare namespace UNSTABLE_cg {
export {
createQuestionToken,
createKeywordType,
createLiteral,
createEnumTypeNode,
createTypeAliasDeclaration,
createInterfaceAliasDeclaration,
toExpression,
createCall,
createMethodCall,
createObjectLiteral,
createPropertyAssignment,
block,
createArrowFunction,
createFunctionDeclaration,
createClassDeclaration,
createConstructor,
createMethod,
createParameter,
createPropertySignature,
createIndexSignature,
createObjectBinding,
createTemplateString,
findNode,
getName,
getFirstDeclarationName,
findFirstVariableDeclaration,
changePropertyValue,
transform,
appendNodes,
addComment,
printNode,
printNodes,
printFile,
isValidIdentifier,
updateVariableDeclaration,
updateFunctionDeclaration,
questionToken,
keywordType,
modifier
}
}
export { UNSTABLE_cg }
declare type UNSTABLE_ComposeSourceHookArgs = [OazapftsContext, default_2.Statement[]];
declare type UNSTABLE_DiscriminatingSchemaObject = Exclude<SchemaObject, boolean> & {
discriminator: NonNullable<Exclude<SchemaObject, boolean>["discriminator"]>;
};
declare type UNSTABLE_EndpointHookArgs = [
{
method: HttpMethod;
path: string;
operation: OpenAPI.OperationObject;
pathItem: OpenAPI.PathItemObject;
},
OazapftsContext
];
declare enum UNSTABLE_OAZAPFTS_PLUGIN_PRECEDENCE {
EAGER = "eager",
DEFAULT = "default",
LAZY = "lazy"
}
declare type UNSTABLE_OazapftsPlugin = UNSTABLE_OazapftsPluginFn & UNSTABLE_OazapftsPluginOptions;
/**
* A plugin initiator function that receives hooks and can tap into them.
*/
declare type UNSTABLE_OazapftsPluginFn = (hooks: UNSTABLE_OazapftsPluginHooks) => void | Promise<void>;
declare type UNSTABLE_OazapftsPluginHooks = {
/**
* Called after context is created with all template parts initialized.
* Use this to modify the spec, context, or template parts.
* This is the only hook where ctx.spec is mutable.
*/
prepare: AsyncSeriesHook<[OazapftsContext]>;
/**
* Decide whether a given endpoint should be generated.
* Receives the current decision (default true) as first argument.
* Return false to skip endpoint generation.
*/
filterEndpoint: SyncWaterfallHook<[
boolean,
{
method: HttpMethod;
path: string;
operation: OpenAPI.OperationObject;
pathItem: OpenAPI.PathItemObject;
},
OazapftsContext
]>;
/**
* Generate client methods for an endpoint.
* This is a bail hook: the first plugin that returns a value wins.
* Return `undefined` to delegate to later plugins.
*/
generateMethod: AsyncSeriesBailHook<UNSTABLE_EndpointHookArgs, default_2.Statement[] | undefined>;
/**
* Refine client methods for an endpoint.
* Receives generated methods and can return a modified array.
* Runs after generateMethod for each endpoint.
*/
refineMethod: AsyncSeriesWaterfallHook<[
default_2.Statement[],
...UNSTABLE_EndpointHookArgs
]>;
/**
* Compose top-level source statements from context and generated methods.
* This is a bail hook: the first plugin that returns a value wins.
* Return `undefined` to delegate to later plugins.
*/
composeSource: AsyncSeriesBailHook<UNSTABLE_ComposeSourceHookArgs, default_2.Statement[] | undefined>;
/**
* Refine top-level source statements before SourceFile construction.
* Receives composed statements and can return a modified array.
* Runs after composeSource.
*/
refineSource: AsyncSeriesWaterfallHook<[
default_2.Statement[],
...UNSTABLE_ComposeSourceHookArgs
]>;
/**
* Customize query serializer call arguments for each formatter call.
* Default behavior is identity (returns the original args unchanged).
*/
querySerializerArgs: SyncWaterfallHook<UNSTABLE_QuerySerializerHookArgs>;
/**
* Called after the full AST has been generated, before printing to string.
* Use this to add/modify/remove statements from the final source file.
*/
astGenerated: AsyncSeriesWaterfallHook<[default_2.SourceFile, OazapftsContext]>;
};
declare type UNSTABLE_OazapftsPluginOptions = {
name?: string;
version?: string;
precedence?: UNSTABLE_OAZAPFTS_PLUGIN_PRECEDENCE;
};
declare type UNSTABLE_QuerySerializerHookArgs = [
default_2.Expression[],
{
method: HttpMethod;
path: string;
operation: OpenAPI.OperationObject;
pathItem: OpenAPI.PathItemObject;
formatter: string;
parameters: OpenAPI.ParameterObject[];
query: OpenAPI.ParameterObject[];
},
OazapftsContext
];
declare function updateFunctionDeclaration(node: default_2.FunctionDeclaration, updates: Partial<default_2.FunctionDeclaration>): default_2.FunctionDeclaration;
declare function updateVariableDeclaration(node: default_2.VariableDeclaration, updates: Partial<default_2.VariableDeclaration>): default_2.VariableDeclaration;
declare type Visitor = (node: default_2.Node, context: default_2.TransformationContext) => void | default_2.Node;
export { }