Skip to content

Commit b32c85e

Browse files
committed
- Fixed quotes in enums
- Fixed better default operation name - Fixed unittest
1 parent ec2c712 commit b32c85e

File tree

14 files changed

+254
-51
lines changed

14 files changed

+254
-51
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
# Changelog
22
All notable changes to this project will be documented in this file.
33

4+
## [0.20.0] - 2022-02-25
5+
### Fixed
6+
- Support enums with single quotes in names
7+
- Generating better names when `operationId` is not given (breaking change)
8+
49
## [0.19.0] - 2022-02-02
510
### Added
611
- Support for Angular client with `--name` option

LICENSE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
MIT License
22

3-
Copyright (c) 2021 Ferdi Koomen
3+
Copyright (c) Ferdi Koomen
44

55
Permission is hereby granted, free of charge, to any person obtaining a copy
66
of this software and associated documentation files (the "Software"), to deal

src/openApi/v2/parser/escapeName.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { escapeName } from './escapeName';
22

33
describe('escapeName', () => {
44
it('should escape', () => {
5-
expect(escapeName('')).toEqual('');
5+
expect(escapeName('')).toEqual("''");
66
expect(escapeName('fooBar')).toEqual('fooBar');
77
expect(escapeName('Foo Bar')).toEqual(`'Foo Bar'`);
88
expect(escapeName('foo bar')).toEqual(`'foo bar'`);

src/openApi/v2/parser/getOperation.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export const getOperation = (
2020
pathParams: OperationParameters
2121
): Operation => {
2222
const serviceName = getServiceName(tag);
23-
const operationName = getOperationName(op.operationId || `${method}`);
23+
const operationName = getOperationName(url, method, op.operationId);
2424

2525
// Create a new operation object for this method.
2626
const operation: Operation = {

src/openApi/v2/parser/getOperationName.spec.ts

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,26 @@ import { getOperationName } from './getOperationName';
22

33
describe('getOperationName', () => {
44
it('should produce correct result', () => {
5-
expect(getOperationName('')).toEqual('');
6-
expect(getOperationName('FooBar')).toEqual('fooBar');
7-
expect(getOperationName('Foo Bar')).toEqual('fooBar');
8-
expect(getOperationName('foo bar')).toEqual('fooBar');
9-
expect(getOperationName('foo-bar')).toEqual('fooBar');
10-
expect(getOperationName('foo_bar')).toEqual('fooBar');
11-
expect(getOperationName('foo.bar')).toEqual('fooBar');
12-
expect(getOperationName('@foo.bar')).toEqual('fooBar');
13-
expect(getOperationName('$foo.bar')).toEqual('fooBar');
14-
expect(getOperationName('_foo.bar')).toEqual('fooBar');
15-
expect(getOperationName('-foo.bar')).toEqual('fooBar');
16-
expect(getOperationName('123.foo.bar')).toEqual('fooBar');
5+
expect(getOperationName('/api/v{api-version}/users', 'GET', 'GetAllUsers')).toEqual('getAllUsers');
6+
expect(getOperationName('/api/v{api-version}/users', 'GET', undefined)).toEqual('getApiUsers');
7+
expect(getOperationName('/api/v{api-version}/users', 'POST', undefined)).toEqual('postApiUsers');
8+
expect(getOperationName('/api/v1/users', 'GET', 'GetAllUsers')).toEqual('getAllUsers');
9+
expect(getOperationName('/api/v1/users', 'GET', undefined)).toEqual('getApiV1Users');
10+
expect(getOperationName('/api/v1/users', 'POST', undefined)).toEqual('postApiV1Users');
11+
expect(getOperationName('/api/v1/users/{id}', 'GET', undefined)).toEqual('getApiV1Users');
12+
expect(getOperationName('/api/v1/users/{id}', 'POST', undefined)).toEqual('postApiV1Users');
13+
14+
expect(getOperationName('/api/v{api-version}/users', 'GET', 'fooBar')).toEqual('fooBar');
15+
expect(getOperationName('/api/v{api-version}/users', 'GET', 'FooBar')).toEqual('fooBar');
16+
expect(getOperationName('/api/v{api-version}/users', 'GET', 'Foo Bar')).toEqual('fooBar');
17+
expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo bar')).toEqual('fooBar');
18+
expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo-bar')).toEqual('fooBar');
19+
expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo_bar')).toEqual('fooBar');
20+
expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo.bar')).toEqual('fooBar');
21+
expect(getOperationName('/api/v{api-version}/users', 'GET', '@foo.bar')).toEqual('fooBar');
22+
expect(getOperationName('/api/v{api-version}/users', 'GET', '$foo.bar')).toEqual('fooBar');
23+
expect(getOperationName('/api/v{api-version}/users', 'GET', '_foo.bar')).toEqual('fooBar');
24+
expect(getOperationName('/api/v{api-version}/users', 'GET', '-foo.bar')).toEqual('fooBar');
25+
expect(getOperationName('/api/v{api-version}/users', 'GET', '123.foo.bar')).toEqual('fooBar');
1726
});
1827
});

src/openApi/v2/parser/getOperationName.ts

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,23 @@ import camelCase from 'camelcase';
22

33
/**
44
* Convert the input value to a correct operation (method) classname.
5-
* This converts the input string to camelCase, so the method name follows
6-
* the most popular Javascript and Typescript writing style.
5+
* This will use the operation ID - if available - and otherwise fallback
6+
* on a generated name from the URL
77
*/
8-
export const getOperationName = (value: string): string => {
9-
const clean = value
10-
.replace(/^[^a-zA-Z]+/g, '')
11-
.replace(/[^\w\-]+/g, '-')
12-
.trim();
13-
return camelCase(clean);
8+
export const getOperationName = (url: string, method: string, operationId?: string): string => {
9+
if (operationId) {
10+
return camelCase(
11+
operationId
12+
.replace(/^[^a-zA-Z]+/g, '')
13+
.replace(/[^\w\-]+/g, '-')
14+
.trim()
15+
);
16+
}
17+
18+
const urlWithoutPlaceholders = url
19+
.replace(/[^/]*?{api-version}.*?\//g, '')
20+
.replace(/{(.*?)}/g, '')
21+
.replace(/\//g, '-');
22+
23+
return camelCase(`${method}-${urlWithoutPlaceholders}`);
1424
};

src/openApi/v3/parser/getEnum.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export const getEnum = (values?: (string | number)[]): Enum[] => {
2323
.replace(/^(\d+)/g, '_$1')
2424
.replace(/([a-z])([A-Z]+)/g, '$1_$2')
2525
.toUpperCase(),
26-
value: `'${value}'`,
26+
value: `'${value.replace(/'/g, "\\'")}'`,
2727
type: 'string',
2828
description: null,
2929
};

src/openApi/v3/parser/getOperation.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export const getOperation = (
2323
pathParams: OperationParameters
2424
): Operation => {
2525
const serviceName = getServiceName(tag);
26-
const operationName = getOperationName(op.operationId || `${method}`);
26+
const operationName = getOperationName(url, method, op.operationId);
2727

2828
// Create a new operation object for this method.
2929
const operation: Operation = {

src/openApi/v3/parser/getOperationName.spec.ts

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,26 @@ import { getOperationName } from './getOperationName';
22

33
describe('getOperationName', () => {
44
it('should produce correct result', () => {
5-
expect(getOperationName('')).toEqual('');
6-
expect(getOperationName('FooBar')).toEqual('fooBar');
7-
expect(getOperationName('Foo Bar')).toEqual('fooBar');
8-
expect(getOperationName('foo bar')).toEqual('fooBar');
9-
expect(getOperationName('foo-bar')).toEqual('fooBar');
10-
expect(getOperationName('foo_bar')).toEqual('fooBar');
11-
expect(getOperationName('foo.bar')).toEqual('fooBar');
12-
expect(getOperationName('@foo.bar')).toEqual('fooBar');
13-
expect(getOperationName('$foo.bar')).toEqual('fooBar');
14-
expect(getOperationName('_foo.bar')).toEqual('fooBar');
15-
expect(getOperationName('-foo.bar')).toEqual('fooBar');
16-
expect(getOperationName('123.foo.bar')).toEqual('fooBar');
5+
expect(getOperationName('/api/v{api-version}/users', 'GET', 'GetAllUsers')).toEqual('getAllUsers');
6+
expect(getOperationName('/api/v{api-version}/users', 'GET', undefined)).toEqual('getApiUsers');
7+
expect(getOperationName('/api/v{api-version}/users', 'POST', undefined)).toEqual('postApiUsers');
8+
expect(getOperationName('/api/v1/users', 'GET', 'GetAllUsers')).toEqual('getAllUsers');
9+
expect(getOperationName('/api/v1/users', 'GET', undefined)).toEqual('getApiV1Users');
10+
expect(getOperationName('/api/v1/users', 'POST', undefined)).toEqual('postApiV1Users');
11+
expect(getOperationName('/api/v1/users/{id}', 'GET', undefined)).toEqual('getApiV1Users');
12+
expect(getOperationName('/api/v1/users/{id}', 'POST', undefined)).toEqual('postApiV1Users');
13+
14+
expect(getOperationName('/api/v{api-version}/users', 'GET', 'fooBar')).toEqual('fooBar');
15+
expect(getOperationName('/api/v{api-version}/users', 'GET', 'FooBar')).toEqual('fooBar');
16+
expect(getOperationName('/api/v{api-version}/users', 'GET', 'Foo Bar')).toEqual('fooBar');
17+
expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo bar')).toEqual('fooBar');
18+
expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo-bar')).toEqual('fooBar');
19+
expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo_bar')).toEqual('fooBar');
20+
expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo.bar')).toEqual('fooBar');
21+
expect(getOperationName('/api/v{api-version}/users', 'GET', '@foo.bar')).toEqual('fooBar');
22+
expect(getOperationName('/api/v{api-version}/users', 'GET', '$foo.bar')).toEqual('fooBar');
23+
expect(getOperationName('/api/v{api-version}/users', 'GET', '_foo.bar')).toEqual('fooBar');
24+
expect(getOperationName('/api/v{api-version}/users', 'GET', '-foo.bar')).toEqual('fooBar');
25+
expect(getOperationName('/api/v{api-version}/users', 'GET', '123.foo.bar')).toEqual('fooBar');
1726
});
1827
});

src/openApi/v3/parser/getOperationName.ts

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,23 @@ import camelCase from 'camelcase';
22

33
/**
44
* Convert the input value to a correct operation (method) classname.
5-
* This converts the input string to camelCase, so the method name follows
6-
* the most popular Javascript and Typescript writing style.
5+
* This will use the operation ID - if available - and otherwise fallback
6+
* on a generated name from the URL
77
*/
8-
export const getOperationName = (value: string): string => {
9-
const clean = value
10-
.replace(/^[^a-zA-Z]+/g, '')
11-
.replace(/[^\w\-]+/g, '-')
12-
.trim();
13-
return camelCase(clean);
8+
export const getOperationName = (url: string, method: string, operationId?: string): string => {
9+
if (operationId) {
10+
return camelCase(
11+
operationId
12+
.replace(/^[^a-zA-Z]+/g, '')
13+
.replace(/[^\w\-]+/g, '-')
14+
.trim()
15+
);
16+
}
17+
18+
const urlWithoutPlaceholders = url
19+
.replace(/[^/]*?{api-version}.*?\//g, '')
20+
.replace(/{(.*?)}/g, '')
21+
.replace(/\//g, '-');
22+
23+
return camelCase(`${method}-${urlWithoutPlaceholders}`);
1424
};

0 commit comments

Comments
 (0)