Skip to content

Commit 18bf2f7

Browse files
committed
- Cleanup of old extend system
1 parent bb78808 commit 18bf2f7

29 files changed

+156
-291
lines changed

src/client/interfaces/Model.d.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ export interface Model extends Schema {
1111
description: string | null;
1212
default?: string;
1313
imports: string[];
14-
extends: string[];
1514
enum: Enum[];
1615
enums: Model[];
1716
properties: Model[];

src/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export enum HttpClient {
1313
NODE = 'node',
1414
}
1515

16-
export interface Options {
16+
export type Options = {
1717
input: string | Record<string, any>;
1818
output: string;
1919
httpClient?: HttpClient;
@@ -24,7 +24,7 @@ export interface Options {
2424
exportModels?: boolean;
2525
exportSchemas?: boolean;
2626
write?: boolean;
27-
}
27+
};
2828

2929
/**
3030
* Generate the OpenAPI client. This method will read the OpenAPI specification and based on the

src/openApi/v2/parser/getModel.ts

Lines changed: 14 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,21 @@ import { extendEnum } from './extendEnum';
55
import { getComment } from './getComment';
66
import { getEnum } from './getEnum';
77
import { getEnumFromDescription } from './getEnumFromDescription';
8+
import { getModelComposition } from './getModelComposition';
89
import { getModelProperties } from './getModelProperties';
910
import { getPattern } from './getPattern';
1011
import { getType } from './getType';
1112

1213
export function getModel(openApi: OpenApi, definition: OpenApiSchema, isDefinition: boolean = false, name: string = ''): Model {
1314
const model: Model = {
14-
name: name,
15+
name,
1516
export: 'interface',
1617
type: 'any',
1718
base: 'any',
1819
template: null,
1920
link: null,
2021
description: getComment(definition.description),
21-
isDefinition: isDefinition,
22+
isDefinition,
2223
isReadOnly: definition.readOnly === true,
2324
isNullable: definition['x-nullable'] === true,
2425
isRequired: false,
@@ -37,7 +38,6 @@ export function getModel(openApi: OpenApi, definition: OpenApiSchema, isDefiniti
3738
minProperties: definition.minProperties,
3839
pattern: getPattern(definition.pattern),
3940
imports: [],
40-
extends: [],
4141
enum: [],
4242
enums: [],
4343
properties: [],
@@ -118,42 +118,30 @@ export function getModel(openApi: OpenApi, definition: OpenApiSchema, isDefiniti
118118
}
119119
}
120120

121-
if (definition.type === 'object' || definition.allOf) {
121+
if (definition.allOf?.length) {
122+
const composition = getModelComposition(openApi, definition.allOf, 'all-of', getModel);
123+
model.export = composition.type;
124+
model.imports.push(...composition.imports);
125+
model.enums.push(...composition.enums);
126+
model.properties.push(...composition.properties);
127+
return model;
128+
}
129+
130+
if (definition.type === 'object') {
122131
model.export = 'interface';
123132
model.type = 'any';
124133
model.base = 'any';
125134

126-
if (definition.allOf?.length) {
127-
definition.allOf.forEach(parent => {
128-
if (parent.$ref) {
129-
const parentRef = getType(parent.$ref);
130-
model.extends.push(parentRef.base);
131-
model.imports.push(parentRef.base);
132-
}
133-
if (parent.type === 'object' && parent.properties) {
134-
const properties = getModelProperties(openApi, parent, getModel);
135-
properties.forEach(property => {
136-
model.properties.push(property);
137-
model.imports.push(...property.imports);
138-
if (property.export === 'enum') {
139-
model.enums.push(property);
140-
}
141-
});
142-
}
143-
});
144-
}
145-
146135
if (definition.properties) {
147136
const properties = getModelProperties(openApi, definition, getModel);
148137
properties.forEach(property => {
149-
model.properties.push(property);
150138
model.imports.push(...property.imports);
139+
model.properties.push(property);
151140
if (property.export === 'enum') {
152141
model.enums.push(property);
153142
}
154143
});
155144
}
156-
157145
return model;
158146
}
159147

src/openApi/v2/parser/getModelProperties.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ export function getModelProperties(openApi: OpenApi, definition: OpenApiSchema,
4545
minProperties: property.minProperties,
4646
pattern: getPattern(property.pattern),
4747
imports: model.imports,
48-
extends: [],
4948
enum: [],
5049
enums: [],
5150
properties: [],
@@ -79,7 +78,6 @@ export function getModelProperties(openApi: OpenApi, definition: OpenApiSchema,
7978
minProperties: property.minProperties,
8079
pattern: getPattern(property.pattern),
8180
imports: model.imports,
82-
extends: model.extends,
8381
enum: model.enum,
8482
enums: model.enums,
8583
properties: model.properties,

src/openApi/v2/parser/getOperationParameter.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ export function getOperationParameter(openApi: OpenApi, parameter: OpenApiParame
3939
uniqueItems: parameter.uniqueItems,
4040
pattern: getPattern(parameter.pattern),
4141
imports: [],
42-
extends: [],
4342
enum: [],
4443
enums: [],
4544
properties: [],
@@ -121,7 +120,6 @@ export function getOperationParameter(openApi: OpenApi, parameter: OpenApiParame
121120
operationParameter.template = model.template;
122121
operationParameter.link = model.link;
123122
operationParameter.imports.push(...model.imports);
124-
operationParameter.extends.push(...model.extends);
125123
operationParameter.enum.push(...model.enum);
126124
operationParameter.enums.push(...model.enums);
127125
operationParameter.properties.push(...model.properties);

src/openApi/v2/parser/getOperationResponse.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ export function getOperationResponse(openApi: OpenApi, response: OpenApiResponse
2222
isRequired: false,
2323
isNullable: false,
2424
imports: [],
25-
extends: [],
2625
enum: [],
2726
enums: [],
2827
properties: [],
@@ -80,7 +79,6 @@ export function getOperationResponse(openApi: OpenApi, response: OpenApiResponse
8079
operationResponse.minProperties = model.minProperties;
8180
operationResponse.pattern = getPattern(model.pattern);
8281
operationResponse.imports.push(...model.imports);
83-
operationResponse.extends.push(...model.extends);
8482
operationResponse.enum.push(...model.enum);
8583
operationResponse.enums.push(...model.enums);
8684
operationResponse.properties.push(...model.properties);

src/openApi/v2/parser/getOperationResults.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ export function getOperationResults(operationResponses: OperationResponse[]): Op
3434
isRequired: false,
3535
isNullable: false,
3636
imports: [],
37-
extends: [],
3837
enum: [],
3938
enums: [],
4039
properties: [],

src/openApi/v3/parser/getModel.ts

Lines changed: 40 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,22 @@ import { extendEnum } from './extendEnum';
55
import { getComment } from './getComment';
66
import { getEnum } from './getEnum';
77
import { getEnumFromDescription } from './getEnumFromDescription';
8+
import { getModelComposition } from './getModelComposition';
89
import { getModelDefault } from './getModelDefault';
910
import { getModelProperties } from './getModelProperties';
1011
import { getPattern } from './getPattern';
1112
import { getType } from './getType';
1213

1314
export function getModel(openApi: OpenApi, definition: OpenApiSchema, isDefinition: boolean = false, name: string = ''): Model {
1415
const model: Model = {
15-
name: name,
16+
name,
1617
export: 'interface',
1718
type: 'any',
1819
base: 'any',
1920
template: null,
2021
link: null,
2122
description: getComment(definition.description),
22-
isDefinition: isDefinition,
23+
isDefinition,
2324
isReadOnly: definition.readOnly === true,
2425
isNullable: definition.nullable === true,
2526
isRequired: false,
@@ -38,7 +39,6 @@ export function getModel(openApi: OpenApi, definition: OpenApiSchema, isDefiniti
3839
minProperties: definition.minProperties,
3940
pattern: getPattern(definition.pattern),
4041
imports: [],
41-
extends: [],
4242
enum: [],
4343
enums: [],
4444
properties: [],
@@ -103,7 +103,7 @@ export function getModel(openApi: OpenApi, definition: OpenApiSchema, isDefiniti
103103
}
104104
}
105105

106-
if (definition.type === 'object' && definition.additionalProperties && typeof definition.additionalProperties === 'object') {
106+
if (definition.type === 'object' && typeof definition.additionalProperties === 'object') {
107107
if (definition.additionalProperties.$ref) {
108108
const additionalProperties = getType(definition.additionalProperties.$ref);
109109
model.export = 'dictionary';
@@ -125,42 +125,50 @@ export function getModel(openApi: OpenApi, definition: OpenApiSchema, isDefiniti
125125
return model;
126126
}
127127
}
128-
// TODO:
129-
// Add correct support for oneOf
130-
// https://swagger.io/docs/specification/data-models/oneof-anyof-allof-not/
131128

132-
if (definition.oneOf?.length || definition.anyOf?.length || definition.allOf?.length) {
133-
let types: OpenApiSchema[] = [];
134-
if (definition.oneOf?.length) {
135-
model.export = 'one-of';
136-
types = definition.oneOf;
137-
} else if (definition.anyOf?.length) {
138-
model.export = 'any-of';
139-
types = definition.anyOf;
140-
} else if (definition.allOf?.length) {
141-
model.export = 'all-of';
142-
types = definition.allOf;
143-
}
144-
const compositionTypes = types.map(model => getModel(openApi, model));
145-
model.properties = compositionTypes;
146-
model.imports.push(...compositionTypes.reduce((acc: string[], type) => acc.concat(type.imports), []));
147-
model.enums.push(...compositionTypes.reduce((acc: Model[], type) => acc.concat(type.enums), []));
129+
if (definition.oneOf?.length) {
130+
const composition = getModelComposition(openApi, definition.oneOf, 'one-of', getModel);
131+
model.export = composition.type;
132+
model.imports.push(...composition.imports);
133+
model.enums.push(...composition.enums);
134+
model.properties.push(...composition.properties);
135+
return model;
136+
}
137+
138+
if (definition.anyOf?.length) {
139+
const composition = getModelComposition(openApi, definition.anyOf, 'any-of', getModel);
140+
model.export = composition.type;
141+
model.imports.push(...composition.imports);
142+
model.enums.push(...composition.enums);
143+
model.properties.push(...composition.properties);
144+
return model;
145+
}
146+
147+
if (definition.allOf?.length) {
148+
const composition = getModelComposition(openApi, definition.allOf, 'all-of', getModel);
149+
model.export = composition.type;
150+
model.imports.push(...composition.imports);
151+
model.enums.push(...composition.enums);
152+
model.properties.push(...composition.properties);
148153
return model;
149154
}
150155

151156
if (definition.type === 'object') {
152157
model.export = 'interface';
153158
model.type = 'any';
154159
model.base = 'any';
155-
model.default = getModelDefault(definition, model);
156-
const properties = getModelProperties(openApi, definition, getModel);
157-
properties.forEach(property => {
158-
model.properties.push(property);
159-
model.imports.push(...property.imports);
160-
if (property.export === 'enum') {
161-
model.enums.push(property);
162-
}
163-
});
160+
161+
if (definition.properties) {
162+
model.default = getModelDefault(definition, model);
163+
const properties = getModelProperties(openApi, definition, getModel);
164+
properties.forEach(property => {
165+
model.imports.push(...property.imports);
166+
model.properties.push(property);
167+
if (property.export === 'enum') {
168+
model.enums.push(property);
169+
}
170+
});
171+
}
164172
return model;
165173
}
166174

src/openApi/v3/parser/getModelProperties.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ export function getModelProperties(openApi: OpenApi, definition: OpenApiSchema,
4545
minProperties: property.minProperties,
4646
pattern: getPattern(property.pattern),
4747
imports: model.imports,
48-
extends: [],
4948
enum: [],
5049
enums: [],
5150
properties: [],
@@ -79,7 +78,6 @@ export function getModelProperties(openApi: OpenApi, definition: OpenApiSchema,
7978
minProperties: property.minProperties,
8079
pattern: getPattern(property.pattern),
8180
imports: model.imports,
82-
extends: model.extends,
8381
enum: model.enum,
8482
enums: model.enums,
8583
properties: model.properties,

src/openApi/v3/parser/getOperationParameter.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ export function getOperationParameter(openApi: OpenApi, parameter: OpenApiParame
2424
isRequired: parameter.required === true,
2525
isNullable: parameter.nullable === true,
2626
imports: [],
27-
extends: [],
2827
enum: [],
2928
enums: [],
3029
properties: [],
@@ -76,7 +75,6 @@ export function getOperationParameter(openApi: OpenApi, parameter: OpenApiParame
7675
operationParameter.pattern = getPattern(model.pattern);
7776
operationParameter.default = model.default;
7877
operationParameter.imports.push(...model.imports);
79-
operationParameter.extends.push(...model.extends);
8078
operationParameter.enum.push(...model.enum);
8179
operationParameter.enums.push(...model.enums);
8280
operationParameter.properties.push(...model.properties);

src/openApi/v3/parser/getOperationRequestBody.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ export function getOperationRequestBody(openApi: OpenApi, parameter: OpenApiRequ
2424
isRequired: parameter.required === true,
2525
isNullable: parameter.nullable === true,
2626
imports: [],
27-
extends: [],
2827
enum: [],
2928
enums: [],
3029
properties: [],
@@ -66,7 +65,6 @@ export function getOperationRequestBody(openApi: OpenApi, parameter: OpenApiRequ
6665
requestBody.minProperties = model.minProperties;
6766
requestBody.pattern = getPattern(model.pattern);
6867
requestBody.imports.push(...model.imports);
69-
requestBody.extends.push(...model.extends);
7068
requestBody.enum.push(...model.enum);
7169
requestBody.enums.push(...model.enums);
7270
requestBody.properties.push(...model.properties);

src/openApi/v3/parser/getOperationResponse.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ export function getOperationResponse(openApi: OpenApi, response: OpenApiResponse
2323
isRequired: false,
2424
isNullable: false,
2525
imports: [],
26-
extends: [],
2726
enum: [],
2827
enums: [],
2928
properties: [],
@@ -79,7 +78,6 @@ export function getOperationResponse(openApi: OpenApi, response: OpenApiResponse
7978
operationResponse.minProperties = model.minProperties;
8079
operationResponse.pattern = getPattern(model.pattern);
8180
operationResponse.imports.push(...model.imports);
82-
operationResponse.extends.push(...model.extends);
8381
operationResponse.enum.push(...model.enum);
8482
operationResponse.enums.push(...model.enums);
8583
operationResponse.properties.push(...model.properties);

src/openApi/v3/parser/getOperationResults.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ export function getOperationResults(operationResponses: OperationResponse[]): Op
3434
isRequired: false,
3535
isNullable: false,
3636
imports: [],
37-
extends: [],
3837
enum: [],
3938
enums: [],
4039
properties: [],

src/templates/core/ApiRequestOptions.hbs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{{>header}}
22

3-
export interface ApiRequestOptions {
3+
export type ApiRequestOptions = {
44
readonly method: 'GET' | 'PUT' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'PATCH';
55
readonly path: string;
66
readonly cookies?: Record<string, any>;

src/templates/core/ApiResult.hbs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{{>header}}
22

3-
export interface ApiResult {
3+
export type ApiResult = {
44
readonly url: string;
55
readonly ok: boolean;
66
readonly status: number;

src/templates/core/OpenAPI.hbs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
type Resolver<T> = () => Promise<T>;
44
type Headers = Record<string, string>;
55

6-
interface Config {
6+
type Config = {
77
BASE: string;
88
VERSION: string;
99
WITH_CREDENTIALS: boolean;

src/templates/exportSchema.hbs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,3 @@
11
{{>header}}
22

3-
{{#if extends}}
4-
5-
{{#each extends}}
6-
import { ${{{this}}} } from './${{{this}}}';
7-
{{/each}}
8-
{{/if}}
9-
103
export const ${{{name}}} = {{>schema}};

0 commit comments

Comments
 (0)