Skip to content

Commit 10d4857

Browse files
authored
feat: functional api client (#99)
BREAKING CHANGE: `Templates.ApiClient.generator` -> `Templates.ClassApiClient.generator`
1 parent 60992f9 commit 10d4857

File tree

111 files changed

+64193
-446
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

111 files changed

+64193
-446
lines changed

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ import type * as Types from "@himenon/openapi-typescript-code-generator/types";
5858
const main = () => {
5959
const codeGenerator = new CodeGenerator("your/openapi/spec.yml");
6060

61-
const apiClientGeneratorTemplate: Types.CodeGenerator.CustomGenerator<Templates.ApiClient.Option> = {
62-
generator: Templates.ApiClient.generator,
61+
const apiClientGeneratorTemplate: Types.CodeGenerator.CustomGenerator<Templates.FunctionalApiClient.Option> = {
62+
generator: Templates.FunctionalApiClient.generator,
6363
option: {},
6464
};
6565

@@ -86,8 +86,8 @@ import type * as Types from "@himenon/openapi-typescript-code-generator/types";
8686
const main = () => {
8787
const codeGenerator = new CodeGenerator("your/openapi/spec.yml");
8888

89-
const apiClientGeneratorTemplate: Types.CodeGenerator.CustomGenerator<Templates.ApiClient.Option> = {
90-
generator: Templates.ApiClient.generator,
89+
const apiClientGeneratorTemplate: Types.CodeGenerator.CustomGenerator<Templates.FunctionalApiClient.Option> = {
90+
generator: Templates.FunctionalApiClient.generator,
9191
option: {},
9292
};
9393

@@ -304,7 +304,7 @@ It provides parameters extracted from OpenAPI Schema.
304304

305305
#### getAdditionalTypeDefinitionCustomCodeGenerator
306306

307-
This is a type definition file for `Templates.ApiClient`. The reason it is not included in `generateTypeDefinition` is that you may not use the type definition generated by this function depending on your usage.
307+
This is a type definition file for `Templates.FunctionalApiClient`. The reason it is not included in `generateTypeDefinition` is that you may not use the type definition generated by this function depending on your usage.
308308

309309
※ The reason it is not included in `generateTypeDefinition` is that you may not use the type definitions generated by this function depending on your application.
310310

docs/ja/README-ja.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ import type * as Types from "@himenon/openapi-typescript-code-generator/types";
5252
const main = () => {
5353
const codeGenerator = new CodeGenerator("your/openapi/spec.yml");
5454

55-
const apiClientGeneratorTemplate: Types.CodeGenerator.CustomGenerator<Templates.ApiClient.Option> = {
56-
generator: Templates.ApiClient.generator,
55+
const apiClientGeneratorTemplate: Types.CodeGenerator.CustomGenerator<Templates.FunctionalApiClient.Option> = {
56+
generator: Templates.FunctionalApiClient.generator,
5757
option: {},
5858
};
5959

@@ -80,8 +80,8 @@ import type * as Types from "@himenon/openapi-typescript-code-generator/types";
8080
const main = () => {
8181
const codeGenerator = new CodeGenerator("your/openapi/spec.yml");
8282

83-
const apiClientGeneratorTemplate: Types.CodeGenerator.CustomGenerator<Templates.ApiClient.Option> = {
84-
generator: Templates.ApiClient.generator,
83+
const apiClientGeneratorTemplate: Types.CodeGenerator.CustomGenerator<Templates.FunctionalApiClient.Option> = {
84+
generator: Templates.FunctionalApiClient.generator,
8585
option: {},
8686
};
8787

@@ -298,7 +298,7 @@ OpenAPI Schema から抽出したパラメーターを取得できます。
298298

299299
#### getAdditionalTypeDefinitionCustomCodeGenerator
300300

301-
`Templates.ApiClient`向けの型定義ファイルです。`generateTypeDefinition`に含めていない理由は、用途によってこの関数が生成する型定義を利用しない可能性があるためです。
301+
`Templates.FunctionalApiClient`向けの型定義ファイルです。`generateTypeDefinition`に含めていない理由は、用途によってこの関数が生成する型定義を利用しない可能性があるためです。
302302

303303
※ 将来的に`Templates`の API に移動する予定です。
304304

example/codegen.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import * as Types from "../lib/types"; // = @himenon/openapi-typescript-code-gen
77
const main = () => {
88
const codeGenerator = new CodeGenerator("./spec/openapi.yml");
99
codeGenerator.validateOpenApiSchema({ logger: { displayLogLines: 1 } });
10-
const apiClientGeneratorTemplate: Types.CodeGenerator.CustomGenerator<Templates.ApiClient.Option> = {
11-
generator: Templates.ApiClient.generator,
10+
const apiClientGeneratorTemplate: Types.CodeGenerator.CustomGenerator<Templates.FunctionalApiClient.Option> = {
11+
generator: Templates.FunctionalApiClient.generator,
1212
option: {},
1313
};
1414

example/readme-sample/split-typedef-and-api-client.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import type * as Types from "@himenon/openapi-typescript-code-generator/types";
77
const main = () => {
88
const codeGenerator = new CodeGenerator("your/openapi/spec.yml");
99

10-
const apiClientGeneratorTemplate: Types.CodeGenerator.CustomGenerator<Templates.ApiClient.Option> = {
11-
generator: Templates.ApiClient.generator,
10+
const apiClientGeneratorTemplate: Types.CodeGenerator.CustomGenerator<Templates.FunctionalApiClient.Option> = {
11+
generator: Templates.FunctionalApiClient.generator,
1212
option: {},
1313
};
1414

example/readme-sample/typedef-and-api-client.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import type * as Types from "@himenon/openapi-typescript-code-generator/types";
77
const main = () => {
88
const codeGenerator = new CodeGenerator("your/openapi/spec.yml");
99

10-
const apiClientGeneratorTemplate: Types.CodeGenerator.CustomGenerator<Templates.ApiClient.Option> = {
11-
generator: Templates.ApiClient.generator,
10+
const apiClientGeneratorTemplate: Types.CodeGenerator.CustomGenerator<Templates.FunctionalApiClient.Option> = {
11+
generator: Templates.FunctionalApiClient.generator,
1212
option: {},
1313
};
1414

package.json

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,16 @@
4040
"scripts": {
4141
"build": "pnpm ts ./scripts/build.ts",
4242
"clean": "pnpm ts ./scripts/clean.ts",
43+
"format": "run-s format:code format:code:eslint",
4344
"format:code": "prettier \"**/*.{js,jsx,ts,tsx,json,yml,yaml,md,html}\" --write",
4445
"format:code:eslint": "eslint \"**/*.{ts,tsx}\" --fix",
4546
"lerna:version:up": "lerna version --yes",
4647
"release:github:registry": "pnpm publish --no-git-checks --registry https://npm.pkg.github.com/:_authToken=${NODE_AUTH_TOKEN}",
4748
"release:npm:registry": "pnpm publish --no-git-checks",
48-
"test": "run-p test:depcruise test:jest test:code:gen test:snapshot",
49-
"test:code:gen": "pnpm ts ./scripts/testCodeGen.ts",
49+
"test": "run-p test:depcruise test:jest test:code:gen:* test:snapshot",
50+
"test:code:gen": "run-p test:code:gen:*",
51+
"test:code:gen:class": "pnpm ts ./scripts/testCodeGenWithClass.ts",
52+
"test:code:gen:function": "pnpm ts ./scripts/testCodeGenWithFunctional.ts",
5053
"test:depcruise": "depcruise --validate .dependency-cruiser.js src",
5154
"test:eslint": "eslint \"src/**/*.{ts,tsx}\"",
5255
"test:jest": "jest -c ./jest.config.js --collect-coverage",
Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,57 @@
1-
import * as Writer from "./writer";
1+
import * as Writer from "./writer/Class";
22

33
const main = () => {
4-
Writer.generateTypedefCodeOnly("test/api.test.domain/index.yml", "test/code/typedef-only/api.test.domain.ts", true);
5-
Writer.generateTypedefCodeOnly("test/infer.domain/index.yml", "test/code/typedef-only/infer.domain.ts", false);
6-
Writer.generateTypedefCodeOnly("test/json.properties/index.yml", "test/code/typedef-only/json.properties.ts", false);
4+
Writer.generateTypedefCodeOnly("test/api.test.domain/index.yml", "test/code/class/typedef-only/api.test.domain.ts", true);
5+
Writer.generateTypedefCodeOnly("test/infer.domain/index.yml", "test/code/class/typedef-only/infer.domain.ts", false);
6+
Writer.generateTypedefCodeOnly("test/json.properties/index.yml", "test/code/class/typedef-only/json.properties.ts", false);
77

8-
Writer.generateTemplateCodeOnly("test/api.test.domain/index.yml", "test/code/template-only/api.test.domain.ts", true, { sync: false });
9-
Writer.generateTemplateCodeOnly("test/api.test.domain/index.yml", "test/code/template-only/sync-api.test.domain.ts", true, { sync: true });
10-
Writer.generateTemplateCodeOnly("test/infer.domain/index.yml", "test/code/template-only/infer.domain.ts", false, { sync: true });
8+
Writer.generateTemplateCodeOnly("test/api.test.domain/index.yml", "test/code/class/template-only/api.test.domain.ts", true, { sync: false });
9+
Writer.generateTemplateCodeOnly("test/api.test.domain/index.yml", "test/code/class/template-only/sync-api.test.domain.ts", true, {
10+
sync: true,
11+
});
12+
Writer.generateTemplateCodeOnly("test/infer.domain/index.yml", "test/code/class/template-only/infer.domain.ts", false, { sync: true });
1113

12-
Writer.generateTypedefWithTemplateCode("test/api.v2.domain/index.yml", "test/code/typedef-with-template/api.v2.domain.ts", false, {
14+
Writer.generateTypedefWithTemplateCode("test/api.v2.domain/index.yml", "test/code/class/typedef-with-template/api.v2.domain.ts", false, {
1315
sync: false,
1416
});
15-
Writer.generateTypedefWithTemplateCode("test/api.test.domain/index.yml", "test/code/typedef-with-template/api.test.domain.ts", true, {
17+
Writer.generateTypedefWithTemplateCode("test/api.test.domain/index.yml", "test/code/class/typedef-with-template/api.test.domain.ts", true, {
1618
sync: false,
1719
});
18-
Writer.generateTypedefWithTemplateCode("test/api.test.domain/index.yml", "test/code/typedef-with-template/sync-api.test.domain.ts", true, {
19-
sync: true,
20-
});
21-
Writer.generateTypedefWithTemplateCode("test/infer.domain/index.yml", "test/code/typedef-with-template/infer.domain.ts", false, {
20+
Writer.generateTypedefWithTemplateCode(
21+
"test/api.test.domain/index.yml",
22+
"test/code/class/typedef-with-template/sync-api.test.domain.ts",
23+
true,
24+
{
25+
sync: true,
26+
},
27+
);
28+
Writer.generateTypedefWithTemplateCode("test/infer.domain/index.yml", "test/code/class/typedef-with-template/infer.domain.ts", false, {
2229
sync: false,
2330
});
2431

25-
Writer.generateTypedefWithTemplateCode("test/ref.access/index.yml", "test/code/typedef-with-template/ref-access.ts", false, {
32+
Writer.generateTypedefWithTemplateCode("test/ref.access/index.yml", "test/code/class/typedef-with-template/ref-access.ts", false, {
2633
sync: false,
2734
});
28-
Writer.generateTypedefWithTemplateCode("test/remote.ref.access/v1.yml", "test/code/typedef-with-template/remote-ref-access.ts", false, {
35+
Writer.generateTypedefWithTemplateCode("test/remote.ref.access/v1.yml", "test/code/class/typedef-with-template/remote-ref-access.ts", false, {
2936
sync: false,
3037
});
31-
Writer.generateTypedefWithTemplateCode("test/kubernetes/openapi-v1.18.5.json", "test/code/kubernetes/client-v1.18.5.ts", false, {
38+
Writer.generateTypedefWithTemplateCode("test/kubernetes/openapi-v1.18.5.json", "test/code/class/kubernetes/client-v1.18.5.ts", false, {
3239
sync: false,
3340
});
34-
Writer.generateTypedefWithTemplateCode("test/argo-rollout/index.json", "test/code/argo-rollout/client.ts", false, {
41+
Writer.generateTypedefWithTemplateCode("test/argo-rollout/index.json", "test/code/class/argo-rollout/client.ts", false, {
3542
sync: false,
3643
});
37-
Writer.generateTypedefWithTemplateCode("test/unknown.schema.domain/index.yml", "test/code/unknown.schema.domain/client.ts", false, {
44+
Writer.generateTypedefWithTemplateCode("test/unknown.schema.domain/index.yml", "test/code/class/unknown.schema.domain/client.ts", false, {
3845
sync: false,
3946
});
4047

41-
Writer.generateSplitCode("test/api.test.domain/index.yml", "test/code/split");
42-
Writer.generateSplitCode("test/multi-type.test.domain/index.yml", "test/code/mulit-type-test.domain");
48+
Writer.generateSplitCode("test/api.test.domain/index.yml", "test/code/class/split");
49+
Writer.generateSplitCode("test/multi-type.test.domain/index.yml", "test/code/class/mulit-type-test.domain");
4350

44-
Writer.generateParameter("test/api.test.domain/index.yml", "test/code/parameter/api.test.domain.json");
45-
Writer.generateParameter("test/infer.domain/index.yml", "test/code/parameter/infer.domain.json");
51+
Writer.generateParameter("test/api.test.domain/index.yml", "test/code/class/parameter/api.test.domain.json");
52+
Writer.generateParameter("test/infer.domain/index.yml", "test/code/class/parameter/infer.domain.json");
4653

47-
Writer.generateFormatTypeCode("test/format.domain/index.yml", "test/code/format.domain/code.ts");
54+
Writer.generateFormatTypeCode("test/format.domain/index.yml", "test/code/class/format.domain/code.ts");
4855
};
4956

5057
main();

scripts/testCodeGenWithFunctional.ts

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import * as Writer from "./writer/Functional";
2+
3+
const main = () => {
4+
Writer.generateTypedefCodeOnly("test/api.test.domain/index.yml", "test/code/functional/typedef-only/api.test.domain.ts", true);
5+
Writer.generateTypedefCodeOnly("test/infer.domain/index.yml", "test/code/functional/typedef-only/infer.domain.ts", false);
6+
Writer.generateTypedefCodeOnly("test/json.properties/index.yml", "test/code/functional/typedef-only/json.properties.ts", false);
7+
8+
Writer.generateTemplateCodeOnly("test/api.test.domain/index.yml", "test/code/functional/template-only/api.test.domain.ts", true, {
9+
sync: false,
10+
});
11+
Writer.generateTemplateCodeOnly("test/api.test.domain/index.yml", "test/code/functional/template-only/sync-api.test.domain.ts", true, {
12+
sync: true,
13+
});
14+
Writer.generateTemplateCodeOnly("test/infer.domain/index.yml", "test/code/functional/template-only/infer.domain.ts", false, { sync: true });
15+
16+
Writer.generateTypedefWithTemplateCode("test/api.v2.domain/index.yml", "test/code/functional/typedef-with-template/api.v2.domain.ts", false, {
17+
sync: false,
18+
});
19+
Writer.generateTypedefWithTemplateCode(
20+
"test/api.test.domain/index.yml",
21+
"test/code/functional/typedef-with-template/api.test.domain.ts",
22+
true,
23+
{
24+
sync: false,
25+
},
26+
);
27+
Writer.generateTypedefWithTemplateCode(
28+
"test/api.test.domain/index.yml",
29+
"test/code/functional/typedef-with-template/sync-api.test.domain.ts",
30+
true,
31+
{
32+
sync: true,
33+
},
34+
);
35+
Writer.generateTypedefWithTemplateCode("test/infer.domain/index.yml", "test/code/functional/typedef-with-template/infer.domain.ts", false, {
36+
sync: false,
37+
});
38+
39+
Writer.generateTypedefWithTemplateCode("test/ref.access/index.yml", "test/code/functional/typedef-with-template/ref-access.ts", false, {
40+
sync: false,
41+
});
42+
Writer.generateTypedefWithTemplateCode(
43+
"test/remote.ref.access/v1.yml",
44+
"test/code/functional/typedef-with-template/remote-ref-access.ts",
45+
false,
46+
{
47+
sync: false,
48+
},
49+
);
50+
Writer.generateTypedefWithTemplateCode("test/kubernetes/openapi-v1.18.5.json", "test/code/functional/kubernetes/client-v1.18.5.ts", false, {
51+
sync: false,
52+
});
53+
Writer.generateTypedefWithTemplateCode("test/argo-rollout/index.json", "test/code/functional/argo-rollout/client.ts", false, {
54+
sync: false,
55+
});
56+
Writer.generateTypedefWithTemplateCode(
57+
"test/unknown.schema.domain/index.yml",
58+
"test/code/functional/unknown.schema.domain/client.ts",
59+
false,
60+
{
61+
sync: false,
62+
},
63+
);
64+
65+
Writer.generateSplitCode("test/api.test.domain/index.yml", "test/code/functional/split");
66+
Writer.generateSplitCode("test/multi-type.test.domain/index.yml", "test/code/functional/mulit-type-test.domain");
67+
68+
Writer.generateParameter("test/api.test.domain/index.yml", "test/code/functional/parameter/api.test.domain.json");
69+
Writer.generateParameter("test/infer.domain/index.yml", "test/code/functional/parameter/infer.domain.json");
70+
71+
Writer.generateFormatTypeCode("test/format.domain/index.yml", "test/code/functional/format.domain/code.ts");
72+
};
73+
74+
main();

scripts/watch.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ const main = async () => {
1414
console.log((await shell("pnpm build", cwd)).stdout);
1515
console.log((await shell("pnpm run test:code:gen", cwd)).stdout);
1616

17-
chokidar.watch("./src", {}).on("change", async path => {
17+
chokidar.watch("./src", { ignored: ["src/meta.ts"] }).on("change", async path => {
1818
console.log(`Watch Change file ... ${path}`);
1919
try {
2020
console.log((await shell("pnpm build", cwd)).stdout);

scripts/writer/index.ts renamed to scripts/writer/Class.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export const generateTemplateCodeOnly = (
2626
inputFilename: string,
2727
outputFilename: string,
2828
isValidate: boolean,
29-
option: Templates.ApiClient.Option,
29+
option: Templates.ClassApiClient.Option,
3030
): void => {
3131
const codeGenerator = new CodeGenerator(inputFilename);
3232
if (isValidate) {
@@ -35,8 +35,8 @@ export const generateTemplateCodeOnly = (
3535
});
3636
}
3737

38-
const apiClientGeneratorTemplate: Types.CodeGenerator.CustomGenerator<Templates.ApiClient.Option> = {
39-
generator: Templates.ApiClient.generator,
38+
const apiClientGeneratorTemplate: Types.CodeGenerator.CustomGenerator<Templates.ClassApiClient.Option> = {
39+
generator: Templates.ClassApiClient.generator,
4040
option: option,
4141
};
4242

@@ -49,7 +49,7 @@ export const generateTypedefWithTemplateCode = (
4949
inputFilename: string,
5050
outputFilename: string,
5151
isValidate: boolean,
52-
option: Templates.ApiClient.Option,
52+
option: Templates.ClassApiClient.Option,
5353
): void => {
5454
const codeGenerator = new CodeGenerator(inputFilename);
5555
if (isValidate) {
@@ -61,7 +61,7 @@ export const generateTypedefWithTemplateCode = (
6161
const code = codeGenerator.generateTypeDefinition([
6262
codeGenerator.getAdditionalTypeDefinitionCustomCodeGenerator(),
6363
{
64-
generator: Templates.ApiClient.generator,
64+
generator: Templates.ClassApiClient.generator,
6565
option: option,
6666
},
6767
]);
@@ -72,8 +72,8 @@ export const generateTypedefWithTemplateCode = (
7272
export const generateSplitCode = (inputFilename: string, outputDir: string) => {
7373
const codeGenerator = new CodeGenerator(inputFilename);
7474

75-
const apiClientGeneratorTemplate: Types.CodeGenerator.CustomGenerator<Templates.ApiClient.Option> = {
76-
generator: Templates.ApiClient.generator,
75+
const apiClientGeneratorTemplate: Types.CodeGenerator.CustomGenerator<Templates.ClassApiClient.Option> = {
76+
generator: Templates.ClassApiClient.generator,
7777
option: { sync: false, additionalMethodComment: true },
7878
};
7979

@@ -147,8 +147,8 @@ export const generateFormatTypeCode = (inputFilename: string, outputFilename: st
147147
};
148148
const codeGenerator = new CodeGenerator(inputFilename, option);
149149

150-
const apiClientGeneratorTemplate: Types.CodeGenerator.CustomGenerator<Templates.ApiClient.Option> = {
151-
generator: Templates.ApiClient.generator,
150+
const apiClientGeneratorTemplate: Types.CodeGenerator.CustomGenerator<Templates.ClassApiClient.Option> = {
151+
generator: Templates.ClassApiClient.generator,
152152
option: {},
153153
};
154154

0 commit comments

Comments
 (0)