Skip to content

Commit 4593fae

Browse files
committed
fix(parser): reference model name contains build-in type
1 parent b62ddb2 commit 4593fae

17 files changed

+545
-7
lines changed

src/helper.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,13 @@ export function toTypescriptType(type: string | undefined): string {
7676
return 'any';
7777
}
7878

79-
if (/^number|integer|double$/i.test(type)) {
79+
if (/^(number|integer|double)$/i.test(type)) {
8080
return 'number';
81-
} else if (/^string|boolean$/i.test(type)) {
81+
} else if (/^(string|boolean)$/i.test(type)) {
8282
return type.toLocaleLowerCase();
83-
} else if (/^object$/i.test(type)) {
83+
} else if (/^(object)$/i.test(type)) {
8484
return 'object';
85-
} else if (/^array$/i.test(type)) {
85+
} else if (/^(array)$/i.test(type)) {
8686
logWarn('Support for nested arrays is limited, using any[] as type');
8787
return 'any[]';
8888
}

src/helpers.tests.ts

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { removeDuplicateWords, toCamelCase } from './helper';
1+
import { removeDuplicateWords, toCamelCase, toTypescriptType } from './helper';
22

33
describe('[helpers] to camelCase', () => {
44
it('should convert dash to camelCase', () => {
@@ -34,3 +34,27 @@ describe('[helpers] remove duplicate words', () => {
3434
expect(removeDuplicateWords('UrlichUrl')).toEqual('UrlichUrl');
3535
});
3636
});
37+
38+
describe('[helpers] determine TS type', () => {
39+
it('should detect build-in types', () => {
40+
expect(toTypescriptType('integer')).toEqual('number');
41+
expect(toTypescriptType('Integer')).toEqual('number');
42+
expect(toTypescriptType('double')).toEqual('number');
43+
expect(toTypescriptType('number')).toEqual('number');
44+
45+
expect(toTypescriptType('string')).toEqual('string');
46+
expect(toTypescriptType('boolean')).toEqual('boolean');
47+
expect(toTypescriptType('Boolean')).toEqual('boolean');
48+
expect(toTypescriptType('object')).toEqual('object');
49+
expect(toTypescriptType('Object')).toEqual('object');
50+
expect(toTypescriptType('array')).toEqual('any[]');
51+
expect(toTypescriptType('Array')).toEqual('any[]');
52+
});
53+
54+
it('should NOT replace type by build-in types', () => {
55+
expect(toTypescriptType('modelInteger')).toEqual('ModelInteger');
56+
expect(toTypescriptType('MyString')).toEqual('MyString');
57+
expect(toTypescriptType('stringValue')).toEqual('StringValue');
58+
expect(toTypescriptType('Bool')).toEqual('Bool');
59+
});
60+
});

src/parser.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,7 @@ function determineArrayType(property: Schema = {}): string {
452452
if (property.items && property.items.$ref) {
453453
return typeName(dereferenceType(property.items.$ref));
454454
} else if (property.items && property.items.type) {
455-
if (/^array$/i.test(property.items.type || '')) {
455+
if (/^(array)$/i.test(property.items.type || '')) {
456456
return `${determineArrayType(property.items)}[]`;
457457
}
458458

@@ -593,7 +593,7 @@ function transformParameters(
593593
('type' in param && param.type) ||
594594
(paramRef && 'type' in paramRef && paramRef.type) ||
595595
'';
596-
const isArray = /^array$/i.test(type);
596+
const isArray = /^(array)$/i.test(type);
597597
const typescriptType =
598598
'enum' in param
599599
? (param.type === 'number'

tests/custom/api/guards/index.ts

Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,4 +272,195 @@ export function isTestModel(arg: any): arg is models.TestModel {
272272
);
273273
}
274274

275+
export function isV1ContentModelArray(arg: any): arg is models.V1ContentModelArray {
276+
return (
277+
arg != null &&
278+
typeof arg === 'object' &&
279+
// itemSchema?: V1ContentModelElement
280+
( typeof arg.itemSchema === 'undefined' || isV1ContentModelElement(arg.itemSchema) ) &&
281+
// meta?: V1ContentModelMetaInfo
282+
( typeof arg.meta === 'undefined' || isV1ContentModelMetaInfo(arg.meta) ) &&
283+
284+
true
285+
);
286+
}
287+
288+
export function isV1ContentModelBool(arg: any): arg is models.V1ContentModelBool {
289+
return (
290+
arg != null &&
291+
typeof arg === 'object' &&
292+
// default?: boolean
293+
( typeof arg.default === 'undefined' || typeof arg.default === 'boolean' ) &&
294+
// meta?: V1ContentModelMetaInfo
295+
( typeof arg.meta === 'undefined' || isV1ContentModelMetaInfo(arg.meta) ) &&
296+
297+
true
298+
);
299+
}
300+
301+
export function isV1ContentModelDouble(arg: any): arg is models.V1ContentModelDouble {
302+
return (
303+
arg != null &&
304+
typeof arg === 'object' &&
305+
// default?: number
306+
( typeof arg.default === 'undefined' || typeof arg.default === 'number' ) &&
307+
// enum?: number[]
308+
( typeof arg.enum === 'undefined' || (Array.isArray(arg.enum) && arg.enum.every((item: unknown) => typeof item === 'number')) ) &&
309+
// maximum?: number
310+
( typeof arg.maximum === 'undefined' || typeof arg.maximum === 'number' ) &&
311+
// meta?: V1ContentModelMetaInfo
312+
( typeof arg.meta === 'undefined' || isV1ContentModelMetaInfo(arg.meta) ) &&
313+
// minimum?: number
314+
( typeof arg.minimum === 'undefined' || typeof arg.minimum === 'number' ) &&
315+
316+
true
317+
);
318+
}
319+
320+
export function isV1ContentModelElement(arg: any): arg is models.V1ContentModelElement {
321+
return (
322+
arg != null &&
323+
typeof arg === 'object' &&
324+
// array?: V1ContentModelArray
325+
( typeof arg.array === 'undefined' || isV1ContentModelArray(arg.array) ) &&
326+
// bool?: V1ContentModelBool
327+
( typeof arg.bool === 'undefined' || isV1ContentModelBool(arg.bool) ) &&
328+
// double?: V1ContentModelDouble
329+
( typeof arg.double === 'undefined' || isV1ContentModelDouble(arg.double) ) &&
330+
// int?: V1ContentModelInteger
331+
( typeof arg.int === 'undefined' || isV1ContentModelInteger(arg.int) ) &&
332+
// meta?: V1ContentModelMetaInfo
333+
( typeof arg.meta === 'undefined' || isV1ContentModelMetaInfo(arg.meta) ) &&
334+
// object?: V1ContentModelObject
335+
( typeof arg.object === 'undefined' || isV1ContentModelObject(arg.object) ) &&
336+
// string?: V1ContentModelString
337+
( typeof arg.string === 'undefined' || isV1ContentModelString(arg.string) ) &&
338+
339+
true
340+
);
341+
}
342+
343+
export function isV1ContentModelField(arg: any): arg is models.V1ContentModelField {
344+
return (
345+
arg != null &&
346+
typeof arg === 'object' &&
347+
// array?: V1ContentModelArray
348+
( typeof arg.array === 'undefined' || isV1ContentModelArray(arg.array) ) &&
349+
// bool?: V1ContentModelBool
350+
( typeof arg.bool === 'undefined' || isV1ContentModelBool(arg.bool) ) &&
351+
// double?: V1ContentModelDouble
352+
( typeof arg.double === 'undefined' || isV1ContentModelDouble(arg.double) ) &&
353+
// int?: V1ContentModelInteger
354+
( typeof arg.int === 'undefined' || isV1ContentModelInteger(arg.int) ) &&
355+
// key?: string
356+
( typeof arg.key === 'undefined' || typeof arg.key === 'string' ) &&
357+
// meta?: V1ContentModelMetaInfo
358+
( typeof arg.meta === 'undefined' || isV1ContentModelMetaInfo(arg.meta) ) &&
359+
// object?: V1ContentModelObject
360+
( typeof arg.object === 'undefined' || isV1ContentModelObject(arg.object) ) &&
361+
// string?: V1ContentModelString
362+
( typeof arg.string === 'undefined' || isV1ContentModelString(arg.string) ) &&
363+
364+
true
365+
);
366+
}
367+
368+
export function isV1ContentModelInteger(arg: any): arg is models.V1ContentModelInteger {
369+
return (
370+
arg != null &&
371+
typeof arg === 'object' &&
372+
// default?: string
373+
( typeof arg.default === 'undefined' || typeof arg.default === 'string' ) &&
374+
// enum?: string[]
375+
( typeof arg.enum === 'undefined' || (Array.isArray(arg.enum) && arg.enum.every((item: unknown) => typeof item === 'string')) ) &&
376+
// maximum?: string
377+
( typeof arg.maximum === 'undefined' || typeof arg.maximum === 'string' ) &&
378+
// meta?: V1ContentModelMetaInfo
379+
( typeof arg.meta === 'undefined' || isV1ContentModelMetaInfo(arg.meta) ) &&
380+
// minimum?: string
381+
( typeof arg.minimum === 'undefined' || typeof arg.minimum === 'string' ) &&
382+
383+
true
384+
);
385+
}
386+
387+
export function isV1ContentModelMetaInfo(arg: any): arg is models.V1ContentModelMetaInfo {
388+
return (
389+
arg != null &&
390+
typeof arg === 'object' &&
391+
// comment?: string
392+
( typeof arg.comment === 'undefined' || typeof arg.comment === 'string' ) &&
393+
// customId?: string
394+
( typeof arg.customId === 'undefined' || typeof arg.customId === 'string' ) &&
395+
// description?: string
396+
( typeof arg.description === 'undefined' || typeof arg.description === 'string' ) &&
397+
// title?: string
398+
( typeof arg.title === 'undefined' || typeof arg.title === 'string' ) &&
399+
400+
true
401+
);
402+
}
403+
404+
export function isV1ContentModelObject(arg: any): arg is models.V1ContentModelObject {
405+
return (
406+
arg != null &&
407+
typeof arg === 'object' &&
408+
// fields?: V1ContentModelField[]
409+
( typeof arg.fields === 'undefined' || (Array.isArray(arg.fields) && arg.fields.every((item: unknown) => isV1ContentModelField(item))) ) &&
410+
// meta?: V1ContentModelMetaInfo
411+
( typeof arg.meta === 'undefined' || isV1ContentModelMetaInfo(arg.meta) ) &&
412+
413+
true
414+
);
415+
}
416+
417+
export function isV1ContentModelString(arg: any): arg is models.V1ContentModelString {
418+
return (
419+
arg != null &&
420+
typeof arg === 'object' &&
421+
// default?: string
422+
( typeof arg.default === 'undefined' || typeof arg.default === 'string' ) &&
423+
// enum?: string[]
424+
( typeof arg.enum === 'undefined' || (Array.isArray(arg.enum) && arg.enum.every((item: unknown) => typeof item === 'string')) ) &&
425+
// meta?: V1ContentModelMetaInfo
426+
( typeof arg.meta === 'undefined' || isV1ContentModelMetaInfo(arg.meta) ) &&
427+
// regex?: string
428+
( typeof arg.regex === 'undefined' || typeof arg.regex === 'string' ) &&
429+
430+
true
431+
);
432+
}
433+
434+
export function isV1ContentModelVersion(arg: any): arg is models.V1ContentModelVersion {
435+
return (
436+
arg != null &&
437+
typeof arg === 'object' &&
438+
// contentModelId?: string
439+
( typeof arg.contentModelId === 'undefined' || typeof arg.contentModelId === 'string' ) &&
440+
// contentModelVersionId?: string
441+
( typeof arg.contentModelVersionId === 'undefined' || typeof arg.contentModelVersionId === 'string' ) &&
442+
// createdAt?: string
443+
( typeof arg.createdAt === 'undefined' || typeof arg.createdAt === 'string' ) &&
444+
// nextVersionId?: string
445+
( typeof arg.nextVersionId === 'undefined' || typeof arg.nextVersionId === 'string' ) &&
446+
// previousVersionId?: string
447+
( typeof arg.previousVersionId === 'undefined' || typeof arg.previousVersionId === 'string' ) &&
448+
// schema?: V1ContentModelObject
449+
( typeof arg.schema === 'undefined' || isV1ContentModelObject(arg.schema) ) &&
450+
451+
true
452+
);
453+
}
454+
455+
export function isV1ContentModelVersionList(arg: any): arg is models.V1ContentModelVersionList {
456+
return (
457+
arg != null &&
458+
typeof arg === 'object' &&
459+
// versions?: V1ContentModelVersion[]
460+
( typeof arg.versions === 'undefined' || (Array.isArray(arg.versions) && arg.versions.every((item: unknown) => isV1ContentModelVersion(item))) ) &&
461+
462+
true
463+
);
464+
}
465+
275466

tests/custom/api/models/index.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,14 @@ export { Pet } from './pet.model';
1818
export { Possition } from './possition.enum';
1919
export { Right } from './right.enum';
2020
export { TestModel } from './test-model.model';
21+
export { V1ContentModelArray } from './v1-content-model-array.model';
22+
export { V1ContentModelBool } from './v1-content-model-bool.model';
23+
export { V1ContentModelDouble } from './v1-content-model-double.model';
24+
export { V1ContentModelElement } from './v1-content-model-element.model';
25+
export { V1ContentModelField } from './v1-content-model-field.model';
26+
export { V1ContentModelInteger } from './v1-content-model-integer.model';
27+
export { V1ContentModelMetaInfo } from './v1-content-model-meta-info.model';
28+
export { V1ContentModelObject } from './v1-content-model-object.model';
29+
export { V1ContentModelString } from './v1-content-model-string.model';
30+
export { V1ContentModelVersion } from './v1-content-model-version.model';
31+
export { V1ContentModelVersionList } from './v1-content-model-version-list.model';
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/* tslint:disable */
2+
import {
3+
V1ContentModelElement,
4+
V1ContentModelMetaInfo,
5+
} from '.';
6+
7+
export interface V1ContentModelArray {
8+
itemSchema?: V1ContentModelElement;
9+
meta?: V1ContentModelMetaInfo;
10+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
/* tslint:disable */
2+
import {
3+
V1ContentModelMetaInfo,
4+
} from '.';
5+
6+
export interface V1ContentModelBool {
7+
default?: boolean;
8+
meta?: V1ContentModelMetaInfo;
9+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/* tslint:disable */
2+
import {
3+
V1ContentModelMetaInfo,
4+
} from '.';
5+
6+
export interface V1ContentModelDouble {
7+
default?: number;
8+
enum?: number[];
9+
maximum?: number;
10+
meta?: V1ContentModelMetaInfo;
11+
minimum?: number;
12+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/* tslint:disable */
2+
import {
3+
V1ContentModelArray,
4+
V1ContentModelBool,
5+
V1ContentModelDouble,
6+
V1ContentModelInteger,
7+
V1ContentModelMetaInfo,
8+
V1ContentModelObject,
9+
V1ContentModelString,
10+
} from '.';
11+
12+
export interface V1ContentModelElement {
13+
array?: V1ContentModelArray;
14+
bool?: V1ContentModelBool;
15+
double?: V1ContentModelDouble;
16+
int?: V1ContentModelInteger;
17+
meta?: V1ContentModelMetaInfo;
18+
object?: V1ContentModelObject;
19+
string?: V1ContentModelString;
20+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/* tslint:disable */
2+
import {
3+
V1ContentModelArray,
4+
V1ContentModelBool,
5+
V1ContentModelDouble,
6+
V1ContentModelInteger,
7+
V1ContentModelMetaInfo,
8+
V1ContentModelObject,
9+
V1ContentModelString,
10+
} from '.';
11+
12+
export interface V1ContentModelField {
13+
array?: V1ContentModelArray;
14+
bool?: V1ContentModelBool;
15+
double?: V1ContentModelDouble;
16+
int?: V1ContentModelInteger;
17+
key?: string;
18+
meta?: V1ContentModelMetaInfo;
19+
object?: V1ContentModelObject;
20+
string?: V1ContentModelString;
21+
}

0 commit comments

Comments
 (0)