Skip to content

Commit 631af46

Browse files
authored
refactor: update test code generator (#33)
* refactor: update test code generator * test: update snapshot code test
1 parent 1992416 commit 631af46

10 files changed

+687
-57
lines changed

scripts/build.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ import { copyPackageSet } from "./tools/copyPackageSet";
44
import { generateExportsField } from "./tools/dualPackageSupport";
55
import { shell } from "./tools/shell";
66
import { cherryPick } from "./tools/cherry-pick";
7-
import * as fs from "fs";
8-
97

108
const main = async () => {
119
await Promise.all([
@@ -16,8 +14,6 @@ const main = async () => {
1614

1715
await cherryPick({ inputDir: "../src", cwd: "./lib", typesDir: "./$types", cjsDir: "./$cjs", esmDir: "./$esm" });
1816

19-
const outputList = fs.readdirSync("./lib");
20-
2117
const exportsFiled = generateExportsField("./src", {
2218
directory: {
2319
import: "./$esm",

scripts/testCodeGen.ts

Lines changed: 53 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,77 @@
11
import * as fs from "fs";
2+
import { posix as path } from "path";
23

34
import { CodeGenerator } from "../lib";
45
import * as Templates from "../lib/templates";
56

6-
const gen = (name: string, enableValidate = true): void => {
7-
fs.mkdirSync("test/code", { recursive: true });
8-
const codeGenerator = new CodeGenerator(`test/${name}/index.yml`);
9-
const code = codeGenerator.generateTypeDefinition<Templates.ApiClient.Option>({
10-
generator: Templates.ApiClient.generator,
11-
option: {
12-
sync: false,
13-
},
14-
});
15-
if (enableValidate) {
7+
const writeText = (filename: string, text: string): void => {
8+
fs.mkdirSync(path.dirname(filename), { recursive: true });
9+
fs.writeFileSync(filename, text, { encoding: "utf-8" });
10+
console.log(`Generate Code : ${filename}`);
11+
};
12+
13+
const generateTypedefCodeOnly = (inputFilename: string, outputFilename: string, isValidate: boolean) => {
14+
const codeGenerator = new CodeGenerator(inputFilename);
15+
if (isValidate) {
1616
codeGenerator.validate({
1717
logger: { displayLogLines: 1 },
1818
});
1919
}
20-
fs.writeFileSync(`test/code/${name}.ts`, code, { encoding: "utf-8" });
21-
console.log(`Generate Code : test/code/${name}.ts`);
20+
const code = codeGenerator.generateTypeDefinition();
21+
writeText(outputFilename, code);
2222
};
2323

24-
const genSyncMode = (name: string, enableValidate = true): void => {
25-
const codeGenerator = new CodeGenerator(`test/${name}/index.yml`);
26-
fs.mkdirSync("test/code", { recursive: true });
27-
if (enableValidate) {
24+
const generateTemplateCodeOnly = (
25+
inputFilename: string,
26+
outputFilename: string,
27+
isValidate: boolean,
28+
option: Templates.ApiClient.Option,
29+
): void => {
30+
const codeGenerator = new CodeGenerator(inputFilename);
31+
if (isValidate) {
32+
codeGenerator.validate({
33+
logger: { displayLogLines: 1 },
34+
});
35+
}
36+
const code = codeGenerator.generateCode<Templates.ApiClient.Option>({
37+
generator: Templates.ApiClient.generator,
38+
option: option,
39+
});
40+
41+
writeText(outputFilename, code);
42+
};
43+
44+
const generateTypedefWithTemplateCode = (
45+
inputFilename: string,
46+
outputFilename: string,
47+
isValidate: boolean,
48+
option: Templates.ApiClient.Option,
49+
): void => {
50+
const codeGenerator = new CodeGenerator(inputFilename);
51+
if (isValidate) {
2852
codeGenerator.validate({
2953
logger: { displayLogLines: 1 },
3054
});
3155
}
3256
const code = codeGenerator.generateTypeDefinition<Templates.ApiClient.Option>({
3357
generator: Templates.ApiClient.generator,
34-
option: {
35-
sync: true,
36-
},
58+
option: option,
3759
});
38-
fs.writeFileSync(`test/code/sync-${name}.ts`, code, { encoding: "utf-8" });
39-
console.log(`Generate Code : test/code/sync-${name}.ts`);
60+
61+
writeText(outputFilename, code);
4062
};
4163

4264
const main = () => {
43-
gen("api.test.domain");
44-
gen("infer.domain", false);
45-
genSyncMode("api.test.domain");
65+
generateTypedefCodeOnly("test/api.test.domain/index.yml", "test/code/typedef-only/api.test.domain.ts", true);
66+
generateTypedefCodeOnly("test/infer.domain/index.yml", "test/code/typedef-only/infer.domain.ts", false);
67+
68+
generateTemplateCodeOnly("test/api.test.domain/index.yml", "test/code/template-only/api.test.domain.ts", true, { sync: false });
69+
generateTemplateCodeOnly("test/api.test.domain/index.yml", "test/code/template-only/sync-api.test.domain.ts", true, { sync: true });
70+
generateTemplateCodeOnly("test/infer.domain/index.yml", "test/code/template-only/infer.domain.ts", false, { sync: true });
71+
72+
generateTypedefWithTemplateCode("test/api.test.domain/index.yml", "test/code/typedef-with-template/api.test.domain.ts", true, { sync: false });
73+
generateTypedefWithTemplateCode("test/api.test.domain/index.yml", "test/code/typedef-with-template/sync-api.test.domain.ts", true, { sync: true });
74+
generateTypedefWithTemplateCode("test/infer.domain/index.yml", "test/code/typedef-with-template/infer.domain.ts", false, { sync: false });
4675
};
4776

4877
main();
Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`Template Only api.test.domain 1`] = `
4+
"//
5+
// Generated by @himenon/openapi-typescript-code-generator
6+
//
7+
// OpenApi : 3.1.0
8+
//
9+
// License : MIT
10+
//
11+
12+
13+
export type ResponseContentType$getIncludeLocalReference = keyof Response$getIncludeLocalReference$Status$200;
14+
export interface Params$getIncludeLocalReference {
15+
parameter: Parameter$getIncludeLocalReference;
16+
}
17+
export type RequestContentType$getIncludeRemoteReference = keyof RequestBody$getIncludeRemoteReference;
18+
export interface Params$getIncludeRemoteReference {
19+
parameter: Parameter$getIncludeRemoteReference;
20+
requestBody: RequestBody$getIncludeRemoteReference[\\"application/json\\"];
21+
}
22+
export type ResponseContentType$getFullRemoteReference = keyof Response$getFullRemoteReference$Status$200;
23+
export interface Params$getFullRemoteReference {
24+
parameter: Parameter$getFullRemoteReference;
25+
}
26+
export type ResponseContentType$getReferenceItems = keyof Response$getReferenceItems$Status$200;
27+
export type HttpMethod = \\"GET\\" | \\"PUT\\" | \\"POST\\" | \\"DELETE\\" | \\"OPTIONS\\" | \\"HEAD\\" | \\"PATCH\\" | \\"TRACE\\";
28+
export interface ObjectLike {
29+
[key: string]: any;
30+
}
31+
export interface QueryParameter {
32+
value: any;
33+
style?: \\"form\\" | \\"spaceDelimited\\" | \\"pipeDelimited\\" | \\"deepObject\\";
34+
explode: boolean;
35+
}
36+
export interface QueryParameters {
37+
[key: string]: QueryParameter;
38+
}
39+
export type SuccessResponses = Response$getIncludeLocalReference$Status$200 | Response$getFullRemoteReference$Status$200 | Response$getReferenceItems$Status$200;
40+
export namespace ErrorResponse {
41+
export type getIncludeLocalReference = void;
42+
export type getIncludeRemoteReference = void;
43+
export type getFullRemoteReference = void;
44+
export type getReferenceItems = void;
45+
}
46+
export interface ApiClient<RequestOption> {
47+
request: <T = SuccessResponses>(httpMethod: HttpMethod, url: string, headers: ObjectLike | any, requestBody: ObjectLike | any, queryParameters: QueryParameters | undefined, options?: RequestOption) => Promise<T>;
48+
}
49+
export class Client<RequestOption> {
50+
constructor(private apiClient: ApiClient<RequestOption>, private baseUrl: string) { }
51+
public async getIncludeLocalReference(params: Params$getIncludeLocalReference, option?: RequestOption): Promise<Response$getIncludeLocalReference$Status$200[\\"application/json\\"]> {
52+
const url = this.baseUrl + \`/get/IncludeLocalReference\`;
53+
const headers = {
54+
Accept: \\"application/json\\"
55+
};
56+
const queryParameters: QueryParameters = {
57+
StringQuery: { value: params.parameter.StringQuery, explode: false }
58+
};
59+
return this.apiClient.request(\\"GET\\", url, headers, undefined, queryParameters, option);
60+
}
61+
public async getIncludeRemoteReference(params: Params$getIncludeRemoteReference, option?: RequestOption): Promise<void> {
62+
const url = this.baseUrl + \`/get/IncludeRemoteReference\`;
63+
const headers = {
64+
\\"Content-Type\\": \\"application/json\\"
65+
};
66+
const queryParameters: QueryParameters = {
67+
IncludeRemoteReference: { value: params.parameter.IncludeRemoteReference, explode: false }
68+
};
69+
return this.apiClient.request(\\"GET\\", url, headers, params.requestBody, queryParameters, option);
70+
}
71+
public async getFullRemoteReference(params: Params$getFullRemoteReference, option?: RequestOption): Promise<Response$getFullRemoteReference$Status$200[\\"application/json\\"]> {
72+
const url = this.baseUrl + \`/FullRemoteReference\`;
73+
const headers = {
74+
Accept: \\"application/json\\"
75+
};
76+
const queryParameters: QueryParameters = {
77+
FullRemoteReferenceQuery: { value: params.parameter.FullRemoteReferenceQuery, explode: false }
78+
};
79+
return this.apiClient.request(\\"GET\\", url, headers, undefined, queryParameters, option);
80+
}
81+
public async getReferenceItems(option?: RequestOption): Promise<Response$getReferenceItems$Status$200[\\"application/json\\"]> {
82+
const url = this.baseUrl + \`/get/reference/items\`;
83+
const headers = {
84+
Accept: \\"application/json\\"
85+
};
86+
return this.apiClient.request(\\"GET\\", url, headers, undefined, undefined, option);
87+
}
88+
}
89+
"
90+
`;
91+
92+
exports[`Template Only async-api.test.domain 1`] = `
93+
"//
94+
// Generated by @himenon/openapi-typescript-code-generator
95+
//
96+
// OpenApi : 3.1.0
97+
//
98+
// License : MIT
99+
//
100+
101+
102+
export type ResponseContentType$getIncludeLocalReference = keyof Response$getIncludeLocalReference$Status$200;
103+
export interface Params$getIncludeLocalReference {
104+
parameter: Parameter$getIncludeLocalReference;
105+
}
106+
export type RequestContentType$getIncludeRemoteReference = keyof RequestBody$getIncludeRemoteReference;
107+
export interface Params$getIncludeRemoteReference {
108+
parameter: Parameter$getIncludeRemoteReference;
109+
requestBody: RequestBody$getIncludeRemoteReference[\\"application/json\\"];
110+
}
111+
export type ResponseContentType$getFullRemoteReference = keyof Response$getFullRemoteReference$Status$200;
112+
export interface Params$getFullRemoteReference {
113+
parameter: Parameter$getFullRemoteReference;
114+
}
115+
export type ResponseContentType$getReferenceItems = keyof Response$getReferenceItems$Status$200;
116+
export type HttpMethod = \\"GET\\" | \\"PUT\\" | \\"POST\\" | \\"DELETE\\" | \\"OPTIONS\\" | \\"HEAD\\" | \\"PATCH\\" | \\"TRACE\\";
117+
export interface ObjectLike {
118+
[key: string]: any;
119+
}
120+
export interface QueryParameter {
121+
value: any;
122+
style?: \\"form\\" | \\"spaceDelimited\\" | \\"pipeDelimited\\" | \\"deepObject\\";
123+
explode: boolean;
124+
}
125+
export interface QueryParameters {
126+
[key: string]: QueryParameter;
127+
}
128+
export type SuccessResponses = Response$getIncludeLocalReference$Status$200 | Response$getFullRemoteReference$Status$200 | Response$getReferenceItems$Status$200;
129+
export namespace ErrorResponse {
130+
export type getIncludeLocalReference = void;
131+
export type getIncludeRemoteReference = void;
132+
export type getFullRemoteReference = void;
133+
export type getReferenceItems = void;
134+
}
135+
export interface ApiClient<RequestOption> {
136+
request: <T = SuccessResponses>(httpMethod: HttpMethod, url: string, headers: ObjectLike | any, requestBody: ObjectLike | any, queryParameters: QueryParameters | undefined, options?: RequestOption) => T;
137+
}
138+
export class Client<RequestOption> {
139+
constructor(private apiClient: ApiClient<RequestOption>, private baseUrl: string) { }
140+
public getIncludeLocalReference(params: Params$getIncludeLocalReference, option?: RequestOption): Response$getIncludeLocalReference$Status$200[\\"application/json\\"] {
141+
const url = this.baseUrl + \`/get/IncludeLocalReference\`;
142+
const headers = {
143+
Accept: \\"application/json\\"
144+
};
145+
const queryParameters: QueryParameters = {
146+
StringQuery: { value: params.parameter.StringQuery, explode: false }
147+
};
148+
return this.apiClient.request(\\"GET\\", url, headers, undefined, queryParameters, option);
149+
}
150+
public getIncludeRemoteReference(params: Params$getIncludeRemoteReference, option?: RequestOption): void {
151+
const url = this.baseUrl + \`/get/IncludeRemoteReference\`;
152+
const headers = {
153+
\\"Content-Type\\": \\"application/json\\"
154+
};
155+
const queryParameters: QueryParameters = {
156+
IncludeRemoteReference: { value: params.parameter.IncludeRemoteReference, explode: false }
157+
};
158+
return this.apiClient.request(\\"GET\\", url, headers, params.requestBody, queryParameters, option);
159+
}
160+
public getFullRemoteReference(params: Params$getFullRemoteReference, option?: RequestOption): Response$getFullRemoteReference$Status$200[\\"application/json\\"] {
161+
const url = this.baseUrl + \`/FullRemoteReference\`;
162+
const headers = {
163+
Accept: \\"application/json\\"
164+
};
165+
const queryParameters: QueryParameters = {
166+
FullRemoteReferenceQuery: { value: params.parameter.FullRemoteReferenceQuery, explode: false }
167+
};
168+
return this.apiClient.request(\\"GET\\", url, headers, undefined, queryParameters, option);
169+
}
170+
public getReferenceItems(option?: RequestOption): Response$getReferenceItems$Status$200[\\"application/json\\"] {
171+
const url = this.baseUrl + \`/get/reference/items\`;
172+
const headers = {
173+
Accept: \\"application/json\\"
174+
};
175+
return this.apiClient.request(\\"GET\\", url, headers, undefined, undefined, option);
176+
}
177+
}
178+
"
179+
`;
180+
181+
exports[`Template Only infer.domain 1`] = `
182+
"//
183+
// Generated by @himenon/openapi-typescript-code-generator
184+
//
185+
// OpenApi : 3.1.0
186+
//
187+
// License : MIT
188+
//
189+
190+
191+
export type HttpMethod = \\"GET\\" | \\"PUT\\" | \\"POST\\" | \\"DELETE\\" | \\"OPTIONS\\" | \\"HEAD\\" | \\"PATCH\\" | \\"TRACE\\";
192+
export interface ObjectLike {
193+
[key: string]: any;
194+
}
195+
export interface QueryParameter {
196+
value: any;
197+
style?: \\"form\\" | \\"spaceDelimited\\" | \\"pipeDelimited\\" | \\"deepObject\\";
198+
explode: boolean;
199+
}
200+
export interface QueryParameters {
201+
[key: string]: QueryParameter;
202+
}
203+
export type SuccessResponses = void;
204+
export namespace ErrorResponse { }
205+
export interface ApiClient<RequestOption> {
206+
request: <T = SuccessResponses>(httpMethod: HttpMethod, url: string, headers: ObjectLike | any, requestBody: ObjectLike | any, queryParameters: QueryParameters | undefined, options?: RequestOption) => T;
207+
}
208+
export class Client<RequestOption> {
209+
constructor(private apiClient: ApiClient<RequestOption>, private baseUrl: string) { }
210+
}
211+
"
212+
`;

0 commit comments

Comments
 (0)