Skip to content

Commit 5e85f16

Browse files
authored
Merge pull request #9176 from src-cfl/feature/typescript-config-enumPropertyNaming
Add config property "enumPropertyNaming" to TypeScript codegens.
2 parents 744100a + c8787d1 commit 5e85f16

17 files changed

+154
-52
lines changed

modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1242,6 +1242,14 @@ public String snakeCase(String name) {
12421242
return (name.length() > 0) ? (Character.toLowerCase(name.charAt(0)) + name.substring(1)) : "";
12431243
}
12441244

1245+
/**
1246+
* Capitalise first character of string
1247+
*/
1248+
@SuppressWarnings("static-method")
1249+
public static String titleCase(final String input) {
1250+
return input.substring(0, 1).toUpperCase() + input.substring(1);
1251+
}
1252+
12451253
/**
12461254
* Capitalize the string
12471255
*

modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractKotlinCodegen.java

Lines changed: 7 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
import io.swagger.codegen.CliOption;
44
import io.swagger.codegen.CodegenConfig;
55
import io.swagger.codegen.CodegenConstants;
6+
import io.swagger.codegen.CodegenConstants.ENUM_PROPERTY_NAMING_TYPE;
67
import io.swagger.codegen.DefaultCodegen;
8+
import io.swagger.codegen.utils.EnumPropertyNamingUtils;
79
import io.swagger.models.properties.ArrayProperty;
810
import io.swagger.models.properties.MapProperty;
911
import io.swagger.models.properties.Property;
@@ -218,15 +220,7 @@ public CodegenConstants.ENUM_PROPERTY_NAMING_TYPE getEnumPropertyNaming() {
218220
* @param enumPropertyNamingType The string representation of the naming convention, as defined by {@link CodegenConstants.ENUM_PROPERTY_NAMING_TYPE}
219221
*/
220222
public void setEnumPropertyNaming(final String enumPropertyNamingType) {
221-
try {
222-
this.enumPropertyNaming = CodegenConstants.ENUM_PROPERTY_NAMING_TYPE.valueOf(enumPropertyNamingType);
223-
} catch (IllegalArgumentException ex) {
224-
StringBuilder sb = new StringBuilder(enumPropertyNamingType + " is an invalid enum property naming option. Please choose from:");
225-
for (CodegenConstants.ENUM_PROPERTY_NAMING_TYPE t : CodegenConstants.ENUM_PROPERTY_NAMING_TYPE.values()) {
226-
sb.append("\n ").append(t.name());
227-
}
228-
throw new RuntimeException(sb.toString());
229-
}
223+
this.enumPropertyNaming = EnumPropertyNamingUtils.parseEnumPropertyNaming(enumPropertyNamingType);
230224
}
231225

232226
/**
@@ -376,28 +370,11 @@ public String toEnumVarName(String value, String datatype) {
376370
modified = sanitizeKotlinSpecificNames(modified);
377371
}
378372

379-
switch (getEnumPropertyNaming()) {
380-
case original:
381-
// NOTE: This is provided as a last-case allowance, but will still result in reserved words being escaped.
382-
modified = value;
383-
break;
384-
case camelCase:
385-
// NOTE: Removes hyphens and underscores
386-
modified = camelize(modified, true);
387-
break;
388-
case PascalCase:
389-
// NOTE: Removes hyphens and underscores
390-
String result = camelize(modified);
391-
modified = titleCase(result);
392-
break;
393-
case snake_case:
394-
// NOTE: Removes hyphens
395-
modified = underscore(modified);
396-
break;
397-
case UPPERCASE:
398-
modified = modified.toUpperCase();
399-
break;
373+
if (getEnumPropertyNaming() == ENUM_PROPERTY_NAMING_TYPE.original) {
374+
// NOTE: This is provided as a last-case allowance, but will still result in reserved words being escaped.
375+
modified = value;
400376
}
377+
modified = EnumPropertyNamingUtils.applyEnumPropertyCapitalisation(modified, getEnumPropertyNaming());
401378

402379
if (reservedWords.contains(modified)) {
403380
return escapeReservedWord(modified);
@@ -535,10 +512,6 @@ private String sanitizeKotlinSpecificNames(final String name) {
535512
return word;
536513
}
537514

538-
private String titleCase(final String input) {
539-
return input.substring(0, 1).toUpperCase() + input.substring(1);
540-
}
541-
542515
@Override
543516
protected boolean isReservedWord(String word) {
544517
// We want case-sensitive escaping, to avoid unnecessary backtick-escaping.

modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractTypeScriptClientCodegen.java

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@
99
import io.swagger.codegen.CliOption;
1010
import io.swagger.codegen.CodegenConfig;
1111
import io.swagger.codegen.CodegenConstants;
12+
import io.swagger.codegen.CodegenConstants.ENUM_PROPERTY_NAMING_TYPE;
1213
import io.swagger.codegen.CodegenModel;
1314
import io.swagger.codegen.CodegenProperty;
1415
import io.swagger.codegen.CodegenType;
1516
import io.swagger.codegen.DefaultCodegen;
17+
import io.swagger.codegen.utils.EnumPropertyNamingUtils;
1618
import io.swagger.models.properties.ArrayProperty;
1719
import io.swagger.models.properties.BooleanProperty;
1820
import io.swagger.models.properties.DateProperty;
@@ -31,6 +33,12 @@ public abstract class AbstractTypeScriptClientCodegen extends DefaultCodegen imp
3133
private static final String UNDEFINED_VALUE = "undefined";
3234

3335
protected String modelPropertyNaming= "camelCase";
36+
/**
37+
* Enum variables are PascalCase by default.
38+
* ref: https://basarat.gitbooks.io/typescript/content/docs/enums.html
39+
*/
40+
protected ENUM_PROPERTY_NAMING_TYPE enumPropertyNaming = ENUM_PROPERTY_NAMING_TYPE.PascalCase;
41+
3442
protected Boolean supportsES6 = true;
3543
protected HashSet<String> languageGenericTypes;
3644

@@ -101,6 +109,7 @@ public AbstractTypeScriptClientCodegen() {
101109
typeMapping.put("Error", "Error");
102110

103111
cliOptions.add(new CliOption(CodegenConstants.MODEL_PROPERTY_NAMING, CodegenConstants.MODEL_PROPERTY_NAMING_DESC).defaultValue("camelCase"));
112+
cliOptions.add(new CliOption(CodegenConstants.ENUM_PROPERTY_NAMING, CodegenConstants.ENUM_PROPERTY_NAMING_DESC).defaultValue(enumPropertyNaming.name()));
104113
cliOptions.add(new CliOption(CodegenConstants.SUPPORTS_ES6, CodegenConstants.SUPPORTS_ES6_DESC).defaultValue("false"));
105114

106115
}
@@ -112,6 +121,9 @@ public void processOpts() {
112121
if (additionalProperties.containsKey(CodegenConstants.MODEL_PROPERTY_NAMING)) {
113122
setModelPropertyNaming((String) additionalProperties.get(CodegenConstants.MODEL_PROPERTY_NAMING));
114123
}
124+
if (additionalProperties.containsKey(CodegenConstants.ENUM_PROPERTY_NAMING)) {
125+
setEnumPropertyNaming((String) additionalProperties.get(CodegenConstants.ENUM_PROPERTY_NAMING));
126+
}
115127

116128
if (additionalProperties.containsKey(CodegenConstants.SUPPORTS_ES6)) {
117129
setSupportsES6(Boolean.valueOf(additionalProperties.get(CodegenConstants.SUPPORTS_ES6).toString()));
@@ -409,10 +421,21 @@ public void setModelPropertyNaming(String naming) {
409421
}
410422
}
411423

424+
/**
425+
* @param enumPropertyNamingType The string representation of the naming convention, as defined by {@link ENUM_PROPERTY_NAMING_TYPE}
426+
*/
427+
public void setEnumPropertyNaming(final String enumPropertyNamingType) {
428+
enumPropertyNaming = EnumPropertyNamingUtils.parseEnumPropertyNaming(enumPropertyNamingType);
429+
}
430+
412431
public String getModelPropertyNaming() {
413432
return this.modelPropertyNaming;
414433
}
415434

435+
public ENUM_PROPERTY_NAMING_TYPE getEnumPropertyNaming() {
436+
return enumPropertyNaming;
437+
}
438+
416439
public String getNameUsingModelPropertyNaming(String name) {
417440
switch (CodegenConstants.MODEL_PROPERTY_NAMING_TYPE.valueOf(getModelPropertyNaming())) {
418441
case original: return name;
@@ -448,7 +471,7 @@ public String toEnumVarName(String name, String datatype) {
448471

449472
// for symbol, e.g. $, #
450473
if (getSymbolName(name) != null) {
451-
return camelize(getSymbolName(name));
474+
return EnumPropertyNamingUtils.applyEnumPropertyCapitalisation(getSymbolName(name), enumPropertyNaming);
452475
}
453476

454477
// number
@@ -466,9 +489,7 @@ public String toEnumVarName(String name, String datatype) {
466489
enumName = enumName.replaceFirst("^_", "");
467490
enumName = enumName.replaceFirst("_$", "");
468491

469-
// camelize the enum variable name
470-
// ref: https://basarat.gitbooks.io/typescript/content/docs/enums.html
471-
enumName = camelize(enumName);
492+
enumName = EnumPropertyNamingUtils.applyEnumPropertyCapitalisation(enumName, enumPropertyNaming);
472493

473494
if (enumName.matches("\\d.*")) { // starts with number
474495
return "_" + enumName;
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package io.swagger.codegen.utils;
2+
3+
import io.swagger.codegen.CodegenConstants.ENUM_PROPERTY_NAMING_TYPE;
4+
import io.swagger.codegen.DefaultCodegen;
5+
6+
public final class EnumPropertyNamingUtils {
7+
8+
/** Apply the given {@link ENUM_PROPERTY_NAMING_TYPE} to get the correct capitalisation and underscore-usage for an enum name. */
9+
public static String applyEnumPropertyCapitalisation(String value, final ENUM_PROPERTY_NAMING_TYPE enumPropertyNaming) {
10+
switch (enumPropertyNaming) {
11+
case original:
12+
return value;
13+
case camelCase:
14+
// NOTE: Removes hyphens and underscores
15+
return DefaultCodegen.camelize(value, true);
16+
case PascalCase:
17+
// NOTE: Removes hyphens and underscores
18+
return DefaultCodegen.titleCase(DefaultCodegen.camelize(value));
19+
case snake_case:
20+
// NOTE: Removes hyphens
21+
return DefaultCodegen.underscore(value);
22+
case UPPERCASE:
23+
return value.toUpperCase();
24+
default:
25+
return value;
26+
}
27+
}
28+
29+
public static ENUM_PROPERTY_NAMING_TYPE parseEnumPropertyNaming(final String enumPropertyNamingType) {
30+
try {
31+
return ENUM_PROPERTY_NAMING_TYPE.valueOf(enumPropertyNamingType);
32+
} catch (IllegalArgumentException ex) {
33+
StringBuilder sb = new StringBuilder(enumPropertyNamingType + " is an invalid enum property naming option. Please choose from:");
34+
for (ENUM_PROPERTY_NAMING_TYPE t : ENUM_PROPERTY_NAMING_TYPE.values()) {
35+
sb.append("\n ").append(t.name());
36+
}
37+
throw new RuntimeException(sb.toString());
38+
}
39+
}
40+
}

modules/swagger-codegen/src/test/java/io/swagger/codegen/options/TypeScriptAngularClientOptionsProvider.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ public class TypeScriptAngularClientOptionsProvider implements OptionsProvider {
1212
public static final String SORT_PARAMS_VALUE = "false";
1313
public static final String ENSURE_UNIQUE_PARAMS_VALUE = "true";
1414
public static final String MODEL_PROPERTY_NAMING_VALUE = "camelCase";
15+
public static final String ENUM_PROPERTY_NAMING_VALUE = "snake_case";
1516
private static final String NMP_NAME = "npmName";
1617
private static final String NMP_VERSION = "1.1.2";
1718
private static final String NPM_REPOSITORY = "https://registry.npmjs.org";
@@ -30,6 +31,7 @@ public Map<String, String> createOptions() {
3031
return builder.put(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG, SORT_PARAMS_VALUE)
3132
.put(CodegenConstants.ENSURE_UNIQUE_PARAMS, ENSURE_UNIQUE_PARAMS_VALUE)
3233
.put(CodegenConstants.MODEL_PROPERTY_NAMING, MODEL_PROPERTY_NAMING_VALUE)
34+
.put(CodegenConstants.ENUM_PROPERTY_NAMING, ENUM_PROPERTY_NAMING_VALUE)
3335
.put(CodegenConstants.SUPPORTS_ES6, SUPPORTS_ES6_VALUE)
3436
.put(TypeScriptAngularClientCodegen.NPM_NAME, NMP_NAME)
3537
.put(TypeScriptAngularClientCodegen.NPM_VERSION, NMP_VERSION)

modules/swagger-codegen/src/test/java/io/swagger/codegen/options/TypeScriptAngularJsClientOptionsProvider.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public class TypeScriptAngularJsClientOptionsProvider implements OptionsProvider
1111
public static final String SORT_PARAMS_VALUE = "false";
1212
public static final String ENSURE_UNIQUE_PARAMS_VALUE = "true";
1313
public static final String MODEL_PROPERTY_NAMING_VALUE = "camelCase";
14+
public static final String ENUM_PROPERTY_NAMING_VALUE = "snake_case";
1415
public static final String ALLOW_UNICODE_IDENTIFIERS_VALUE = "false";
1516

1617
@Override
@@ -25,6 +26,7 @@ public Map<String, String> createOptions() {
2526
.put(CodegenConstants.SUPPORTS_ES6, SUPPORTS_ES6_VALUE)
2627
.put(CodegenConstants.ENSURE_UNIQUE_PARAMS, ENSURE_UNIQUE_PARAMS_VALUE)
2728
.put(CodegenConstants.MODEL_PROPERTY_NAMING, MODEL_PROPERTY_NAMING_VALUE)
29+
.put(CodegenConstants.ENUM_PROPERTY_NAMING, ENUM_PROPERTY_NAMING_VALUE)
2830
.put(CodegenConstants.ALLOW_UNICODE_IDENTIFIERS, ALLOW_UNICODE_IDENTIFIERS_VALUE)
2931
.build();
3032
}

modules/swagger-codegen/src/test/java/io/swagger/codegen/options/TypeScriptAureliaClientOptionsProvider.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public class TypeScriptAureliaClientOptionsProvider implements OptionsProvider {
1111
public static final String ENSURE_UNIQUE_PARAMS_VALUE = "true";
1212
public static final Boolean SUPPORTS_ES6_VALUE = false;
1313
public static final String MODEL_PROPERTY_NAMING_VALUE = "camelCase";
14+
public static final String ENUM_PROPERTY_NAMING_VALUE = "snake_case";
1415
private static final String NMP_NAME = "npmName";
1516
private static final String NMP_VERSION = "1.0.0";
1617
public static final String ALLOW_UNICODE_IDENTIFIERS_VALUE = "false";
@@ -27,6 +28,7 @@ public Map<String, String> createOptions() {
2728
return builder.put(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG, SORT_PARAMS_VALUE)
2829
.put(CodegenConstants.ENSURE_UNIQUE_PARAMS, ENSURE_UNIQUE_PARAMS_VALUE)
2930
.put(CodegenConstants.MODEL_PROPERTY_NAMING, MODEL_PROPERTY_NAMING_VALUE)
31+
.put(CodegenConstants.ENUM_PROPERTY_NAMING, ENUM_PROPERTY_NAMING_VALUE)
3032
.put(CodegenConstants.SUPPORTS_ES6, String.valueOf(SUPPORTS_ES6_VALUE))
3133
.put(TypeScriptAureliaClientCodegen.NPM_NAME, NMP_NAME)
3234
.put(TypeScriptAureliaClientCodegen.NPM_VERSION, NMP_VERSION)

modules/swagger-codegen/src/test/java/io/swagger/codegen/options/TypeScriptFetchClientOptionsProvider.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public class TypeScriptFetchClientOptionsProvider implements OptionsProvider {
1111
public static final String ENSURE_UNIQUE_PARAMS_VALUE = "true";
1212
public static final Boolean SUPPORTS_ES6_VALUE = false;
1313
public static final String MODEL_PROPERTY_NAMING_VALUE = "camelCase";
14+
public static final String ENUM_PROPERTY_NAMING_VALUE = "snake_case";
1415
private static final String NMP_NAME = "npmName";
1516
private static final String NMP_VERSION = "1.0.0";
1617
private static final String NPM_REPOSITORY = "https://registry.npmjs.org";
@@ -28,6 +29,7 @@ public Map<String, String> createOptions() {
2829
return builder.put(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG, SORT_PARAMS_VALUE)
2930
.put(CodegenConstants.ENSURE_UNIQUE_PARAMS, ENSURE_UNIQUE_PARAMS_VALUE)
3031
.put(CodegenConstants.MODEL_PROPERTY_NAMING, MODEL_PROPERTY_NAMING_VALUE)
32+
.put(CodegenConstants.ENUM_PROPERTY_NAMING, ENUM_PROPERTY_NAMING_VALUE)
3133
.put(CodegenConstants.SUPPORTS_ES6, String.valueOf(SUPPORTS_ES6_VALUE))
3234
.put(TypeScriptFetchClientCodegen.NPM_NAME, NMP_NAME)
3335
.put(TypeScriptFetchClientCodegen.NPM_VERSION, NMP_VERSION)

modules/swagger-codegen/src/test/java/io/swagger/codegen/options/TypeScriptInversifyClientOptionsProvider.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ public class TypeScriptInversifyClientOptionsProvider implements OptionsProvider
1212
public static final String SORT_PARAMS_VALUE = "false";
1313
public static final String ENSURE_UNIQUE_PARAMS_VALUE = "true";
1414
public static final String MODEL_PROPERTY_NAMING_VALUE = "camelCase";
15+
public static final String ENUM_PROPERTY_NAMING_VALUE = "snake_case";
1516
private static final String NMP_NAME = "npmName";
1617
private static final String NMP_VERSION = "1.1.2";
1718
private static final String NPM_REPOSITORY = "https://registry.npmjs.org";
@@ -31,6 +32,7 @@ public Map<String, String> createOptions() {
3132
return builder.put(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG, SORT_PARAMS_VALUE)
3233
.put(CodegenConstants.ENSURE_UNIQUE_PARAMS, ENSURE_UNIQUE_PARAMS_VALUE)
3334
.put(CodegenConstants.MODEL_PROPERTY_NAMING, MODEL_PROPERTY_NAMING_VALUE)
35+
.put(CodegenConstants.ENUM_PROPERTY_NAMING, ENUM_PROPERTY_NAMING_VALUE)
3436
.put(CodegenConstants.SUPPORTS_ES6, SUPPORTS_ES6_VALUE)
3537
.put(TypeScriptInversifyClientCodegen.NPM_NAME, NMP_NAME)
3638
.put(TypeScriptInversifyClientCodegen.NPM_VERSION, NMP_VERSION)

modules/swagger-codegen/src/test/java/io/swagger/codegen/options/TypeScriptNodeClientOptionsProvider.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public class TypeScriptNodeClientOptionsProvider implements OptionsProvider {
1313
public static final String SORT_PARAMS_VALUE = "false";
1414
public static final String ENSURE_UNIQUE_PARAMS_VALUE = "true";
1515
public static final String MODEL_PROPERTY_NAMING_VALUE = "camelCase";
16+
public static final String ENUM_PROPERTY_NAMING_VALUE = "snake_case";
1617

1718
private static final String NMP_NAME = "npmName";
1819
private static final String NMP_VERSION = "1.1.2";
@@ -32,6 +33,7 @@ public Map<String, String> createOptions() {
3233
.put(CodegenConstants.SUPPORTS_ES6, SUPPORTS_ES6_VALUE)
3334
.put(CodegenConstants.ENSURE_UNIQUE_PARAMS, ENSURE_UNIQUE_PARAMS_VALUE)
3435
.put(CodegenConstants.MODEL_PROPERTY_NAMING, MODEL_PROPERTY_NAMING_VALUE)
36+
.put(CodegenConstants.ENUM_PROPERTY_NAMING, ENUM_PROPERTY_NAMING_VALUE)
3537
.put(TypeScriptAngularClientCodegen.NPM_NAME, NMP_NAME)
3638
.put(TypeScriptAngularClientCodegen.NPM_VERSION, NMP_VERSION)
3739
.put(TypeScriptAngularClientCodegen.SNAPSHOT, Boolean.FALSE.toString())

0 commit comments

Comments
 (0)