Skip to content

Commit 61399c0

Browse files
authored
fix: sanitize regex pattern (#126)
1 parent 95a56fc commit 61399c0

18 files changed

+365329
-12
lines changed

scripts/testCodeGenWithClass.ts

+2
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ const main = () => {
5454
Writer.generateParameter("test/infer.domain/index.yml", "test/code/class/parameter/infer.domain.json");
5555

5656
Writer.generateFormatTypeCode("test/format.domain/index.yml", "test/code/class/format.domain/code.ts");
57+
58+
Writer.generateFormatTypeCode("test/cloudflare/openapi.yaml", "test/code/class/cloudflare/client.ts");
5759
};
5860

5961
main();

scripts/testCodeGenWithCurryingFunctional.ts

+2
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ const main = () => {
9696
Writer.generateParameter("test/infer.domain/index.yml", "test/code/currying-functional/parameter/infer.domain.json");
9797

9898
Writer.generateFormatTypeCode("test/format.domain/index.yml", "test/code/currying-functional/format.domain/code.ts");
99+
100+
Writer.generateFormatTypeCode("test/cloudflare/openapi.yaml", "test/code/currying-functional/cloudflare/client.ts");
99101
};
100102

101103
main();

scripts/testCodeGenWithFunctional.ts

+2
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ const main = () => {
7171
Writer.generateParameter("test/infer.domain/index.yml", "test/code/functional/parameter/infer.domain.json");
7272

7373
Writer.generateFormatTypeCode("test/format.domain/index.yml", "test/code/functional/format.domain/code.ts");
74+
75+
Writer.generateFormatTypeCode("test/cloudflare/openapi.yaml", "test/code/functional/cloudflare/client.ts");
7476
};
7577

7678
main();

src/internal/OpenApiTools/ConverterContext.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ const createFormatSchemaToTypeNode = (factory: Factory.Type, target: FormatConve
9393
export const create = (factory: Factory.Type, options?: Options): Types => {
9494
const convertReservedWord = (word: string): string => {
9595
if (["import", "export"].includes(word)) {
96-
return word + "_";
96+
return `${word}_`;
9797
}
9898
return word;
9999
};
@@ -104,7 +104,7 @@ export const create = (factory: Factory.Type, options?: Options): Types => {
104104
return text.replace(/-/g, "$").replace(/\//g, "$");
105105
};
106106
const convertOperationId = (text: string): string => {
107-
return convertString(text).replace(/\./g, "$");
107+
return convertString(text).replace(/[^a-zA-Z0-9_]/g, "$");
108108
};
109109
return {
110110
escapeOperationIdText: (operationId: string): string => {

src/internal/OpenApiTools/Extractor.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,13 @@ const extractResponseNamesByStatusCode = (type: "success" | "error", responses:
3636
};
3737

3838
const getRequestContentTypeList = (requestBody: OpenApi.RequestBody): string[] => {
39-
return Object.keys(requestBody.content);
39+
return Object.entries(requestBody.content).reduce<string[]>((list, [key, mediaType]) => {
40+
const hasValidContent = Object.values(mediaType).length > 0;
41+
if (hasValidContent) {
42+
return list.concat(key);
43+
}
44+
return list;
45+
}, []);
4046
};
4147

4248
const getSuccessResponseContentTypeList = (responses: { [statusCode: string]: OpenApi.Response }): string[] => {

src/internal/OpenApiTools/Walker/Operation.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,15 @@ export const create = (rootSchema: OpenApi.Document): State => {
3131
}
3232
const parameters = [...(pathItem.parameters || []), ...(operation.parameters || [])] as OpenApi.Parameter[];
3333

34+
const requestBody = operation.requestBody as OpenApi.RequestBody | undefined;
35+
const hasValidMediaType = Object.values(requestBody?.content || {}).filter(mediaType => Object.values(mediaType).length > 0).length > 0;
36+
3437
state[operation.operationId] = {
3538
httpMethod,
3639
requestUri,
3740
comment: [operation.summary, operation.description].filter(Boolean).join(EOL),
3841
deprecated: !!operation.deprecated,
39-
requestBody: operation.requestBody as OpenApi.RequestBody,
42+
requestBody: hasValidMediaType ? requestBody : undefined,
4043
parameters: uniqParameters(parameters),
4144
responses: operation.responses as CodeGenerator.OpenApiResponses,
4245
};

src/internal/OpenApiTools/components/Operation.ts

+15-6
Original file line numberDiff line numberDiff line change
@@ -182,12 +182,21 @@ export const generateStatements = (
182182
});
183183
}
184184
} else {
185-
statements.push(
186-
RequestBody.generateInterface(entryPoint, currentPoint, factory, requestBodyName, operation.requestBody, context, converterContext),
187-
);
188-
store.updateOperationState(httpMethod, requestUri, operationId, {
189-
requestBodyName: requestBodyName,
190-
});
185+
/**
186+
* requestBody:
187+
* content:
188+
* application/json: {}
189+
*/
190+
const hasValidMediaType =
191+
Object.values(operation.requestBody.content).filter(mediaType => Object.values(mediaType).length > 0).length > 0;
192+
if (hasValidMediaType) {
193+
statements.push(
194+
RequestBody.generateInterface(entryPoint, currentPoint, factory, requestBodyName, operation.requestBody, context, converterContext),
195+
);
196+
store.updateOperationState(httpMethod, requestUri, operationId, {
197+
requestBodyName: requestBodyName,
198+
});
199+
}
191200
}
192201
}
193202

src/internal/OpenApiTools/components/RequestBody.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,17 @@ export const generateInterface = (
1616
context: ToTypeNode.Context,
1717
converterContext: ConverterContext.Types,
1818
): ts.InterfaceDeclaration => {
19+
/**
20+
* requestBody:
21+
* content:
22+
* application/json: {}
23+
*/
24+
const hasValidMediaType = Object.values(requestBody.content).filter(mediaType => Object.values(mediaType).length > 0).length > 0;
1925
const contentSignatures = MediaType.generatePropertySignatures(
2026
entryPoint,
2127
currentPoint,
2228
factory,
23-
requestBody.content || {},
29+
hasValidMediaType ? requestBody.content : {},
2430
context,
2531
converterContext,
2632
);

src/utils.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ export const requestContentType = (operationId: string): string => `RequestConte
66
export const responseContentType = (operationId: string): string => `ResponseContentType$${operationId}`;
77

88
export const isAvailableVariableName = (text: string): boolean => {
9-
return /^[A-Za-z_0-9\s]+$/.test(text);
9+
return /^[A-Za-z_0-9]+$/.test(text);
1010
};
1111

1212
export const isFirstCharacterIsValidText = (text: string): boolean => {

0 commit comments

Comments
 (0)