Skip to content

Commit 7c9296a

Browse files
committed
Add lib function for generate file data
1 parent 4636923 commit 7c9296a

10 files changed

Lines changed: 68 additions & 82 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@povio/openapi-codegen-cli",
3-
"version": "0.4.0",
3+
"version": "0.4.1",
44
"main": "./dist/index.js",
55
"bin": {
66
"openapi-codegen": "./dist/sh.js"

src/generators/checkOpenAPIDoc.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { getDataFromOpenAPIDoc } from "./core/getDataFromOpenAPIDoc";
66
import { GenerateType } from "./types/generate";
77
import { GenerateOptions } from "./types/options";
88
import { ValidationErrorType } from "./types/validation";
9-
import { getFileName } from "./utils/file.utils";
9+
import { getOutputFileName } from "./utils/file.utils";
1010
import { getTagFileName } from "./utils/generate/generate.utils";
1111
import { groupByType } from "./utils/validation.utils";
1212

@@ -25,16 +25,16 @@ export function checkOpenAPIDoc(openApiDoc: OpenAPIV3.Document, cliOptions?: Par
2525
} else {
2626
const outputs = [...data.keys()].reduce((acc, tag) => {
2727
const excludedTag = options.excludeTags.find((excludeTag) => excludeTag.toLowerCase() === tag.toLowerCase());
28-
return excludedTag ? acc : [...acc, ...getTagOutputFileNames(tag, options)];
28+
return excludedTag ? acc : [...acc, ...getOutputFileNames(tag, options)];
2929
}, [] as string[]);
3030
console.log(`${chk.green("Outputs:")}\n${outputs.map((output) => `- ${output}`).join("\n")}\n`);
3131
}
3232

3333
return resolver.validationErrors;
3434
}
3535

36-
function getTagOutputFileNames(tag: string, options: GenerateOptions) {
36+
function getOutputFileNames(tag: string, options: GenerateOptions) {
3737
return [GenerateType.Models, GenerateType.Endpoints, GenerateType.Queries].map((type) =>
38-
getFileName({ output: options.output, fileName: getTagFileName({ tag, type, options }) }),
38+
getOutputFileName({ output: options.output, fileName: getTagFileName({ tag, type, options }) }),
3939
);
4040
}

src/generators/generate/generateEndpoints.ts

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,14 @@
11
import { REST_CLIENT_IMPORT, REST_CLIENT_NAME } from "../const/template.const";
22
import { ZOD_IMPORT } from "../const/zod.const";
3-
import { SchemaResolver } from "../core/SchemaResolver.class";
43
import { EndpointParameter } from "../types/endpoint";
5-
import { GenerateData, GenerateType } from "../types/generate";
4+
import { GenerateType, GenerateTypeParams } from "../types/generate";
65
import { getUniqueArray } from "../utils/array.utils";
76
import { getModelsImports } from "../utils/generate/generate.imports.utils";
87
import { getNamespaceName } from "../utils/generate/generate.utils";
98
import { getHbsTemplateDelegate } from "../utils/hbs/hbs-template.utils";
109
import { isNamedZodSchema } from "../utils/zod-schema.utils";
1110

12-
export function generateEndpoints({
13-
resolver,
14-
data,
15-
tag = "",
16-
}: {
17-
resolver: SchemaResolver;
18-
data: GenerateData;
19-
tag?: string;
20-
}) {
11+
export function generateEndpoints({ resolver, data, tag = "" }: GenerateTypeParams) {
2112
const endpoints = data.get(tag)?.endpoints;
2213
if (!endpoints || endpoints.length === 0) {
2314
return;

src/generators/generate/generateModels.ts

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,11 @@
11
import { ZOD_IMPORT } from "../const/zod.const";
2-
import { SchemaResolver } from "../core/SchemaResolver.class";
32
import { getZodSchemaRefs } from "../core/zod/getZodSchemaRefs";
4-
import { GenerateData, GenerateType } from "../types/generate";
3+
import { GenerateType, GenerateTypeParams } from "../types/generate";
54
import { getModelsImports } from "../utils/generate/generate.imports.utils";
65
import { getNamespaceName } from "../utils/generate/generate.utils";
76
import { getHbsTemplateDelegate } from "../utils/hbs/hbs-template.utils";
87

9-
export function generateModels({
10-
resolver,
11-
data,
12-
tag = "",
13-
}: {
14-
resolver: SchemaResolver;
15-
data: GenerateData;
16-
tag?: string;
17-
}) {
8+
export function generateModels({ resolver, data, tag = "" }: GenerateTypeParams) {
189
const zodSchemas = data.get(tag)?.zodSchemas;
1910
if (!zodSchemas || Object.keys(zodSchemas).length === 0) {
2011
return;

src/generators/generate/generateQueries.ts

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,15 @@
11
import { QUERY_HOOKS, QUERY_IMPORT } from "../const/query.const";
22
import { QUERY_OPTIONS_TYPES, QUERY_TYPES_IMPORT } from "../const/template.const";
3-
import { SchemaResolver } from "../core/SchemaResolver.class";
43
import { EndpointParameter } from "../types/endpoint";
5-
import { GenerateData, GenerateType, Import } from "../types/generate";
4+
import { GenerateType, GenerateTypeParams, Import } from "../types/generate";
65
import { getUniqueArray } from "../utils/array.utils";
76
import { getEndpointsImports, getModelsImports } from "../utils/generate/generate.imports.utils";
87
import { getNamespaceName } from "../utils/generate/generate.utils";
98
import { getHbsTemplateDelegate } from "../utils/hbs/hbs-template.utils";
109
import { isMutation, isQuery } from "../utils/queries.utils";
1110
import { isNamedZodSchema } from "../utils/zod-schema.utils";
1211

13-
export function generateQueries({
14-
resolver,
15-
data,
16-
tag = "",
17-
}: {
18-
resolver: SchemaResolver;
19-
data: GenerateData;
20-
tag?: string;
21-
}) {
12+
export function generateQueries({ resolver, data, tag = "" }: GenerateTypeParams) {
2213
const endpoints = data.get(tag)?.endpoints;
2314
if (!endpoints || endpoints.length === 0) {
2415
return;
Lines changed: 28 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,52 @@
11
import { OpenAPIV3 } from "openapi-types";
22
import { DEFAULT_GENERATE_OPTIONS } from "./const/options.const";
33
import { getDataFromOpenAPIDoc } from "./core/getDataFromOpenAPIDoc";
4-
import { SchemaResolver } from "./core/SchemaResolver.class";
54
import { generateEndpoints } from "./generate/generateEndpoints";
65
import { generateModels } from "./generate/generateModels";
76
import { generateQueries } from "./generate/generateQueries";
8-
import { GenerateData, GenerateType } from "./types/generate";
7+
import { GenerateFileData, GenerateType, GenerateTypeParams } from "./types/generate";
98
import { GenerateOptions } from "./types/options";
10-
import { writeTsFileSync } from "./utils/file.utils";
9+
import { getOutputFileName, writeTsFileSync } from "./utils/file.utils";
1110
import { getTagFileName } from "./utils/generate/generate.utils";
1211

13-
export function generateCodeFromOpenAPIDoc(openApiDoc: OpenAPIV3.Document, cliOptions?: Partial<GenerateOptions>) {
12+
export function generateCodeFromOpenAPIDoc(
13+
openApiDoc: OpenAPIV3.Document,
14+
cliOptions: Partial<GenerateOptions>,
15+
writeFiles = true,
16+
) {
1417
const options = { ...DEFAULT_GENERATE_OPTIONS, ...cliOptions } as GenerateOptions;
1518

1619
const { resolver, data } = getDataFromOpenAPIDoc(openApiDoc, options);
1720

21+
const generateFilesData: GenerateFileData[] = [];
22+
const generateTypes = [GenerateType.Models, GenerateType.Endpoints, GenerateType.Queries];
23+
const generateFunctions: Record<GenerateType, (params: GenerateTypeParams) => string | undefined> = {
24+
[GenerateType.Models]: generateModels,
25+
[GenerateType.Endpoints]: generateEndpoints,
26+
[GenerateType.Queries]: generateQueries,
27+
};
28+
1829
data.forEach((_, tag) => {
1930
const excludedTag = options.excludeTags.find((excludeTag) => excludeTag.toLowerCase() === tag.toLowerCase());
2031
if (excludedTag) {
2132
return;
2233
}
2334

24-
generateCodeByType({ resolver, data, type: GenerateType.Models, tag });
25-
generateCodeByType({ resolver, data, type: GenerateType.Endpoints, tag });
26-
generateCodeByType({ resolver, data, type: GenerateType.Queries, tag });
35+
generateTypes.forEach((type) => {
36+
const content = generateFunctions[type]({ resolver, data, tag });
37+
if (content) {
38+
const fileName = getOutputFileName({
39+
output: options.output,
40+
fileName: getTagFileName({ tag, type, options }),
41+
});
42+
generateFilesData.push({ fileName, content });
43+
}
44+
});
2745
});
28-
}
2946

30-
function generateCodeByType({
31-
resolver,
32-
data,
33-
type,
34-
tag,
35-
}: {
36-
resolver: SchemaResolver;
37-
data: GenerateData;
38-
type: GenerateType;
39-
tag: string;
40-
}) {
41-
let code: string | undefined;
42-
43-
switch (type) {
44-
case GenerateType.Models:
45-
code = generateModels({ resolver, data, tag });
46-
break;
47-
case GenerateType.Endpoints:
48-
code = generateEndpoints({ resolver, data, tag });
49-
break;
50-
case GenerateType.Queries:
51-
code = generateQueries({ resolver, data, tag });
52-
break;
47+
if (writeFiles) {
48+
generateFilesData.forEach(writeTsFileSync);
5349
}
5450

55-
if (code) {
56-
writeTsFileSync({
57-
output: resolver.options.output,
58-
fileName: getTagFileName({ tag, type, options: resolver.options }),
59-
data: code,
60-
});
61-
}
51+
return generateFilesData;
6252
}

src/generators/types/generate.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { SchemaResolver } from "../core/SchemaResolver.class";
12
import { Endpoint } from "./endpoint";
23

34
export interface Import {
@@ -18,3 +19,14 @@ export type GenerateData = Map<
1819
zodSchemas: Record<string, string>;
1920
}
2021
>;
22+
23+
export interface GenerateTypeParams {
24+
resolver: SchemaResolver;
25+
data: GenerateData;
26+
tag?: string;
27+
}
28+
29+
export interface GenerateFileData {
30+
fileName: string;
31+
content: string;
32+
}

src/generators/types/metadata.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { OpenAPIV3 } from "openapi-types";
22
import { GenerateOptions } from "./options";
33

4-
export interface GenerateMetadataParams {
4+
export interface GenerateParams {
55
input: string;
66
options?: Partial<GenerateOptions>;
77
}

src/generators/utils/file.utils.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import fs from "fs";
22
import path from "path";
3+
import { GenerateFileData } from "../types/generate";
34

45
export function readHbsTemplateSync(fileName: string) {
56
const templatePath = `src/generators/templates/${fileName}.hbs`;
@@ -11,12 +12,12 @@ export function readHbsTemplateSync(fileName: string) {
1112
return fs.readFileSync(templatePath, "utf-8");
1213
}
1314

14-
export function getFileName({ output, fileName }: { output: string; fileName: string }) {
15+
export function getOutputFileName({ output, fileName }: { output: string; fileName: string }) {
1516
return `${output}/${fileName}.ts`;
1617
}
1718

18-
export function writeTsFileSync({ output, fileName, data }: { output: string; fileName: string; data: string }) {
19-
writeFileWithDirSync(getFileName({ output, fileName }), data);
19+
export function writeTsFileSync({ fileName, content }: GenerateFileData) {
20+
writeFileWithDirSync(fileName, content);
2021
}
2122

2223
function writeFileWithDirSync(file: string, data: string) {

src/index.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,25 @@ import SwaggerParser from "@apidevtools/swagger-parser";
22
import { OpenAPIV3 } from "openapi-types";
33
import { DEFAULT_GENERATE_OPTIONS } from "./generators/const/options.const";
44
import { getMetadataFromOpenAPIDoc } from "./generators/core/getMetadataFromOpenAPIDoc";
5-
import { GenerateMetadataParams } from "./generators/types/metadata";
5+
import { generateCodeFromOpenAPIDoc } from "./generators/generateCodeFromOpenAPIDoc";
6+
import { GenerateParams } from "./generators/types/metadata";
67
import { GenerateOptions } from "./generators/types/options";
78

8-
export async function getGenerateMetadata({ input, options: genOptions }: GenerateMetadataParams) {
9+
export async function getGenerateMetadata({ input, options: genOptions }: GenerateParams) {
910
const options = { ...DEFAULT_GENERATE_OPTIONS, ...genOptions } as GenerateOptions;
1011

1112
const openApiDoc = (await SwaggerParser.bundle(input)) as OpenAPIV3.Document;
1213

1314
return await getMetadataFromOpenAPIDoc(openApiDoc, options);
1415
}
1516

17+
export async function getGenerateFileData({ input, options: genOptions }: GenerateParams) {
18+
const options = { ...DEFAULT_GENERATE_OPTIONS, ...genOptions } as GenerateOptions;
19+
20+
const openApiDoc = (await SwaggerParser.bundle(input)) as OpenAPIV3.Document;
21+
22+
return generateCodeFromOpenAPIDoc(openApiDoc, options, false);
23+
}
24+
25+
export { GenerateFileData } from "./generators/types/generate";
1626
export * from "./generators/types/metadata";

0 commit comments

Comments
 (0)