Skip to content

Commit aecdc3e

Browse files
committed
- Added postfix property for service names
- Added cross blob for node js implementations - Fixed unittests - Fixed typing issue with headers
1 parent 3b6716a commit aecdc3e

38 files changed

+5975
-5884
lines changed

.github/dependabot.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,7 @@ updates:
88
open-pull-requests-limit: 10
99
ignore:
1010
- dependency-name: "@types/node-fetch"
11+
- dependency-name: "abort-controller"
12+
- dependency-name: "cross-blob"
13+
- dependency-name: "form-data"
1114
- dependency-name: "node-fetch"

README.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ $ openapi --help
4747
--exportServices <value> Write services to disk (default: true)
4848
--exportModels <value> Write models to disk (default: true)
4949
--exportSchemas <value> Write schemas to disk (default: false)
50+
--postfix <value> Service name postfix (default: "Service")
5051
--request <value> Path to custom request file
5152
-h, --help display help for command
5253
@@ -459,10 +460,11 @@ This will generate a client that uses [`node-fetch`](https://www.npmjs.com/packa
459460
in order to compile and run this client, you might need to install the `[email protected]` dependencies:
460461

461462
```
462-
npm install @types/node-fetch --save-dev
463-
npm install abort-controller --save-dev
464-
npm install node-fetch --save-dev
465-
npm install form-data --save-dev
463+
npm install @types/[email protected] --save-dev
464+
npm install [email protected] --save-dev
465+
npm install [email protected] --save-dev
466+
npm install [email protected] --save-dev
467+
npm install [email protected] --save-dev
466468
```
467469

468470
In order to compile the project and resolve the imports, you will need to enable the `allowSyntheticDefaultImports`

bin/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ const params = program
1919
.option('--exportServices <value>', 'Write services to disk', true)
2020
.option('--exportModels <value>', 'Write models to disk', true)
2121
.option('--exportSchemas <value>', 'Write schemas to disk', false)
22+
.option('--postfix <value>', 'Service name postfix', 'Service')
2223
.option('--request <value>', 'Path to custom request file')
2324
.parse(process.argv)
2425
.opts();
@@ -36,6 +37,7 @@ if (OpenAPI) {
3637
exportServices: JSON.parse(params.exportServices) === true,
3738
exportModels: JSON.parse(params.exportModels) === true,
3839
exportSchemas: JSON.parse(params.exportSchemas) === true,
40+
postfix: params.postfix,
3941
request: params.request,
4042
})
4143
.then(() => {

package.json

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "openapi-typescript-codegen",
3-
"version": "0.11.8",
3+
"version": "0.12.0-alpha",
44
"description": "Library that generates Typescript clients based on the OpenAPI specification.",
55
"author": "Ferdi Koomen",
66
"homepage": "https://github.com/ferdikoomen/openapi-typescript-codegen",
@@ -65,6 +65,7 @@
6565
"axios": "^0.24.0",
6666
"camelcase": "^6.2.0",
6767
"commander": "^8.3.0",
68+
"cross-blob": "^2.0.1",
6869
"form-data": "^4.0.0",
6970
"handlebars": "^4.7.6",
7071
"json-schema-ref-parser": "^9.0.7",
@@ -82,10 +83,10 @@
8283
"@types/express": "4.17.13",
8384
"@types/glob": "7.2.0",
8485
"@types/jest": "27.0.2",
85-
"@types/node": "16.11.6",
86+
"@types/node": "16.11.7",
8687
"@types/qs": "6.9.7",
87-
"@typescript-eslint/eslint-plugin": "5.3.0",
88-
"@typescript-eslint/parser": "5.3.0",
88+
"@typescript-eslint/eslint-plugin": "5.3.1",
89+
"@typescript-eslint/parser": "5.3.1",
8990
"codecov": "3.8.3",
9091
"eslint": "8.2.0",
9192
"eslint-config-prettier": "8.3.0",

src/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export type Options = {
2020
exportServices?: boolean;
2121
exportModels?: boolean;
2222
exportSchemas?: boolean;
23+
postfix?: string;
2324
request?: string;
2425
write?: boolean;
2526
};
@@ -37,6 +38,7 @@ export type Options = {
3738
* @param exportServices: Generate services
3839
* @param exportModels: Generate models
3940
* @param exportSchemas: Generate schemas
41+
* @param postfix: Service name postfix
4042
* @param request: Path to custom request file
4143
* @param write Write the files to disk (true or false)
4244
*/
@@ -50,6 +52,7 @@ export async function generate({
5052
exportServices = true,
5153
exportModels = true,
5254
exportSchemas = false,
55+
postfix = 'Service',
5356
request,
5457
write = true,
5558
}: Options): Promise<void> {
@@ -77,6 +80,7 @@ export async function generate({
7780
exportServices,
7881
exportModels,
7982
exportSchemas,
83+
postfix,
8084
request
8185
);
8286
break;
@@ -97,6 +101,7 @@ export async function generate({
97101
exportServices,
98102
exportModels,
99103
exportSchemas,
104+
postfix,
100105
request
101106
);
102107
break;
Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
1-
import { getMappedType } from './getMappedType';
2-
3-
describe('getMappedType', () => {
4-
it('should map types to the basics', () => {
5-
expect(getMappedType('File')).toEqual('binary');
6-
expect(getMappedType('file')).toEqual('binary');
7-
expect(getMappedType('string')).toEqual('string');
8-
expect(getMappedType('date')).toEqual('string');
9-
expect(getMappedType('date-time')).toEqual('string');
10-
expect(getMappedType('float')).toEqual('number');
11-
expect(getMappedType('double')).toEqual('number');
12-
expect(getMappedType('short')).toEqual('number');
13-
expect(getMappedType('int')).toEqual('number');
14-
expect(getMappedType('boolean')).toEqual('boolean');
15-
expect(getMappedType('any')).toEqual('any');
16-
expect(getMappedType('object')).toEqual('any');
17-
expect(getMappedType('void')).toEqual('void');
18-
expect(getMappedType('null')).toEqual('null');
19-
expect(getMappedType('unknown')).toEqual(undefined);
20-
expect(getMappedType('')).toEqual(undefined);
21-
});
22-
});
1+
import { getMappedType } from './getMappedType';
2+
3+
describe('getMappedType', () => {
4+
it('should map types to the basics', () => {
5+
expect(getMappedType('File')).toEqual('binary');
6+
expect(getMappedType('file')).toEqual('binary');
7+
expect(getMappedType('string')).toEqual('string');
8+
expect(getMappedType('date')).toEqual('string');
9+
expect(getMappedType('date-time')).toEqual('string');
10+
expect(getMappedType('float')).toEqual('number');
11+
expect(getMappedType('double')).toEqual('number');
12+
expect(getMappedType('short')).toEqual('number');
13+
expect(getMappedType('int')).toEqual('number');
14+
expect(getMappedType('boolean')).toEqual('boolean');
15+
expect(getMappedType('any')).toEqual('any');
16+
expect(getMappedType('object')).toEqual('any');
17+
expect(getMappedType('void')).toEqual('void');
18+
expect(getMappedType('null')).toEqual('null');
19+
expect(getMappedType('unknown')).toEqual(undefined);
20+
expect(getMappedType('')).toEqual(undefined);
21+
});
22+
});
Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,33 @@
1-
const TYPE_MAPPINGS = new Map<string, string>([
2-
['File', 'binary'],
3-
['file', 'binary'],
4-
['any', 'any'],
5-
['object', 'any'],
6-
['array', 'any[]'],
7-
['boolean', 'boolean'],
8-
['byte', 'number'],
9-
['int', 'number'],
10-
['integer', 'number'],
11-
['float', 'number'],
12-
['double', 'number'],
13-
['short', 'number'],
14-
['long', 'number'],
15-
['number', 'number'],
16-
['char', 'string'],
17-
['date', 'string'],
18-
['date-time', 'string'],
19-
['password', 'string'],
20-
['string', 'string'],
21-
['void', 'void'],
22-
['null', 'null'],
23-
]);
24-
25-
/**
26-
* Get mapped type for given type to any basic Typescript/Javascript type.
27-
*/
28-
export function getMappedType(type: string, format?: string): string | undefined {
29-
if (format === 'binary') {
30-
return 'binary';
31-
}
32-
return TYPE_MAPPINGS.get(type);
33-
}
1+
const TYPE_MAPPINGS = new Map<string, string>([
2+
['File', 'binary'],
3+
['file', 'binary'],
4+
['any', 'any'],
5+
['object', 'any'],
6+
['array', 'any[]'],
7+
['boolean', 'boolean'],
8+
['byte', 'number'],
9+
['int', 'number'],
10+
['integer', 'number'],
11+
['float', 'number'],
12+
['double', 'number'],
13+
['short', 'number'],
14+
['long', 'number'],
15+
['number', 'number'],
16+
['char', 'string'],
17+
['date', 'string'],
18+
['date-time', 'string'],
19+
['password', 'string'],
20+
['string', 'string'],
21+
['void', 'void'],
22+
['null', 'null'],
23+
]);
24+
25+
/**
26+
* Get mapped type for given type to any basic Typescript/Javascript type.
27+
*/
28+
export function getMappedType(type: string, format?: string): string | undefined {
29+
if (format === 'binary') {
30+
return 'binary';
31+
}
32+
return TYPE_MAPPINGS.get(type);
33+
}

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

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,11 @@ import { getServiceClassName } from './getServiceClassName';
33
describe('getServiceClassName', () => {
44
it('should produce correct result', () => {
55
expect(getServiceClassName('')).toEqual('');
6-
expect(getServiceClassName('FooBar')).toEqual('FooBarService');
7-
expect(getServiceClassName('Foo Bar')).toEqual('FooBarService');
8-
expect(getServiceClassName('foo bar')).toEqual('FooBarService');
9-
expect(getServiceClassName('FooBarService')).toEqual('FooBarService');
10-
expect(getServiceClassName('Foo Bar Service')).toEqual('FooBarService');
11-
expect(getServiceClassName('foo bar service')).toEqual('FooBarService');
12-
expect(getServiceClassName('@fooBar')).toEqual('FooBarService');
13-
expect(getServiceClassName('$fooBar')).toEqual('FooBarService');
14-
expect(getServiceClassName('123fooBar')).toEqual('FooBarService');
6+
expect(getServiceClassName('FooBar')).toEqual('FooBar');
7+
expect(getServiceClassName('Foo Bar')).toEqual('FooBar');
8+
expect(getServiceClassName('foo bar')).toEqual('FooBar');
9+
expect(getServiceClassName('@fooBar')).toEqual('FooBar');
10+
expect(getServiceClassName('$fooBar')).toEqual('FooBar');
11+
expect(getServiceClassName('123fooBar')).toEqual('FooBar');
1512
});
1613
});

src/openApi/v2/parser/getServiceClassName.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,12 @@ import camelCase from 'camelcase';
22

33
/**
44
* Convert the input value to a correct service classname. This converts
5-
* the input string to PascalCase and appends the "Service" prefix if needed.
5+
* the input string to PascalCase.
66
*/
77
export function getServiceClassName(value: string): string {
88
const clean = value
99
.replace(/^[^a-zA-Z]+/g, '')
1010
.replace(/[^\w\-]+/g, '-')
1111
.trim();
12-
const name = camelCase(clean, { pascalCase: true });
13-
if (name && !name.endsWith('Service')) {
14-
return `${name}Service`;
15-
}
16-
return name;
12+
return camelCase(clean, { pascalCase: true });
1713
}
Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
1-
import { getMappedType } from './getMappedType';
2-
3-
describe('getMappedType', () => {
4-
it('should map types to the basics', () => {
5-
expect(getMappedType('File')).toEqual('binary');
6-
expect(getMappedType('file')).toEqual('binary');
7-
expect(getMappedType('string')).toEqual('string');
8-
expect(getMappedType('date')).toEqual('string');
9-
expect(getMappedType('date-time')).toEqual('string');
10-
expect(getMappedType('float')).toEqual('number');
11-
expect(getMappedType('double')).toEqual('number');
12-
expect(getMappedType('short')).toEqual('number');
13-
expect(getMappedType('int')).toEqual('number');
14-
expect(getMappedType('boolean')).toEqual('boolean');
15-
expect(getMappedType('any')).toEqual('any');
16-
expect(getMappedType('object')).toEqual('any');
17-
expect(getMappedType('void')).toEqual('void');
18-
expect(getMappedType('null')).toEqual('null');
19-
expect(getMappedType('unknown')).toEqual(undefined);
20-
expect(getMappedType('')).toEqual(undefined);
21-
});
22-
});
1+
import { getMappedType } from './getMappedType';
2+
3+
describe('getMappedType', () => {
4+
it('should map types to the basics', () => {
5+
expect(getMappedType('File')).toEqual('binary');
6+
expect(getMappedType('file')).toEqual('binary');
7+
expect(getMappedType('string')).toEqual('string');
8+
expect(getMappedType('date')).toEqual('string');
9+
expect(getMappedType('date-time')).toEqual('string');
10+
expect(getMappedType('float')).toEqual('number');
11+
expect(getMappedType('double')).toEqual('number');
12+
expect(getMappedType('short')).toEqual('number');
13+
expect(getMappedType('int')).toEqual('number');
14+
expect(getMappedType('boolean')).toEqual('boolean');
15+
expect(getMappedType('any')).toEqual('any');
16+
expect(getMappedType('object')).toEqual('any');
17+
expect(getMappedType('void')).toEqual('void');
18+
expect(getMappedType('null')).toEqual('null');
19+
expect(getMappedType('unknown')).toEqual(undefined);
20+
expect(getMappedType('')).toEqual(undefined);
21+
});
22+
});

0 commit comments

Comments
 (0)