Skip to content

Commit b876a7c

Browse files
authored
feat: If the type cannot be estimated, set it to any (#69)
1 parent 735537c commit b876a7c

File tree

12 files changed

+307
-16
lines changed

12 files changed

+307
-16
lines changed

scripts/testCodeGen.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ const main = () => {
3030
Writer.generateTypedefWithTemplateCode("test/argo-rollout/index.json", "test/code/argo-rollout/client.ts", false, {
3131
sync: false,
3232
});
33+
Writer.generateTypedefWithTemplateCode("test/unknown.schema.domain/index.yml", "test/code/unknown.schema.domain/client.ts", false, {
34+
sync: false,
35+
});
3336

3437
Writer.generateSplitCode("test/api.test.domain/index.yml", "test/code/split");
3538

src/internal/OpenApiTools/ConverterContext.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,12 @@ export const create = (factory: Factory.Type, options?: Options): Types => {
103103
}
104104
return text.replace(/-/g, "$").replace(/\//g, "$");
105105
};
106+
const convertOperationId = (text: string): string => {
107+
return convertString(text).replace(/\./g, "$");
108+
}
106109
return {
107110
escapeOperationIdText: (operationId: string): string => {
108-
return convertString(operationId);
111+
return convertOperationId(operationId);
109112
},
110113
escapeDeclarationText: (text: string) => {
111114
// console.log(`escapeDeclarationText: ${text}` + `-> ${convertReservedWord(convertString(text).replace(/\./g, "$"))}`.padStart(100, " "));
@@ -122,25 +125,25 @@ export const create = (factory: Factory.Type, options?: Options): Types => {
122125
return convertString(text);
123126
},
124127
generateResponseName: (operationId: string, statusCode: string): string => {
125-
return Utils.responseName(convertString(operationId), statusCode);
128+
return Utils.responseName(convertOperationId(operationId), statusCode);
126129
},
127130
generateArgumentParamsTypeDeclaration: (operationId: string) => {
128-
return Utils.argumentParamsTypeDeclaration(convertString(operationId));
131+
return Utils.argumentParamsTypeDeclaration(convertOperationId(operationId));
129132
},
130133
generateRequestContentTypeName: (operationId: string) => {
131-
return Utils.requestContentType(convertString(operationId));
134+
return Utils.requestContentType(convertOperationId(operationId));
132135
},
133136
generateResponseContentTypeName: (operationId: string) => {
134-
return Utils.responseContentType(convertString(operationId));
137+
return Utils.responseContentType(convertOperationId(operationId));
135138
},
136139
generateParameterName: (operationId: string) => {
137-
return Utils.parameterName(convertString(operationId));
140+
return Utils.parameterName(convertOperationId(operationId));
138141
},
139142
generateRequestBodyName: (operationId: string) => {
140-
return Utils.requestBodyName(convertString(operationId));
143+
return Utils.requestBodyName(convertOperationId(operationId));
141144
},
142145
generateFunctionName: (operationId: string) => {
143-
return convertString(operationId);
146+
return convertOperationId(operationId);
144147
},
145148
convertFormatTypeNode: schema => {
146149
const formatConversions = options?.formatConversions;

src/internal/OpenApiTools/toTypeNode.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,12 @@ export const convert: Convert = (
169169
Logger.info("Parent Schema:");
170170
Logger.info(JSON.stringify(option.parent));
171171
}
172-
Logger.showFilePosition(entryPoint, currentPoint);
173-
throw new UnsetTypeError("Please set 'type' or '$ref' property \n" + JSON.stringify(schema));
172+
const typeNode = factory.TypeNode.create({
173+
type: "any",
174+
});
175+
return typeNode;
176+
// Logger.showFilePosition(entryPoint, currentPoint);
177+
// throw new UnsetTypeError("Please set 'type' or '$ref' property \n" + JSON.stringify(schema));
174178
}
175179
switch (schema.type) {
176180
case "boolean": {

src/utils.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,12 @@ export const isAvailableVariableName = (text: string): boolean => {
99
return /^[A-Za-z_0-9\s]+$/.test(text);
1010
};
1111

12+
export const isFirstCharacterIsValidText = (text: string): boolean => {
13+
return /^[A-Za-z]+/.test(text);
14+
}
15+
1216
export const escapeText = (text: string): string => {
13-
if (isAvailableVariableName(text)) {
17+
if (isAvailableVariableName(text) && isFirstCharacterIsValidText(text)) {
1418
return text;
1519
}
1620
return `"${text}"`;

test/__tests__/__snapshots__/parameter-test.ts.snap

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,92 @@ exports[`Parameter api.test.domain 1`] = `
229229
}
230230
}
231231
},
232+
{
233+
\\"operationId\\": \\"i.have.dot\\",
234+
\\"convertedParams\\": {
235+
\\"escapedOperationId\\": \\"i$have$dot\\",
236+
\\"argumentParamsTypeDeclaration\\": \\"Params$i$have$dot\\",
237+
\\"functionName\\": \\"i$have$dot\\",
238+
\\"requestContentTypeName\\": \\"RequestContentType$i$have$dot\\",
239+
\\"responseContentTypeName\\": \\"ResponseContentType$i$have$dot\\",
240+
\\"parameterName\\": \\"Parameter$i$have$dot\\",
241+
\\"requestBodyName\\": \\"RequestBody$i$have$dot\\",
242+
\\"hasRequestBody\\": false,
243+
\\"hasParameter\\": false,
244+
\\"pickedParameters\\": [],
245+
\\"requestContentTypes\\": [],
246+
\\"responseSuccessNames\\": [
247+
\\"Response$i$have$dot$Status$200\\"
248+
],
249+
\\"responseFirstSuccessName\\": \\"Response$i$have$dot$Status$200\\",
250+
\\"has2OrMoreSuccessNames\\": false,
251+
\\"responseErrorNames\\": [],
252+
\\"has2OrMoreRequestContentTypes\\": false,
253+
\\"successResponseContentTypes\\": [
254+
\\"application/json\\"
255+
],
256+
\\"successResponseFirstContentType\\": \\"application/json\\",
257+
\\"has2OrMoreSuccessResponseContentTypes\\": false,
258+
\\"hasAdditionalHeaders\\": false,
259+
\\"hasQueryParameters\\": false
260+
},
261+
\\"operationParams\\": {
262+
\\"httpMethod\\": \\"get\\",
263+
\\"requestUri\\": \\"/i/have/dot\\",
264+
\\"comment\\": \\"\\",
265+
\\"deprecated\\": false,
266+
\\"parameters\\": [],
267+
\\"responses\\": {
268+
\\"200\\": {
269+
\\"description\\": \\"Get Books\\",
270+
\\"content\\": {
271+
\\"application/json\\": {
272+
\\"schema\\": {
273+
\\"type\\": \\"object\\",
274+
\\"properties\\": {
275+
\\"books\\": {
276+
\\"type\\": \\"array\\",
277+
\\"items\\": {
278+
\\"type\\": \\"object\\",
279+
\\"description\\": \\"Item Model\\",
280+
\\"required\\": [
281+
\\"name\\",
282+
\\"children\\"
283+
],
284+
\\"properties\\": {
285+
\\"name\\": {
286+
\\"type\\": \\"string\\"
287+
},
288+
\\"children\\": {
289+
\\"type\\": \\"array\\",
290+
\\"items\\": {
291+
\\"type\\": \\"object\\",
292+
\\"required\\": [
293+
\\"id\\",
294+
\\"name\\"
295+
],
296+
\\"properties\\": {
297+
\\"id\\": {
298+
\\"type\\": \\"string\\"
299+
},
300+
\\"name\\": {
301+
\\"type\\": \\"string\\",
302+
\\"description\\": \\"child name\\"
303+
}
304+
}
305+
}
306+
}
307+
}
308+
}
309+
}
310+
}
311+
}
312+
}
313+
}
314+
}
315+
}
316+
}
317+
},
232318
{
233319
\\"operationId\\": \\"getReferenceItems\\",
234320
\\"convertedParams\\": {

test/__tests__/__snapshots__/spit-code-test.ts.snap

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ export interface Response$getFullRemoteReference$Status$200 {
3737
name?: \\"responseA\\";
3838
};
3939
}
40+
export interface Response$i$have$dot$Status$200 {
41+
\\"application/json\\": {
42+
books?: Schemas.Item[];
43+
};
44+
}
4045
export interface Response$getReferenceItems$Status$200 {
4146
\\"application/json\\": {
4247
books?: Schemas.Item[];
@@ -81,6 +86,7 @@ export type ResponseContentType$getFullRemoteReference = keyof Response$getFullR
8186
export interface Params$getFullRemoteReference {
8287
parameter: Parameter$getFullRemoteReference;
8388
}
89+
export type ResponseContentType$i$have$dot = keyof Response$i$have$dot$Status$200;
8490
export type ResponseContentType$getReferenceItems = keyof Response$getReferenceItems$Status$200;
8591
export type ResponseContentType$searchBook = keyof Response$searchBook$Status$200;
8692
export interface Params$searchBook {
@@ -106,11 +112,12 @@ export interface QueryParameter {
106112
export interface QueryParameters {
107113
[key: string]: QueryParameter;
108114
}
109-
export type SuccessResponses = Response$getIncludeLocalReference$Status$200 | Response$getFullRemoteReference$Status$200 | Response$getReferenceItems$Status$200 | Response$searchBook$Status$200 | Response$getBookById$Status$200 | Response$deleteBook$Status$200;
115+
export type SuccessResponses = Response$getIncludeLocalReference$Status$200 | Response$getFullRemoteReference$Status$200 | Response$i$have$dot$Status$200 | Response$getReferenceItems$Status$200 | Response$searchBook$Status$200 | Response$getBookById$Status$200 | Response$deleteBook$Status$200;
110116
export namespace ErrorResponse {
111117
export type getIncludeLocalReference = void;
112118
export type getIncludeRemoteReference = void;
113119
export type getFullRemoteReference = void;
120+
export type i$have$dot = void;
114121
export type getReferenceItems = void;
115122
export type searchBook = void;
116123
export type getBookById = void;
@@ -164,6 +171,17 @@ export class Client<RequestOption> {
164171
};
165172
return this.apiClient.request(\\"GET\\", url, headers, undefined, queryParameters, option);
166173
}
174+
/**
175+
* operationId: i.have.dot
176+
* Request URI: /i/have/dot
177+
*/
178+
public async i$have$dot(option?: RequestOption): Promise<Response$i$have$dot$Status$200[\\"application/json\\"]> {
179+
const url = this.baseUrl + \`/i/have/dot\`;
180+
const headers = {
181+
Accept: \\"application/json\\"
182+
};
183+
return this.apiClient.request(\\"GET\\", url, headers, undefined, undefined, option);
184+
}
167185
/**
168186
* operationId: getReferenceItems
169187
* Request URI: /get/reference/items

test/__tests__/__snapshots__/template-only-test.ts.snap

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export type ResponseContentType$getFullRemoteReference = keyof Response$getFullR
2323
export interface Params$getFullRemoteReference {
2424
parameter: Parameter$getFullRemoteReference;
2525
}
26+
export type ResponseContentType$i$have$dot = keyof Response$i$have$dot$Status$200;
2627
export type ResponseContentType$getReferenceItems = keyof Response$getReferenceItems$Status$200;
2728
export type ResponseContentType$searchBook = keyof Response$searchBook$Status$200;
2829
export interface Params$searchBook {
@@ -48,11 +49,12 @@ export interface QueryParameter {
4849
export interface QueryParameters {
4950
[key: string]: QueryParameter;
5051
}
51-
export type SuccessResponses = Response$getIncludeLocalReference$Status$200 | Response$getFullRemoteReference$Status$200 | Response$getReferenceItems$Status$200 | Response$searchBook$Status$200 | Response$getBookById$Status$200 | Response$deleteBook$Status$200;
52+
export type SuccessResponses = Response$getIncludeLocalReference$Status$200 | Response$getFullRemoteReference$Status$200 | Response$i$have$dot$Status$200 | Response$getReferenceItems$Status$200 | Response$searchBook$Status$200 | Response$getBookById$Status$200 | Response$deleteBook$Status$200;
5253
export namespace ErrorResponse {
5354
export type getIncludeLocalReference = void;
5455
export type getIncludeRemoteReference = void;
5556
export type getFullRemoteReference = void;
57+
export type i$have$dot = void;
5658
export type getReferenceItems = void;
5759
export type searchBook = void;
5860
export type getBookById = void;
@@ -94,6 +96,13 @@ export class Client<RequestOption> {
9496
};
9597
return this.apiClient.request(\\"GET\\", url, headers, undefined, queryParameters, option);
9698
}
99+
public async i$have$dot(option?: RequestOption): Promise<Response$i$have$dot$Status$200[\\"application/json\\"]> {
100+
const url = this.baseUrl + \`/i/have/dot\`;
101+
const headers = {
102+
Accept: \\"application/json\\"
103+
};
104+
return this.apiClient.request(\\"GET\\", url, headers, undefined, undefined, option);
105+
}
97106
public async getReferenceItems(option?: RequestOption): Promise<Response$getReferenceItems$Status$200[\\"application/json\\"]> {
98107
const url = this.baseUrl + \`/get/reference/items\`;
99108
const headers = {
@@ -152,6 +161,7 @@ export type ResponseContentType$getFullRemoteReference = keyof Response$getFullR
152161
export interface Params$getFullRemoteReference {
153162
parameter: Parameter$getFullRemoteReference;
154163
}
164+
export type ResponseContentType$i$have$dot = keyof Response$i$have$dot$Status$200;
155165
export type ResponseContentType$getReferenceItems = keyof Response$getReferenceItems$Status$200;
156166
export type ResponseContentType$searchBook = keyof Response$searchBook$Status$200;
157167
export interface Params$searchBook {
@@ -177,11 +187,12 @@ export interface QueryParameter {
177187
export interface QueryParameters {
178188
[key: string]: QueryParameter;
179189
}
180-
export type SuccessResponses = Response$getIncludeLocalReference$Status$200 | Response$getFullRemoteReference$Status$200 | Response$getReferenceItems$Status$200 | Response$searchBook$Status$200 | Response$getBookById$Status$200 | Response$deleteBook$Status$200;
190+
export type SuccessResponses = Response$getIncludeLocalReference$Status$200 | Response$getFullRemoteReference$Status$200 | Response$i$have$dot$Status$200 | Response$getReferenceItems$Status$200 | Response$searchBook$Status$200 | Response$getBookById$Status$200 | Response$deleteBook$Status$200;
181191
export namespace ErrorResponse {
182192
export type getIncludeLocalReference = void;
183193
export type getIncludeRemoteReference = void;
184194
export type getFullRemoteReference = void;
195+
export type i$have$dot = void;
185196
export type getReferenceItems = void;
186197
export type searchBook = void;
187198
export type getBookById = void;
@@ -223,6 +234,13 @@ export class Client<RequestOption> {
223234
};
224235
return this.apiClient.request(\\"GET\\", url, headers, undefined, queryParameters, option);
225236
}
237+
public i$have$dot(option?: RequestOption): Response$i$have$dot$Status$200[\\"application/json\\"] {
238+
const url = this.baseUrl + \`/i/have/dot\`;
239+
const headers = {
240+
Accept: \\"application/json\\"
241+
};
242+
return this.apiClient.request(\\"GET\\", url, headers, undefined, undefined, option);
243+
}
226244
public getReferenceItems(option?: RequestOption): Response$getReferenceItems$Status$200[\\"application/json\\"] {
227245
const url = this.baseUrl + \`/get/reference/items\`;
228246
const headers = {

test/__tests__/__snapshots__/typedef-with-template-test.ts.snap

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,11 @@ export interface Response$getFullRemoteReference$Status$200 {
313313
name?: \\"responseA\\";
314314
};
315315
}
316+
export interface Response$i$have$dot$Status$200 {
317+
\\"application/json\\": {
318+
books?: Schemas.Item[];
319+
};
320+
}
316321
export interface Response$getReferenceItems$Status$200 {
317322
\\"application/json\\": {
318323
books?: Schemas.Item[];
@@ -357,6 +362,7 @@ export type ResponseContentType$getFullRemoteReference = keyof Response$getFullR
357362
export interface Params$getFullRemoteReference {
358363
parameter: Parameter$getFullRemoteReference;
359364
}
365+
export type ResponseContentType$i$have$dot = keyof Response$i$have$dot$Status$200;
360366
export type ResponseContentType$getReferenceItems = keyof Response$getReferenceItems$Status$200;
361367
export type ResponseContentType$searchBook = keyof Response$searchBook$Status$200;
362368
export interface Params$searchBook {
@@ -382,11 +388,12 @@ export interface QueryParameter {
382388
export interface QueryParameters {
383389
[key: string]: QueryParameter;
384390
}
385-
export type SuccessResponses = Response$getIncludeLocalReference$Status$200 | Response$getFullRemoteReference$Status$200 | Response$getReferenceItems$Status$200 | Response$searchBook$Status$200 | Response$getBookById$Status$200 | Response$deleteBook$Status$200;
391+
export type SuccessResponses = Response$getIncludeLocalReference$Status$200 | Response$getFullRemoteReference$Status$200 | Response$i$have$dot$Status$200 | Response$getReferenceItems$Status$200 | Response$searchBook$Status$200 | Response$getBookById$Status$200 | Response$deleteBook$Status$200;
386392
export namespace ErrorResponse {
387393
export type getIncludeLocalReference = void;
388394
export type getIncludeRemoteReference = void;
389395
export type getFullRemoteReference = void;
396+
export type i$have$dot = void;
390397
export type getReferenceItems = void;
391398
export type searchBook = void;
392399
export type getBookById = void;
@@ -428,6 +435,13 @@ export class Client<RequestOption> {
428435
};
429436
return this.apiClient.request(\\"GET\\", url, headers, undefined, queryParameters, option);
430437
}
438+
public async i$have$dot(option?: RequestOption): Promise<Response$i$have$dot$Status$200[\\"application/json\\"]> {
439+
const url = this.baseUrl + \`/i/have/dot\`;
440+
const headers = {
441+
Accept: \\"application/json\\"
442+
};
443+
return this.apiClient.request(\\"GET\\", url, headers, undefined, undefined, option);
444+
}
431445
public async getReferenceItems(option?: RequestOption): Promise<Response$getReferenceItems$Status$200[\\"application/json\\"]> {
432446
const url = this.baseUrl + \`/get/reference/items\`;
433447
const headers = {
@@ -839,6 +853,11 @@ export interface Response$getFullRemoteReference$Status$200 {
839853
name?: \\"responseA\\";
840854
};
841855
}
856+
export interface Response$i$have$dot$Status$200 {
857+
\\"application/json\\": {
858+
books?: Schemas.Item[];
859+
};
860+
}
842861
export interface Response$getReferenceItems$Status$200 {
843862
\\"application/json\\": {
844863
books?: Schemas.Item[];
@@ -883,6 +902,7 @@ export type ResponseContentType$getFullRemoteReference = keyof Response$getFullR
883902
export interface Params$getFullRemoteReference {
884903
parameter: Parameter$getFullRemoteReference;
885904
}
905+
export type ResponseContentType$i$have$dot = keyof Response$i$have$dot$Status$200;
886906
export type ResponseContentType$getReferenceItems = keyof Response$getReferenceItems$Status$200;
887907
export type ResponseContentType$searchBook = keyof Response$searchBook$Status$200;
888908
export interface Params$searchBook {
@@ -908,11 +928,12 @@ export interface QueryParameter {
908928
export interface QueryParameters {
909929
[key: string]: QueryParameter;
910930
}
911-
export type SuccessResponses = Response$getIncludeLocalReference$Status$200 | Response$getFullRemoteReference$Status$200 | Response$getReferenceItems$Status$200 | Response$searchBook$Status$200 | Response$getBookById$Status$200 | Response$deleteBook$Status$200;
931+
export type SuccessResponses = Response$getIncludeLocalReference$Status$200 | Response$getFullRemoteReference$Status$200 | Response$i$have$dot$Status$200 | Response$getReferenceItems$Status$200 | Response$searchBook$Status$200 | Response$getBookById$Status$200 | Response$deleteBook$Status$200;
912932
export namespace ErrorResponse {
913933
export type getIncludeLocalReference = void;
914934
export type getIncludeRemoteReference = void;
915935
export type getFullRemoteReference = void;
936+
export type i$have$dot = void;
916937
export type getReferenceItems = void;
917938
export type searchBook = void;
918939
export type getBookById = void;
@@ -954,6 +975,13 @@ export class Client<RequestOption> {
954975
};
955976
return this.apiClient.request(\\"GET\\", url, headers, undefined, queryParameters, option);
956977
}
978+
public i$have$dot(option?: RequestOption): Response$i$have$dot$Status$200[\\"application/json\\"] {
979+
const url = this.baseUrl + \`/i/have/dot\`;
980+
const headers = {
981+
Accept: \\"application/json\\"
982+
};
983+
return this.apiClient.request(\\"GET\\", url, headers, undefined, undefined, option);
984+
}
957985
public getReferenceItems(option?: RequestOption): Response$getReferenceItems$Status$200[\\"application/json\\"] {
958986
const url = this.baseUrl + \`/get/reference/items\`;
959987
const headers = {

0 commit comments

Comments
 (0)