Skip to content

Commit 9cf1c8f

Browse files
committed
feat(enums): custom enum key names via custom x-enumNames property
1 parent 092a8d5 commit 9cf1c8f

File tree

6 files changed

+565
-505
lines changed

6 files changed

+565
-505
lines changed

README.md

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,9 +164,26 @@ StaticInjectorError(AppModule)[APIClient -> HttpClient]:
164164
NullInjectorError: No provider for HttpClient!
165165
```
166166

167-
Fix:
167+
**Fix:**
168168
- add `HttpClientModule` to your root module (see NgModule imports in [usage](https://github.com/flowup/api-client-generator#how-to-use-generated-client))
169169

170+
### Numeric Enums keys generated as plane number
171+
172+
If some of your numeric enums look like this, the problem might be that in the swagger file you are not describing the keys properly.
173+
174+
```
175+
export enum MyEnum {
176+
0 = 0,
177+
1 = 1,
178+
2 = 2,
179+
}
180+
```
181+
182+
**Fix**
183+
We currently support two options:
184+
- formatting description into array of `['1 Foo', '2 Bar']`
185+
- using `'x-enumNames'` custom property that should be in format `['Foo', 'Bar']`
186+
170187
# Problem reporting and contributions
171188

172189
Please report any problems you have any issues you find so they can be resolved.

src/parser.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ type ExtendedParameter = (SwaggerParameter) & {
4343
schema: Schema;
4444
type: 'string' | 'integer';
4545
required: boolean;
46+
'x-enumNames'?: string[];
4647
};
4748

4849
interface Definitions {
@@ -189,7 +190,13 @@ function parseDefinitions(
189190

190191
function defineEnumOrInterface(key: string, definition: Schema | ExtendedParameter): Definition {
191192
return definition.enum && definition.enum.length !== 0
192-
? defineEnum(definition.enum, key, definition.type === 'integer', definition.description)
193+
? defineEnum(
194+
definition.enum,
195+
key,
196+
definition.type === 'integer',
197+
definition.description,
198+
(definition as ExtendedParameter)['x-enumNames'],
199+
)
193200
: defineInterface(('schema' in definition ? definition.schema : definition) || {}, key);
194201
}
195202

@@ -198,6 +205,7 @@ function defineEnum(
198205
definitionKey: string,
199206
isNumeric: boolean = false,
200207
enumDesc: string = '',
208+
xEnumNames: string[] = [],
201209
): Definition {
202210
const splitDesc = enumDesc.split('\n');
203211
const descKeys: { [key: string]: string } | null = splitDesc.length > 1
@@ -212,10 +220,10 @@ function defineEnum(
212220

213221
return {
214222
name: typeName(definitionKey),
215-
properties: enumSchema && enumSchema.map((val) => ({
223+
properties: enumSchema && enumSchema.map((val, index) => ({
216224
name: (
217225
isNumeric
218-
? descKeys ? descKeys[val.toString()] : val.toString()
226+
? descKeys ? descKeys[val.toString()] : xEnumNames[index] || `${val}`
219227
: val.toString()
220228
).replace(/[\W\s]+/, '_'),
221229
value: val.toString(),

tests/with-all-tags/api/models/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@ export { DummySelectorViewModel } from './dummy-selector-view-model.model';
77
export { DummyViewModel } from './dummy-view-model.model';
88
export { ProjectTypeViewModel } from './project-type-view-model.model';
99
export { RowModel } from './row-model.model';
10+
export { StatusSeverity } from './status-severity.enum';
1011
export { WidgetModel } from './widget-model.model';
1112
export { WidgetTypeViewModel } from './widget-type-view-model.model';
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
/* tslint:disable */
2+
3+
export enum StatusSeverity {
4+
Unknown = 0,
5+
OK = 1,
6+
Warning = 2,
7+
Error = 3,
8+
Critical = 4,
9+
}

tests/with-all-tags/api/models/widget-type-view-model.model.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
/* tslint:disable */
2+
import {
3+
StatusSeverity,
4+
} from '.';
25

36
export interface WidgetTypeViewModel {
47
Beschreibung?: string;
@@ -9,6 +12,7 @@ export interface WidgetTypeViewModel {
912
Order?: number;
1013
OrganizerTaskId?: number;
1114
RefSystem?: { [key: string]: string };
15+
Severity?: StatusSeverity;
1216
SysApplicationId?: number;
1317
Titel?: string;
1418
}

0 commit comments

Comments
 (0)