Skip to content

Commit be5161a

Browse files
committed
Escaping regexp pattern properly
1 parent 97f8204 commit be5161a

17 files changed

+109
-16
lines changed

src/openApi/v2/parser/getModel.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { getComment } from './getComment';
77
import { getEnum } from './getEnum';
88
import { getEnumFromDescription } from './getEnumFromDescription';
99
import { getModelProperties } from './getModelProperties';
10+
import { getPattern } from './getPattern';
1011
import { getType } from './getType';
1112

1213
export function getModel(openApi: OpenApi, definition: OpenApiSchema, isDefinition: boolean = false, name: string = ''): Model {
@@ -30,12 +31,12 @@ export function getModel(openApi: OpenApi, definition: OpenApiSchema, isDefiniti
3031
multipleOf: definition.multipleOf,
3132
maxLength: definition.maxLength,
3233
minLength: definition.minLength,
33-
pattern: definition.pattern,
3434
maxItems: definition.maxItems,
3535
minItems: definition.minItems,
3636
uniqueItems: definition.uniqueItems,
3737
maxProperties: definition.maxProperties,
3838
minProperties: definition.minProperties,
39+
pattern: getPattern(definition.pattern),
3940
imports: [],
4041
extends: [],
4142
enum: [],

src/openApi/v2/parser/getModelProperties.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type { OpenApi } from '../interfaces/OpenApi';
33
import type { OpenApiSchema } from '../interfaces/OpenApiSchema';
44
import { escapeName } from './escapeName';
55
import { getComment } from './getComment';
6+
import { getPattern } from './getPattern';
67
import { getType } from './getType';
78

89
// Fix for circular dependency between getModel and getModelProperties
@@ -36,12 +37,12 @@ export function getModelProperties(openApi: OpenApi, definition: OpenApiSchema,
3637
multipleOf: property.multipleOf,
3738
maxLength: property.maxLength,
3839
minLength: property.minLength,
39-
pattern: property.pattern,
4040
maxItems: property.maxItems,
4141
minItems: property.minItems,
4242
uniqueItems: property.uniqueItems,
4343
maxProperties: property.maxProperties,
4444
minProperties: property.minProperties,
45+
pattern: getPattern(property.pattern),
4546
imports: model.imports,
4647
extends: [],
4748
enum: [],
@@ -70,12 +71,12 @@ export function getModelProperties(openApi: OpenApi, definition: OpenApiSchema,
7071
multipleOf: property.multipleOf,
7172
maxLength: property.maxLength,
7273
minLength: property.minLength,
73-
pattern: property.pattern,
7474
maxItems: property.maxItems,
7575
minItems: property.minItems,
7676
uniqueItems: property.uniqueItems,
7777
maxProperties: property.maxProperties,
7878
minProperties: property.minProperties,
79+
pattern: getPattern(property.pattern),
7980
imports: model.imports,
8081
extends: model.extends,
8182
enum: model.enum,

src/openApi/v2/parser/getOperationParameter.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { getEnumFromDescription } from './getEnumFromDescription';
99
import { getModel } from './getModel';
1010
import { getOperationParameterDefault } from './getOperationParameterDefault';
1111
import { getOperationParameterName } from './getOperationParameterName';
12+
import { getPattern } from './getPattern';
1213
import { getType } from './getType';
1314

1415
export function getOperationParameter(openApi: OpenApi, parameter: OpenApiParameter): OperationParameter {
@@ -34,10 +35,10 @@ export function getOperationParameter(openApi: OpenApi, parameter: OpenApiParame
3435
multipleOf: parameter.multipleOf,
3536
maxLength: parameter.maxLength,
3637
minLength: parameter.minLength,
37-
pattern: parameter.pattern,
3838
maxItems: parameter.maxItems,
3939
minItems: parameter.minItems,
4040
uniqueItems: parameter.uniqueItems,
41+
pattern: getPattern(parameter.pattern),
4142
imports: [],
4243
extends: [],
4344
enum: [],

src/openApi/v2/parser/getOperationResponse.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import type { OpenApiResponse } from '../interfaces/OpenApiResponse';
44
import { PrimaryType } from './constants';
55
import { getComment } from './getComment';
66
import { getModel } from './getModel';
7+
import { getPattern } from './getPattern';
78
import { getType } from './getType';
89

910
export function getOperationResponse(openApi: OpenApi, response: OpenApiResponse, responseCode: number): OperationResponse {
@@ -73,12 +74,12 @@ export function getOperationResponse(openApi: OpenApi, response: OpenApiResponse
7374
operationResponse.multipleOf = model.multipleOf;
7475
operationResponse.maxLength = model.maxLength;
7576
operationResponse.minLength = model.minLength;
76-
operationResponse.pattern = model.pattern;
7777
operationResponse.maxItems = model.maxItems;
7878
operationResponse.minItems = model.minItems;
7979
operationResponse.uniqueItems = model.uniqueItems;
8080
operationResponse.maxProperties = model.maxProperties;
8181
operationResponse.minProperties = model.minProperties;
82+
operationResponse.pattern = getPattern(model.pattern);
8283
operationResponse.imports.push(...model.imports);
8384
operationResponse.extends.push(...model.extends);
8485
operationResponse.enum.push(...model.enum);
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { getPattern } from './getPattern';
2+
3+
describe('getPattern', () => {
4+
it('should produce correct result', () => {
5+
expect(getPattern()).toEqual(undefined);
6+
expect(getPattern('')).toEqual('');
7+
expect(getPattern('^[a-zA-Z]')).toEqual('^[a-zA-Z]');
8+
expect(getPattern('^\\w+$')).toEqual('^\\\\w+$');
9+
expect(getPattern('^\\d{3}-\\d{2}-\\d{4}$')).toEqual('^\\\\d{3}-\\\\d{2}-\\\\d{4}$');
10+
expect(getPattern('\\')).toEqual('\\\\');
11+
expect(getPattern('\\/')).toEqual('\\\\/');
12+
expect(getPattern('\\/\\/')).toEqual('\\\\/\\\\/');
13+
});
14+
});

src/openApi/v2/parser/getPattern.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/**
2+
* The spec generates a pattern like this '^\d{3}-\d{2}-\d{4}$'
3+
* However, to use it in HTML or inside new RegExp() we need to
4+
* escape the pattern to become: '^\\d{3}-\\d{2}-\\d{4}$' in order
5+
* to make it a valid regexp string.
6+
* @param pattern
7+
*/
8+
export function getPattern(pattern?: string): string | undefined {
9+
return pattern?.replace(/\\/g, '\\\\');
10+
}

src/openApi/v3/parser/getModel.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { getEnum } from './getEnum';
88
import { getEnumFromDescription } from './getEnumFromDescription';
99
import { getModelDefault } from './getModelDefault';
1010
import { getModelProperties } from './getModelProperties';
11+
import { getPattern } from './getPattern';
1112
import { getType } from './getType';
1213

1314
export function getModel(openApi: OpenApi, definition: OpenApiSchema, isDefinition: boolean = false, name: string = ''): Model {
@@ -31,12 +32,12 @@ export function getModel(openApi: OpenApi, definition: OpenApiSchema, isDefiniti
3132
multipleOf: definition.multipleOf,
3233
maxLength: definition.maxLength,
3334
minLength: definition.minLength,
34-
pattern: definition.pattern,
3535
maxItems: definition.maxItems,
3636
minItems: definition.minItems,
3737
uniqueItems: definition.uniqueItems,
3838
maxProperties: definition.maxProperties,
3939
minProperties: definition.minProperties,
40+
pattern: getPattern(definition.pattern),
4041
imports: [],
4142
extends: [],
4243
enum: [],

src/openApi/v3/parser/getModelProperties.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type { OpenApi } from '../interfaces/OpenApi';
33
import type { OpenApiSchema } from '../interfaces/OpenApiSchema';
44
import { escapeName } from './escapeName';
55
import { getComment } from './getComment';
6+
import { getPattern } from './getPattern';
67
import { getType } from './getType';
78

89
// Fix for circular dependency between getModel and getModelProperties
@@ -36,12 +37,12 @@ export function getModelProperties(openApi: OpenApi, definition: OpenApiSchema,
3637
multipleOf: property.multipleOf,
3738
maxLength: property.maxLength,
3839
minLength: property.minLength,
39-
pattern: property.pattern,
4040
maxItems: property.maxItems,
4141
minItems: property.minItems,
4242
uniqueItems: property.uniqueItems,
4343
maxProperties: property.maxProperties,
4444
minProperties: property.minProperties,
45+
pattern: getPattern(property.pattern),
4546
imports: model.imports,
4647
extends: [],
4748
enum: [],
@@ -70,12 +71,12 @@ export function getModelProperties(openApi: OpenApi, definition: OpenApiSchema,
7071
multipleOf: property.multipleOf,
7172
maxLength: property.maxLength,
7273
minLength: property.minLength,
73-
pattern: property.pattern,
7474
maxItems: property.maxItems,
7575
minItems: property.minItems,
7676
uniqueItems: property.uniqueItems,
7777
maxProperties: property.maxProperties,
7878
minProperties: property.minProperties,
79+
pattern: getPattern(property.pattern),
7980
imports: model.imports,
8081
extends: model.extends,
8182
enum: model.enum,

src/openApi/v3/parser/getOperationParameter.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { getComment } from './getComment';
66
import { getModel } from './getModel';
77
import { getModelDefault } from './getModelDefault';
88
import { getOperationParameterName } from './getOperationParameterName';
9+
import { getPattern } from './getPattern';
910
import { getType } from './getType';
1011

1112
export function getOperationParameter(openApi: OpenApi, parameter: OpenApiParameter): OperationParameter {
@@ -68,12 +69,12 @@ export function getOperationParameter(openApi: OpenApi, parameter: OpenApiParame
6869
operationParameter.multipleOf = model.multipleOf;
6970
operationParameter.maxLength = model.maxLength;
7071
operationParameter.minLength = model.minLength;
71-
operationParameter.pattern = model.pattern;
7272
operationParameter.maxItems = model.maxItems;
7373
operationParameter.minItems = model.minItems;
7474
operationParameter.uniqueItems = model.uniqueItems;
7575
operationParameter.maxProperties = model.maxProperties;
7676
operationParameter.minProperties = model.minProperties;
77+
operationParameter.pattern = getPattern(model.pattern);
7778
operationParameter.default = model.default;
7879
operationParameter.imports.push(...model.imports);
7980
operationParameter.extends.push(...model.extends);

src/openApi/v3/parser/getOperationRequestBody.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { PrimaryType } from './constants';
55
import { getComment } from './getComment';
66
import { getContent } from './getContent';
77
import { getModel } from './getModel';
8+
import { getPattern } from './getPattern';
89
import { getType } from './getType';
910

1011
export function getOperationRequestBody(openApi: OpenApi, parameter: OpenApiRequestBody): OperationParameter {
@@ -59,12 +60,12 @@ export function getOperationRequestBody(openApi: OpenApi, parameter: OpenApiRequ
5960
requestBody.multipleOf = model.multipleOf;
6061
requestBody.maxLength = model.maxLength;
6162
requestBody.minLength = model.minLength;
62-
requestBody.pattern = model.pattern;
6363
requestBody.maxItems = model.maxItems;
6464
requestBody.minItems = model.minItems;
6565
requestBody.uniqueItems = model.uniqueItems;
6666
requestBody.maxProperties = model.maxProperties;
6767
requestBody.minProperties = model.minProperties;
68+
requestBody.pattern = getPattern(model.pattern);
6869
requestBody.imports.push(...model.imports);
6970
requestBody.extends.push(...model.extends);
7071
requestBody.enum.push(...model.enum);

0 commit comments

Comments
 (0)