Use string union for enums

This commit is contained in:
Tino Fuhrmann 2019-03-04 00:12:07 +01:00
parent a00e342505
commit e11a5a9395
9 changed files with 56 additions and 70 deletions

View File

@ -546,14 +546,14 @@ public class TypeScriptClientCodegen extends DefaultCodegen implements CodegenCo
// name enum with model name, e.g. StatusEnum => Pet.StatusEnum // name enum with model name, e.g. StatusEnum => Pet.StatusEnum
for (CodegenProperty var : cm.vars) { for (CodegenProperty var : cm.vars) {
if (Boolean.TRUE.equals(var.isEnum)) { if (Boolean.TRUE.equals(var.isEnum)) {
var.datatypeWithEnum = var.datatypeWithEnum.replace(var.enumName, cm.classname + "." + var.enumName); var.datatypeWithEnum = var.datatypeWithEnum.replace(var.enumName, cm.classname + var.enumName);
} }
} }
if (cm.parent != null) { if (cm.parent != null) {
for (CodegenProperty var : cm.allVars) { for (CodegenProperty var : cm.allVars) {
if (Boolean.TRUE.equals(var.isEnum)) { if (Boolean.TRUE.equals(var.isEnum)) {
var.datatypeWithEnum = var.datatypeWithEnum var.datatypeWithEnum = var.datatypeWithEnum
.replace(var.enumName, cm.classname + "." + var.enumName); .replace(var.enumName, cm.classname + var.enumName);
} }
} }
} }

View File

@ -6,7 +6,7 @@ export * from './{{{ classFilename }}}';
{{#models}} {{#models}}
{{#model}} {{#model}}
import { {{classname}} } from './{{{ classFilename }}}'; import { {{classname}}{{#hasEnums}}{{#vars}}{{#isEnum}}, {{classname}}{{enumName}} {{/isEnum}} {{/vars}}{{/hasEnums}} } from './{{{ classFilename }}}';
{{/model}} {{/model}}
{{/models}} {{/models}}
@ -22,19 +22,19 @@ let primitives = [
"any" "any"
]; ];
let enumsMap: {[index: string]: any} = { let enumsMap: Set<string> = new Set<string>([
{{#models}} {{#models}}
{{#model}} {{#model}}
{{#hasEnums}} {{#hasEnums}}
{{#vars}} {{#vars}}
{{#isEnum}} {{#isEnum}}
{{#isContainer}}"{{classname}}.{{enumName}}": {{classname}}.{{enumName}}{{/isContainer}}{{#isNotContainer}}"{{datatypeWithEnum}}": {{datatypeWithEnum}}{{/isNotContainer}}, "{{classname}}{{enumName}}",
{{/isEnum}} {{/isEnum}}
{{/vars}} {{/vars}}
{{/hasEnums}} {{/hasEnums}}
{{/model}} {{/model}}
{{/models}} {{/models}}
} ]);
let typeMap: {[index: string]: any} = { let typeMap: {[index: string]: any} = {
{{#models}} {{#models}}
@ -53,7 +53,7 @@ export class ObjectSerializer {
} else if (expectedType === "Date") { } else if (expectedType === "Date") {
return expectedType; return expectedType;
} else { } else {
if (enumsMap[expectedType]) { if (enumsMap.has(expectedType)) {
return expectedType; return expectedType;
} }
@ -97,7 +97,7 @@ export class ObjectSerializer {
} else if (type === "Date") { } else if (type === "Date") {
return data.toISOString(); return data.toISOString();
} else { } else {
if (enumsMap[type]) { if (enumsMap.has(type)) {
return data; return data;
} }
if (!typeMap[type]) { // in case we dont know the type if (!typeMap[type]) { // in case we dont know the type
@ -137,7 +137,7 @@ export class ObjectSerializer {
} else if (type === "Date") { } else if (type === "Date") {
return new Date(data); return new Date(data);
} else { } else {
if (enumsMap[type]) {// is Enum if (enumsMap.has(type)) {// is Enum
return data; return data;
} }

View File

@ -51,19 +51,13 @@ export class {{classname}} {{#parent}}extends {{{parent}}} {{/parent}}{
} }
{{#hasEnums}} {{#hasEnums}}
export namespace {{classname}} {
{{#vars}} {{#vars}}
{{#isEnum}} {{#isEnum}}
export enum {{enumName}} { export type {{classname}}{{enumName}} ={{#allowableValues}}{{#values}} "{{.}}" {{^-last}}|{{/-last}}{{/values}}{{/allowableValues}};
{{#allowableValues}}
{{#enumVars}}
{{name}} = <any> {{{value}}}{{^-last}},{{/-last}}
{{/enumVars}}
{{/allowableValues}}
}
{{/isEnum}} {{/isEnum}}
{{/vars}} {{/vars}}
}
{{/hasEnums}} {{/hasEnums}}
{{/model}} {{/model}}
{{/models}} {{/models}}

View File

@ -19,7 +19,7 @@ export class PetApi {
this.responseProcessor = new PetApiResponseProcessor(); this.responseProcessor = new PetApiResponseProcessor();
} }
public addPet(pet: Pet, options?: any): Promise<void> { public addPet(pet: Pet, options?: Configuration): Promise<void> {
const requestContext = this.requestFactory.addPet(pet, options); const requestContext = this.requestFactory.addPet(pet, options);
// build promise chain // build promise chain
@ -38,7 +38,7 @@ export class PetApi {
}); });
} }
public deletePet(petId: number, apiKey?: string, options?: any): Promise<void> { public deletePet(petId: number, apiKey?: string, options?: Configuration): Promise<void> {
const requestContext = this.requestFactory.deletePet(petId, apiKey, options); const requestContext = this.requestFactory.deletePet(petId, apiKey, options);
// build promise chain // build promise chain
@ -57,7 +57,7 @@ export class PetApi {
}); });
} }
public findPetsByStatus(status: Array<'available' | 'pending' | 'sold'>, options?: any): Promise<Array<Pet>> { public findPetsByStatus(status: Array<'available' | 'pending' | 'sold'>, options?: Configuration): Promise<Array<Pet>> {
const requestContext = this.requestFactory.findPetsByStatus(status, options); const requestContext = this.requestFactory.findPetsByStatus(status, options);
// build promise chain // build promise chain
@ -76,7 +76,7 @@ export class PetApi {
}); });
} }
public findPetsByTags(tags: Array<string>, options?: any): Promise<Array<Pet>> { public findPetsByTags(tags: Array<string>, options?: Configuration): Promise<Array<Pet>> {
const requestContext = this.requestFactory.findPetsByTags(tags, options); const requestContext = this.requestFactory.findPetsByTags(tags, options);
// build promise chain // build promise chain
@ -95,7 +95,7 @@ export class PetApi {
}); });
} }
public getPetById(petId: number, options?: any): Promise<Pet> { public getPetById(petId: number, options?: Configuration): Promise<Pet> {
const requestContext = this.requestFactory.getPetById(petId, options); const requestContext = this.requestFactory.getPetById(petId, options);
// build promise chain // build promise chain
@ -114,7 +114,7 @@ export class PetApi {
}); });
} }
public updatePet(pet: Pet, options?: any): Promise<void> { public updatePet(pet: Pet, options?: Configuration): Promise<void> {
const requestContext = this.requestFactory.updatePet(pet, options); const requestContext = this.requestFactory.updatePet(pet, options);
// build promise chain // build promise chain
@ -133,7 +133,7 @@ export class PetApi {
}); });
} }
public updatePetWithForm(petId: number, name?: string, status?: string, options?: any): Promise<void> { public updatePetWithForm(petId: number, name?: string, status?: string, options?: Configuration): Promise<void> {
const requestContext = this.requestFactory.updatePetWithForm(petId, name, status, options); const requestContext = this.requestFactory.updatePetWithForm(petId, name, status, options);
// build promise chain // build promise chain
@ -152,7 +152,7 @@ export class PetApi {
}); });
} }
public uploadFile(petId: number, additionalMetadata?: string, file?: HttpFile, options?: any): Promise<ApiResponse> { public uploadFile(petId: number, additionalMetadata?: string, file?: HttpFile, options?: Configuration): Promise<ApiResponse> {
const requestContext = this.requestFactory.uploadFile(petId, additionalMetadata, file, options); const requestContext = this.requestFactory.uploadFile(petId, additionalMetadata, file, options);
// build promise chain // build promise chain
@ -187,7 +187,7 @@ export class StoreApi {
this.responseProcessor = new StoreApiResponseProcessor(); this.responseProcessor = new StoreApiResponseProcessor();
} }
public deleteOrder(orderId: string, options?: any): Promise<void> { public deleteOrder(orderId: string, options?: Configuration): Promise<void> {
const requestContext = this.requestFactory.deleteOrder(orderId, options); const requestContext = this.requestFactory.deleteOrder(orderId, options);
// build promise chain // build promise chain
@ -206,7 +206,7 @@ export class StoreApi {
}); });
} }
public getInventory(options?: any): Promise<{ [key: string]: number; }> { public getInventory(options?: Configuration): Promise<{ [key: string]: number; }> {
const requestContext = this.requestFactory.getInventory(options); const requestContext = this.requestFactory.getInventory(options);
// build promise chain // build promise chain
@ -225,7 +225,7 @@ export class StoreApi {
}); });
} }
public getOrderById(orderId: number, options?: any): Promise<Order> { public getOrderById(orderId: number, options?: Configuration): Promise<Order> {
const requestContext = this.requestFactory.getOrderById(orderId, options); const requestContext = this.requestFactory.getOrderById(orderId, options);
// build promise chain // build promise chain
@ -244,7 +244,7 @@ export class StoreApi {
}); });
} }
public placeOrder(order: Order, options?: any): Promise<Order> { public placeOrder(order: Order, options?: Configuration): Promise<Order> {
const requestContext = this.requestFactory.placeOrder(order, options); const requestContext = this.requestFactory.placeOrder(order, options);
// build promise chain // build promise chain
@ -279,7 +279,7 @@ export class UserApi {
this.responseProcessor = new UserApiResponseProcessor(); this.responseProcessor = new UserApiResponseProcessor();
} }
public createUser(user: User, options?: any): Promise<void> { public createUser(user: User, options?: Configuration): Promise<void> {
const requestContext = this.requestFactory.createUser(user, options); const requestContext = this.requestFactory.createUser(user, options);
// build promise chain // build promise chain
@ -298,7 +298,7 @@ export class UserApi {
}); });
} }
public createUsersWithArrayInput(user: Array<User>, options?: any): Promise<void> { public createUsersWithArrayInput(user: Array<User>, options?: Configuration): Promise<void> {
const requestContext = this.requestFactory.createUsersWithArrayInput(user, options); const requestContext = this.requestFactory.createUsersWithArrayInput(user, options);
// build promise chain // build promise chain
@ -317,7 +317,7 @@ export class UserApi {
}); });
} }
public createUsersWithListInput(user: Array<User>, options?: any): Promise<void> { public createUsersWithListInput(user: Array<User>, options?: Configuration): Promise<void> {
const requestContext = this.requestFactory.createUsersWithListInput(user, options); const requestContext = this.requestFactory.createUsersWithListInput(user, options);
// build promise chain // build promise chain
@ -336,7 +336,7 @@ export class UserApi {
}); });
} }
public deleteUser(username: string, options?: any): Promise<void> { public deleteUser(username: string, options?: Configuration): Promise<void> {
const requestContext = this.requestFactory.deleteUser(username, options); const requestContext = this.requestFactory.deleteUser(username, options);
// build promise chain // build promise chain
@ -355,7 +355,7 @@ export class UserApi {
}); });
} }
public getUserByName(username: string, options?: any): Promise<User> { public getUserByName(username: string, options?: Configuration): Promise<User> {
const requestContext = this.requestFactory.getUserByName(username, options); const requestContext = this.requestFactory.getUserByName(username, options);
// build promise chain // build promise chain
@ -374,7 +374,7 @@ export class UserApi {
}); });
} }
public loginUser(username: string, password: string, options?: any): Promise<string> { public loginUser(username: string, password: string, options?: Configuration): Promise<string> {
const requestContext = this.requestFactory.loginUser(username, password, options); const requestContext = this.requestFactory.loginUser(username, password, options);
// build promise chain // build promise chain
@ -393,7 +393,7 @@ export class UserApi {
}); });
} }
public logoutUser(options?: any): Promise<void> { public logoutUser(options?: Configuration): Promise<void> {
const requestContext = this.requestFactory.logoutUser(options); const requestContext = this.requestFactory.logoutUser(options);
// build promise chain // build promise chain
@ -412,7 +412,7 @@ export class UserApi {
}); });
} }
public updateUser(username: string, user: User, options?: any): Promise<void> { public updateUser(username: string, user: User, options?: Configuration): Promise<void> {
const requestContext = this.requestFactory.updateUser(username, user, options); const requestContext = this.requestFactory.updateUser(username, user, options);
// build promise chain // build promise chain

View File

@ -7,8 +7,8 @@ export * from './User';
import { ApiResponse } from './ApiResponse'; import { ApiResponse } from './ApiResponse';
import { Category } from './Category'; import { Category } from './Category';
import { Order } from './Order'; import { Order , OrderStatusEnum } from './Order';
import { Pet } from './Pet'; import { Pet , PetStatusEnum } from './Pet';
import { Tag } from './Tag'; import { Tag } from './Tag';
import { User } from './User'; import { User } from './User';
@ -24,10 +24,10 @@ let primitives = [
"any" "any"
]; ];
let enumsMap: {[index: string]: any} = { let enumsMap: Set<string> = new Set<string>([
"Order.StatusEnum": Order.StatusEnum, "OrderStatusEnum",
"Pet.StatusEnum": Pet.StatusEnum, "PetStatusEnum",
} ]);
let typeMap: {[index: string]: any} = { let typeMap: {[index: string]: any} = {
"ApiResponse": ApiResponse, "ApiResponse": ApiResponse,
@ -47,7 +47,7 @@ export class ObjectSerializer {
} else if (expectedType === "Date") { } else if (expectedType === "Date") {
return expectedType; return expectedType;
} else { } else {
if (enumsMap[expectedType]) { if (enumsMap.has(expectedType)) {
return expectedType; return expectedType;
} }
@ -91,7 +91,7 @@ export class ObjectSerializer {
} else if (type === "Date") { } else if (type === "Date") {
return data.toISOString(); return data.toISOString();
} else { } else {
if (enumsMap[type]) { if (enumsMap.has(type)) {
return data; return data;
} }
if (!typeMap[type]) { // in case we dont know the type if (!typeMap[type]) { // in case we dont know the type
@ -131,7 +131,7 @@ export class ObjectSerializer {
} else if (type === "Date") { } else if (type === "Date") {
return new Date(data); return new Date(data);
} else { } else {
if (enumsMap[type]) {// is Enum if (enumsMap.has(type)) {// is Enum
return data; return data;
} }

View File

@ -13,7 +13,7 @@ export class Order {
/** /**
* Order Status * Order Status
*/ */
'status'?: Order.StatusEnum; 'status'?: OrderStatusEnum;
'complete'?: boolean; 'complete'?: boolean;
static discriminator: string | undefined = undefined; static discriminator: string | undefined = undefined;
@ -42,7 +42,7 @@ export class Order {
{ {
"name": "status", "name": "status",
"baseName": "status", "baseName": "status",
"type": "Order.StatusEnum" "type": "OrderStatusEnum"
}, },
{ {
"name": "complete", "name": "complete",
@ -55,10 +55,6 @@ export class Order {
} }
} }
export namespace Order {
export enum StatusEnum { export type OrderStatusEnum = "placed" | "approved" | "delivered" ;
Placed = <any> 'placed',
Approved = <any> 'approved',
Delivered = <any> 'delivered'
}
}

View File

@ -16,7 +16,7 @@ export class Pet {
/** /**
* pet status in the store * pet status in the store
*/ */
'status'?: Pet.StatusEnum; 'status'?: PetStatusEnum;
static discriminator: string | undefined = undefined; static discriminator: string | undefined = undefined;
@ -49,7 +49,7 @@ export class Pet {
{ {
"name": "status", "name": "status",
"baseName": "status", "baseName": "status",
"type": "Pet.StatusEnum" "type": "PetStatusEnum"
} ]; } ];
static getAttributeTypeMap() { static getAttributeTypeMap() {
@ -57,10 +57,6 @@ export class Pet {
} }
} }
export namespace Pet {
export enum StatusEnum { export type PetStatusEnum = "available" | "pending" | "sold" ;
Available = <any> 'available',
Pending = <any> 'pending',
Sold = <any> 'sold'
}
}

View File

@ -13,7 +13,7 @@ const pet = new Pet()
pet.id = Math.floor(Math.random() * 100000) pet.id = Math.floor(Math.random() * 100000)
pet.name = "PetName" pet.name = "PetName"
pet.photoUrls = [] pet.photoUrls = []
pet.status = Pet.StatusEnum.Available pet.status = 'available'
pet.tags = [ tag ] pet.tags = [ tag ]
pet.category = undefined pet.category = undefined

View File

@ -48,7 +48,7 @@ describe("ObjectSerializer", () => {
}); });
it ("Enum", () => { it ("Enum", () => {
const input = Pet.StatusEnum.Available const input = "available"
expect(ObjectSerializer.serialize(input, "Pet.StatusEnum")).to.equal("available") expect(ObjectSerializer.serialize(input, "Pet.StatusEnum")).to.equal("available")
}) })
@ -74,7 +74,7 @@ describe("ObjectSerializer", () => {
pet.category = category pet.category = category
pet.name = "PetName" pet.name = "PetName"
pet.photoUrls = [ "url", "other url"] pet.photoUrls = [ "url", "other url"]
pet.status = Pet.StatusEnum.Available pet.status = "available"
pet.tags = tags pet.tags = tags
expect(ObjectSerializer.serialize(pet, "Pet")).to.deep.equal({ expect(ObjectSerializer.serialize(pet, "Pet")).to.deep.equal({
@ -149,7 +149,7 @@ describe("ObjectSerializer", () => {
}); });
it ("Enum", () => { it ("Enum", () => {
const input = Pet.StatusEnum.Available const input = "available"
expect(ObjectSerializer.deserialize("available", "Pet.StatusEnum")).to.equal(input) expect(ObjectSerializer.deserialize("available", "Pet.StatusEnum")).to.equal(input)
}) })
@ -175,7 +175,7 @@ describe("ObjectSerializer", () => {
pet.category = category pet.category = category
pet.name = "PetName" pet.name = "PetName"
pet.photoUrls = [ "url", "other url"] pet.photoUrls = [ "url", "other url"]
pet.status = Pet.StatusEnum.Available pet.status = "available"
pet.tags = tags pet.tags = tags
const deserialized = ObjectSerializer.deserialize({ const deserialized = ObjectSerializer.deserialize({