Skip to content

Commit f1ae872

Browse files
committed
add declaration generator
1 parent 8f4baa2 commit f1ae872

File tree

4 files changed

+53
-0
lines changed

4 files changed

+53
-0
lines changed

src/core/renderers/declaration.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import type { OpenAPI } from "~/core/openapi";
2+
import { type DeclaredOperation, resolveDeclaredOperations } from "~/core/resolvers/declared-operation";
3+
import getTemplate from "~/core/template";
4+
import declarationTemplate from "~/templates/declaration.hbs";
5+
6+
type DeclarationTemplate = {
7+
importedSchemas: string[],
8+
operations: DeclaredOperation[],
9+
};
10+
11+
export default function generateDeclaration(importedSchemas: string[], paths: OpenAPI["paths"]) {
12+
const template = getTemplate<DeclarationTemplate>(declarationTemplate);
13+
return template({
14+
importedSchemas,
15+
operations: resolveDeclaredOperations(paths),
16+
});
17+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import type { OpenAPI, Operation } from "~/core/openapi";
2+
import getContentSchema from "./content";
3+
import resolveEndpoints from "./enpoint";
4+
import { resolveOperationParams } from "./operation-param";
5+
import { resolveSchema } from "./schema-definition";
6+
7+
export type DeclaredOperation = {
8+
name: string,
9+
parameters: string,
10+
result: string,
11+
};
12+
13+
function resolveOperationResult(responses: Operation["responses"]) {
14+
const schemas = Object.values(responses).map(response => {
15+
return response.content ? resolveSchema(getContentSchema(response.content)) : null;
16+
});
17+
return schemas.find(s => typeof s === "string") ?? "unknown";
18+
}
19+
20+
export function resolveDeclaredOperations(paths: OpenAPI["paths"]) {
21+
return resolveEndpoints(paths).map<DeclaredOperation>(({ operation }) => ({
22+
name: operation.operationId,
23+
parameters: resolveOperationParams(operation, true).join(", "),
24+
result: resolveOperationResult(operation.responses),
25+
}));
26+
}

src/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import path from "node:path";
44
import getAppName from "./core/app";
55
import getArgument from "./core/arguments";
66
import createFile from "./core/file";
7+
import generateDeclaration from "./core/renderers/declaration";
78
import generateInterface from "./core/renderers/interface";
89
import generateSchema from "./core/renderers/schema";
910
import { resolveSchemas, resolveSchemasFromProps } from "./core/resolvers/imported-schema";
@@ -37,4 +38,7 @@ import generateSwaggerJson from "./core/swagger";
3738

3839
const content = generateInterface(envName, resolvedPaths);
3940
await createFile(content, "index.js", outputDir);
41+
42+
const declaration = generateDeclaration(schemas, data.paths);
43+
await createFile(declaration, "index.d.ts", outputDir);
4044
})();

src/templates/declaration.hbs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{{#each importedSchemas}}
2+
import type {{this}} from "./schemas/{{this}}";
3+
{{/each}}
4+
{{#each operations}}
5+
export declare function {{name}}({{parameters}}): Promise<{{result}}>;
6+
{{/each}}

0 commit comments

Comments
 (0)