[Typescript] Enums generation (7.0.0) (#14663)

* Enums generation

* regenerate tests

* Update tests
This commit is contained in:
Kuzma
2023-02-19 15:45:18 +03:00
committed by GitHub
parent 8db004ffa3
commit fb18e7a039
25 changed files with 134 additions and 32 deletions

View File

@@ -30,6 +30,7 @@ import io.swagger.v3.oas.models.media.Schema;
import io.swagger.v3.oas.models.parameters.Parameter;
import org.apache.commons.lang3.StringUtils;
import org.openapitools.codegen.*;
import org.openapitools.codegen.CodegenConstants.ENUM_PROPERTY_NAMING_TYPE;
import org.openapitools.codegen.CodegenDiscriminator.MappedModel;
import org.openapitools.codegen.meta.GeneratorMetadata;
import org.openapitools.codegen.meta.Stability;
@@ -100,6 +101,7 @@ public class TypeScriptClientCodegen extends DefaultCodegen implements CodegenCo
protected String npmName = null;
protected String npmVersion = "1.0.0";
protected String modelPropertyNaming = "camelCase";
protected ENUM_PROPERTY_NAMING_TYPE enumPropertyNaming = ENUM_PROPERTY_NAMING_TYPE.PascalCase;
protected HashSet<String> languageGenericTypes;
private DateTimeFormatter iso8601Date = DateTimeFormatter.ISO_DATE;
@@ -645,12 +647,12 @@ public class TypeScriptClientCodegen extends DefaultCodegen implements CodegenCo
@Override
public String toEnumVarName(String name, String datatype) {
if (name.length() == 0) {
return "Empty";
return getNameUsingEnumPropertyNaming("empty");
}
// for symbol, e.g. $, #
if (getSymbolName(name) != null) {
return camelize(getSymbolName(name));
return getNameUsingEnumPropertyNaming(getSymbolName(name));
}
// number
@@ -668,9 +670,7 @@ public class TypeScriptClientCodegen extends DefaultCodegen implements CodegenCo
enumName = enumName.replaceFirst("^_", "");
enumName = enumName.replaceFirst("_$", "");
// camelize the enum variable name
// ref: https://basarat.gitbooks.io/typescript/content/docs/enums.html
enumName = camelize(enumName);
enumName = getNameUsingEnumPropertyNaming(enumName);
if (enumName.matches("\\d.*")) { // starts with number
return "_" + enumName;
@@ -679,6 +679,27 @@ public class TypeScriptClientCodegen extends DefaultCodegen implements CodegenCo
}
}
protected ENUM_PROPERTY_NAMING_TYPE getEnumPropertyNaming() {
return enumPropertyNaming;
}
private String getNameUsingEnumPropertyNaming(String name) {
switch (getEnumPropertyNaming()) {
case original:
return name;
case camelCase:
return camelize(underscore(name), LOWERCASE_FIRST_LETTER);
case PascalCase:
return camelize(underscore(name));
case snake_case:
return underscore(name);
case UPPERCASE:
return underscore(name).toUpperCase(Locale.ROOT);
default:
throw new IllegalArgumentException("Unsupported enum property naming: '" + name);
}
}
@Override
public String toEnumName(CodegenProperty property) {
String enumName = toModelName(property.name) + "Enum";

View File

@@ -71,14 +71,26 @@ export class {{classname}} {{#parent}}extends {{{.}}} {{/parent}}{
{{#vars}}
{{#isEnum}}
export type {{classname}}{{enumName}} ={{#allowableValues}}{{#values}} "{{.}}" {{^-last}}|{{/-last}}{{/values}}{{/allowableValues}};
export enum {{classname}}{{enumName}} {
{{#allowableValues}}
{{#enumVars}}
{{name}} = {{{value}}}{{^-last}},{{/-last}}
{{/enumVars}}
{{/allowableValues}}
}
{{/isEnum}}
{{/vars}}
{{/hasEnums}}
{{/isEnum}}
{{#isEnum}}
export type {{classname}} ={{#allowableValues}}{{#values}} "{{.}}" {{^-last}}|{{/-last}}{{/values}}{{/allowableValues}};
export enum {{classname}} {
{{#allowableValues}}
{{#enumVars}}
{{name}} = {{{value}}}{{^-last}},{{/-last}}
{{/enumVars}}
{{/allowableValues}}
}
{{/isEnum}}
{{/model}}
{{/models}}

View File

@@ -75,5 +75,9 @@ export class Order {
}
export type OrderStatusEnum = "placed" | "approved" | "delivered" ;
export enum OrderStatusEnum {
Placed = 'placed',
Approved = 'approved',
Delivered = 'delivered'
}

View File

@@ -77,5 +77,9 @@ export class Pet {
}
export type PetStatusEnum = "available" | "pending" | "sold" ;
export enum PetStatusEnum {
Available = 'available',
Pending = 'pending',
Sold = 'sold'
}

View File

@@ -41,5 +41,10 @@ export class Dog {
}
export type DogBreedEnum = "Dingo" | "Husky" | "Retriever" | "Shepherd" ;
export enum DogBreedEnum {
Dingo = 'Dingo',
Husky = 'Husky',
Retriever = 'Retriever',
Shepherd = 'Shepherd'
}

View File

@@ -41,5 +41,10 @@ export class DogAllOf {
}
export type DogAllOfBreedEnum = "Dingo" | "Husky" | "Retriever" | "Shepherd" ;
export enum DogAllOfBreedEnum {
Dingo = 'Dingo',
Husky = 'Husky',
Retriever = 'Retriever',
Shepherd = 'Shepherd'
}

View File

@@ -41,5 +41,8 @@ export class PetByType {
}
export type PetByTypePetTypeEnum = "Cat" | "Dog" ;
export enum PetByTypePetTypeEnum {
Cat = 'Cat',
Dog = 'Dog'
}

View File

@@ -57,5 +57,8 @@ export class PetsFilteredPatchRequest {
}
export type PetsFilteredPatchRequestPetTypeEnum = "Cat" | "Dog" ;
export enum PetsFilteredPatchRequestPetTypeEnum {
Cat = 'Cat',
Dog = 'Dog'
}

View File

@@ -58,5 +58,10 @@ export class PetsPatchRequest {
}
export type PetsPatchRequestBreedEnum = "Dingo" | "Husky" | "Retriever" | "Shepherd" ;
export enum PetsPatchRequestBreedEnum {
Dingo = 'Dingo',
Husky = 'Husky',
Retriever = 'Retriever',
Shepherd = 'Shepherd'
}

View File

@@ -75,5 +75,9 @@ export class Order {
}
export type OrderStatusEnum = "placed" | "approved" | "delivered" ;
export enum OrderStatusEnum {
Placed = 'placed',
Approved = 'approved',
Delivered = 'delivered'
}

View File

@@ -77,5 +77,9 @@ export class Pet {
}
export type PetStatusEnum = "available" | "pending" | "sold" ;
export enum PetStatusEnum {
Available = 'available',
Pending = 'pending',
Sold = 'sold'
}

View File

@@ -75,5 +75,9 @@ export class Order {
}
export type OrderStatusEnum = "placed" | "approved" | "delivered" ;
export enum OrderStatusEnum {
Placed = 'placed',
Approved = 'approved',
Delivered = 'delivered'
}

View File

@@ -77,5 +77,9 @@ export class Pet {
}
export type PetStatusEnum = "available" | "pending" | "sold" ;
export enum PetStatusEnum {
Available = 'available',
Pending = 'pending',
Sold = 'sold'
}

View File

@@ -75,5 +75,9 @@ export class Order {
}
export type OrderStatusEnum = "placed" | "approved" | "delivered" ;
export enum OrderStatusEnum {
Placed = 'placed',
Approved = 'approved',
Delivered = 'delivered'
}

View File

@@ -77,5 +77,9 @@ export class Pet {
}
export type PetStatusEnum = "available" | "pending" | "sold" ;
export enum PetStatusEnum {
Available = 'available',
Pending = 'pending',
Sold = 'sold'
}

View File

@@ -75,5 +75,9 @@ export class Order {
}
export type OrderStatusEnum = "placed" | "approved" | "delivered" ;
export enum OrderStatusEnum {
Placed = 'placed',
Approved = 'approved',
Delivered = 'delivered'
}

View File

@@ -77,5 +77,9 @@ export class Pet {
}
export type PetStatusEnum = "available" | "pending" | "sold" ;
export enum PetStatusEnum {
Available = 'available',
Pending = 'pending',
Sold = 'sold'
}

View File

@@ -75,5 +75,9 @@ export class Order {
}
export type OrderStatusEnum = "placed" | "approved" | "delivered" ;
export enum OrderStatusEnum {
Placed = 'placed',
Approved = 'approved',
Delivered = 'delivered'
}

View File

@@ -77,5 +77,9 @@ export class Pet {
}
export type PetStatusEnum = "available" | "pending" | "sold" ;
export enum PetStatusEnum {
Available = 'available',
Pending = 'pending',
Sold = 'sold'
}

View File

@@ -1,5 +1,5 @@
import { expect } from '@esm-bundle/chai';
import { ServerConfiguration, createConfiguration, PetApi, Tag, Pet, ApiException, RequiredError } from 'ts-petstore-client'
import { ServerConfiguration, createConfiguration, PetApi, Tag, Pet, PetStatusEnum, ApiException, RequiredError } from 'ts-petstore-client'
import image from "./pet";
const configuration = createConfiguration({
@@ -20,7 +20,7 @@ function createPet() {
pet.id = Math.floor(Math.random() * 100000)
pet.name = "PetName"
pet.photoUrls = []
pet.status = 'available'
pet.status = PetStatusEnum.Available
pet.tags = [ tag ]
return pet as Required<Pet>;
}

View File

@@ -18,7 +18,7 @@ describe("PetApi", () => {
pet.id = Math.floor(Math.random() * 100000)
pet.name = "PetName"
pet.photoUrls = []
pet.status = 'available'
pet.status = petstore.PetStatusEnum.Available
pet.tags = [ tag ]
await petApi.addPet(pet);

View File

@@ -80,7 +80,7 @@ describe("ObjectSerializer", () => {
pet.category = category
pet.name = "PetName"
pet.photoUrls = [ "url", "other url"]
pet.status = "available"
pet.status = petstore.PetStatusEnum.Available
pet.tags = tags
expect(ObjectSerializer.serialize(pet, "Pet", "")).to.deep.equal({
@@ -187,7 +187,7 @@ describe("ObjectSerializer", () => {
pet.category = category
pet.name = "PetName"
pet.photoUrls = [ "url", "other url"]
pet.status = "available"
pet.status = petstore.PetStatusEnum.Available
pet.tags = tags
const deserialized = ObjectSerializer.deserialize({

View File

@@ -17,7 +17,7 @@ const petId = Math.floor(Math.random() * 100000);
pet.id = petId;
pet.name = "PetName";
pet.photoUrls = [];
pet.status = "available";
pet.status = petstore.PetStatusEnum.Available;
pet.tags = [tag];
Deno.test({

View File

@@ -16,7 +16,7 @@ const pet = new petstore.Pet()
pet.id = Math.floor(Math.random() * 100000)
pet.name = "PetName"
pet.photoUrls = []
pet.status = 'available'
pet.status = petstore.PetStatusEnum.Available
pet.tags = [ tag ]
QUnit.module("PetApi")

View File

@@ -15,7 +15,7 @@ const pet = new petstore.Pet()
pet.id = Math.floor(Math.random() * 100000)
pet.name = "PetName"
pet.photoUrls = []
pet.status = 'available'
pet.status = petstore.PetStatusEnum.Available
pet.tags = [ tag ]
describe("PetApi", () =>{