mirror of
https://github.com/OpenAPITools/openapi-generator.git
synced 2025-07-03 22:20:56 +00:00
fix issue 7048 (#7108)
This commit is contained in:
parent
a7da5d8098
commit
b0f61f394c
@ -47,16 +47,20 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode
|
|||||||
modelTemplateFiles.put("model.mustache", ".ts");
|
modelTemplateFiles.put("model.mustache", ".ts");
|
||||||
apiTemplateFiles.put("api.service.mustache", ".ts");
|
apiTemplateFiles.put("api.service.mustache", ".ts");
|
||||||
languageSpecificPrimitives.add("Blob");
|
languageSpecificPrimitives.add("Blob");
|
||||||
typeMapping.put("file","Blob");
|
typeMapping.put("file", "Blob");
|
||||||
apiPackage = "api";
|
apiPackage = "api";
|
||||||
modelPackage = "model";
|
modelPackage = "model";
|
||||||
|
|
||||||
|
|
||||||
this.cliOptions.add(new CliOption(NPM_NAME, "The name under which you want to publish generated npm package"));
|
this.cliOptions.add(new CliOption(NPM_NAME, "The name under which you want to publish generated npm package"));
|
||||||
this.cliOptions.add(new CliOption(NPM_VERSION, "The version of your npm package"));
|
this.cliOptions.add(new CliOption(NPM_VERSION, "The version of your npm package"));
|
||||||
this.cliOptions.add(new CliOption(NPM_REPOSITORY, "Use this property to set an url your private npmRepo in the package.json"));
|
this.cliOptions.add(new CliOption(NPM_REPOSITORY,
|
||||||
this.cliOptions.add(new CliOption(SNAPSHOT, "When setting this property to true the version will be suffixed with -SNAPSHOT.yyyyMMddHHmm", BooleanProperty.TYPE).defaultValue(Boolean.FALSE.toString()));
|
"Use this property to set an url your private npmRepo in the package.json"));
|
||||||
this.cliOptions.add(new CliOption(WITH_INTERFACES, "Setting this property to true will generate interfaces next to the default class implementations.", BooleanProperty.TYPE).defaultValue(Boolean.FALSE.toString()));
|
this.cliOptions.add(new CliOption(SNAPSHOT,
|
||||||
|
"When setting this property to true the version will be suffixed with -SNAPSHOT.yyyyMMddHHmm",
|
||||||
|
BooleanProperty.TYPE).defaultValue(Boolean.FALSE.toString()));
|
||||||
|
this.cliOptions.add(new CliOption(WITH_INTERFACES,
|
||||||
|
"Setting this property to true will generate interfaces next to the default class implementations.",
|
||||||
|
BooleanProperty.TYPE).defaultValue(Boolean.FALSE.toString()));
|
||||||
this.cliOptions.add(new CliOption(NG_VERSION, "The version of Angular. Default is '4.3'"));
|
this.cliOptions.add(new CliOption(NG_VERSION, "The version of Angular. Default is '4.3'"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,22 +83,23 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode
|
|||||||
@Override
|
@Override
|
||||||
public void processOpts() {
|
public void processOpts() {
|
||||||
super.processOpts();
|
super.processOpts();
|
||||||
supportingFiles.add(new SupportingFile("models.mustache", modelPackage().replace('.', File.separatorChar), "models.ts"));
|
supportingFiles.add(
|
||||||
supportingFiles.add(new SupportingFile("apis.mustache", apiPackage().replace('.', File.separatorChar), "api.ts"));
|
new SupportingFile("models.mustache", modelPackage().replace('.', File.separatorChar), "models.ts"));
|
||||||
|
supportingFiles
|
||||||
|
.add(new SupportingFile("apis.mustache", apiPackage().replace('.', File.separatorChar), "api.ts"));
|
||||||
supportingFiles.add(new SupportingFile("index.mustache", getIndexDirectory(), "index.ts"));
|
supportingFiles.add(new SupportingFile("index.mustache", getIndexDirectory(), "index.ts"));
|
||||||
supportingFiles.add(new SupportingFile("api.module.mustache", getIndexDirectory(), "api.module.ts"));
|
supportingFiles.add(new SupportingFile("api.module.mustache", getIndexDirectory(), "api.module.ts"));
|
||||||
supportingFiles.add(new SupportingFile("rxjs-operators.mustache", getIndexDirectory(), "rxjs-operators.ts"));
|
|
||||||
supportingFiles.add(new SupportingFile("configuration.mustache", getIndexDirectory(), "configuration.ts"));
|
supportingFiles.add(new SupportingFile("configuration.mustache", getIndexDirectory(), "configuration.ts"));
|
||||||
supportingFiles.add(new SupportingFile("variables.mustache", getIndexDirectory(), "variables.ts"));
|
supportingFiles.add(new SupportingFile("variables.mustache", getIndexDirectory(), "variables.ts"));
|
||||||
supportingFiles.add(new SupportingFile("encoder.mustache", getIndexDirectory(), "encoder.ts"));
|
supportingFiles.add(new SupportingFile("encoder.mustache", getIndexDirectory(), "encoder.ts"));
|
||||||
supportingFiles.add(new SupportingFile("gitignore", "", ".gitignore"));
|
supportingFiles.add(new SupportingFile("gitignore", "", ".gitignore"));
|
||||||
supportingFiles.add(new SupportingFile("git_push.sh.mustache", "", "git_push.sh"));
|
supportingFiles.add(new SupportingFile("git_push.sh.mustache", "", "git_push.sh"));
|
||||||
|
|
||||||
if(additionalProperties.containsKey(NPM_NAME)) {
|
if (additionalProperties.containsKey(NPM_NAME)) {
|
||||||
addNpmPackageGeneration();
|
addNpmPackageGeneration();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(additionalProperties.containsKey(WITH_INTERFACES)) {
|
if (additionalProperties.containsKey(WITH_INTERFACES)) {
|
||||||
boolean withInterfaces = Boolean.parseBoolean(additionalProperties.get(WITH_INTERFACES).toString());
|
boolean withInterfaces = Boolean.parseBoolean(additionalProperties.get(WITH_INTERFACES).toString());
|
||||||
if (withInterfaces) {
|
if (withInterfaces) {
|
||||||
apiTemplateFiles.put("apiInterface.mustache", "Interface.ts");
|
apiTemplateFiles.put("apiInterface.mustache", "Interface.ts");
|
||||||
@ -114,10 +119,13 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode
|
|||||||
additionalProperties.put("injectionToken", ngVersion.atLeast("4.0.0") ? "InjectionToken" : "OpaqueToken");
|
additionalProperties.put("injectionToken", ngVersion.atLeast("4.0.0") ? "InjectionToken" : "OpaqueToken");
|
||||||
additionalProperties.put("injectionTokenTyped", ngVersion.atLeast("4.0.0"));
|
additionalProperties.put("injectionTokenTyped", ngVersion.atLeast("4.0.0"));
|
||||||
additionalProperties.put("useHttpClient", ngVersion.atLeast("4.3.0"));
|
additionalProperties.put("useHttpClient", ngVersion.atLeast("4.3.0"));
|
||||||
|
if (!ngVersion.atLeast("4.3.0")) {
|
||||||
|
supportingFiles.add(new SupportingFile("rxjs-operators.mustache", getIndexDirectory(), "rxjs-operators.ts"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addNpmPackageGeneration() {
|
private void addNpmPackageGeneration() {
|
||||||
if(additionalProperties.containsKey(NPM_NAME)) {
|
if (additionalProperties.containsKey(NPM_NAME)) {
|
||||||
this.setNpmName(additionalProperties.get(NPM_NAME).toString());
|
this.setNpmName(additionalProperties.get(NPM_NAME).toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -125,7 +133,8 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode
|
|||||||
this.setNpmVersion(additionalProperties.get(NPM_VERSION).toString());
|
this.setNpmVersion(additionalProperties.get(NPM_VERSION).toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (additionalProperties.containsKey(SNAPSHOT) && Boolean.valueOf(additionalProperties.get(SNAPSHOT).toString())) {
|
if (additionalProperties.containsKey(SNAPSHOT)
|
||||||
|
&& Boolean.valueOf(additionalProperties.get(SNAPSHOT).toString())) {
|
||||||
this.setNpmVersion(npmVersion + "-SNAPSHOT." + SNAPSHOT_SUFFIX_FORMAT.format(new Date()));
|
this.setNpmVersion(npmVersion + "-SNAPSHOT." + SNAPSHOT_SUFFIX_FORMAT.format(new Date()));
|
||||||
}
|
}
|
||||||
additionalProperties.put(NPM_VERSION, npmVersion);
|
additionalProperties.put(NPM_VERSION, npmVersion);
|
||||||
@ -154,17 +163,17 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode
|
|||||||
@Override
|
@Override
|
||||||
public String getTypeDeclaration(Property p) {
|
public String getTypeDeclaration(Property p) {
|
||||||
Property inner;
|
Property inner;
|
||||||
if(p instanceof ArrayProperty) {
|
if (p instanceof ArrayProperty) {
|
||||||
ArrayProperty mp1 = (ArrayProperty)p;
|
ArrayProperty mp1 = (ArrayProperty) p;
|
||||||
inner = mp1.getItems();
|
inner = mp1.getItems();
|
||||||
return this.getSwaggerType(p) + "<" + this.getTypeDeclaration(inner) + ">";
|
return this.getSwaggerType(p) + "<" + this.getTypeDeclaration(inner) + ">";
|
||||||
} else if(p instanceof MapProperty) {
|
} else if (p instanceof MapProperty) {
|
||||||
MapProperty mp = (MapProperty)p;
|
MapProperty mp = (MapProperty) p;
|
||||||
inner = mp.getAdditionalProperties();
|
inner = mp.getAdditionalProperties();
|
||||||
return "{ [key: string]: " + this.getTypeDeclaration(inner) + "; }";
|
return "{ [key: string]: " + this.getTypeDeclaration(inner) + "; }";
|
||||||
} else if(p instanceof FileProperty) {
|
} else if (p instanceof FileProperty) {
|
||||||
return "Blob";
|
return "Blob";
|
||||||
} else if(p instanceof ObjectProperty) {
|
} else if (p instanceof ObjectProperty) {
|
||||||
return "any";
|
return "any";
|
||||||
} else {
|
} else {
|
||||||
return super.getTypeDeclaration(p);
|
return super.getTypeDeclaration(p);
|
||||||
@ -174,7 +183,7 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode
|
|||||||
@Override
|
@Override
|
||||||
public String getSwaggerType(Property p) {
|
public String getSwaggerType(Property p) {
|
||||||
String swaggerType = super.getSwaggerType(p);
|
String swaggerType = super.getSwaggerType(p);
|
||||||
if(isLanguagePrimitive(swaggerType) || isLanguageGenericType(swaggerType)) {
|
if (isLanguagePrimitive(swaggerType) || isLanguageGenericType(swaggerType)) {
|
||||||
return swaggerType;
|
return swaggerType;
|
||||||
}
|
}
|
||||||
applyLocalTypeMapping(swaggerType);
|
applyLocalTypeMapping(swaggerType);
|
||||||
@ -182,7 +191,7 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode
|
|||||||
}
|
}
|
||||||
|
|
||||||
private String applyLocalTypeMapping(String type) {
|
private String applyLocalTypeMapping(String type) {
|
||||||
if (typeMapping.containsKey(type)) {
|
if (typeMapping.containsKey(type)) {
|
||||||
type = typeMapping.get(type);
|
type = typeMapping.get(type);
|
||||||
}
|
}
|
||||||
return type;
|
return type;
|
||||||
@ -193,8 +202,8 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean isLanguageGenericType(String type) {
|
private boolean isLanguageGenericType(String type) {
|
||||||
for (String genericType: languageGenericTypes) {
|
for (String genericType : languageGenericTypes) {
|
||||||
if (type.startsWith(genericType + "<")) {
|
if (type.startsWith(genericType + "<")) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -222,29 +231,29 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode
|
|||||||
// Convert httpMethod to Angular's RequestMethod enum
|
// Convert httpMethod to Angular's RequestMethod enum
|
||||||
// https://angular.io/docs/ts/latest/api/http/index/RequestMethod-enum.html
|
// https://angular.io/docs/ts/latest/api/http/index/RequestMethod-enum.html
|
||||||
switch (op.httpMethod) {
|
switch (op.httpMethod) {
|
||||||
case "GET":
|
case "GET":
|
||||||
op.httpMethod = "RequestMethod.Get";
|
op.httpMethod = "RequestMethod.Get";
|
||||||
break;
|
break;
|
||||||
case "POST":
|
case "POST":
|
||||||
op.httpMethod = "RequestMethod.Post";
|
op.httpMethod = "RequestMethod.Post";
|
||||||
break;
|
break;
|
||||||
case "PUT":
|
case "PUT":
|
||||||
op.httpMethod = "RequestMethod.Put";
|
op.httpMethod = "RequestMethod.Put";
|
||||||
break;
|
break;
|
||||||
case "DELETE":
|
case "DELETE":
|
||||||
op.httpMethod = "RequestMethod.Delete";
|
op.httpMethod = "RequestMethod.Delete";
|
||||||
break;
|
break;
|
||||||
case "OPTIONS":
|
case "OPTIONS":
|
||||||
op.httpMethod = "RequestMethod.Options";
|
op.httpMethod = "RequestMethod.Options";
|
||||||
break;
|
break;
|
||||||
case "HEAD":
|
case "HEAD":
|
||||||
op.httpMethod = "RequestMethod.Head";
|
op.httpMethod = "RequestMethod.Head";
|
||||||
break;
|
break;
|
||||||
case "PATCH":
|
case "PATCH":
|
||||||
op.httpMethod = "RequestMethod.Patch";
|
op.httpMethod = "RequestMethod.Patch";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new RuntimeException("Unknown HTTP Method " + op.httpMethod + " not allowed");
|
throw new RuntimeException("Unknown HTTP Method " + op.httpMethod + " not allowed");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -256,41 +265,41 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode
|
|||||||
boolean foundUnderscore = false;
|
boolean foundUnderscore = false;
|
||||||
|
|
||||||
// Iterate through existing string, one character at a time.
|
// Iterate through existing string, one character at a time.
|
||||||
for(int i = 0; i < op.path.length(); i++) {
|
for (int i = 0; i < op.path.length(); i++) {
|
||||||
switch(op.path.charAt(i)) {
|
switch (op.path.charAt(i)) {
|
||||||
case '{':
|
case '{':
|
||||||
// We entered curly braces, so track that.
|
// We entered curly braces, so track that.
|
||||||
insideCurly++;
|
insideCurly++;
|
||||||
|
|
||||||
// Add the more complicated component instead of just the brace.
|
// Add the more complicated component instead of just the brace.
|
||||||
pathBuffer.append("${encodeURIComponent(String(");
|
pathBuffer.append("${encodeURIComponent(String(");
|
||||||
break;
|
break;
|
||||||
case '}':
|
case '}':
|
||||||
// We exited curly braces, so track that.
|
// We exited curly braces, so track that.
|
||||||
insideCurly--;
|
insideCurly--;
|
||||||
|
|
||||||
// Add the more complicated component instead of just the brace.
|
// Add the more complicated component instead of just the brace.
|
||||||
pathBuffer.append("))}");
|
pathBuffer.append("))}");
|
||||||
break;
|
break;
|
||||||
case '_':
|
case '_':
|
||||||
// If we're inside the curly brace, the following character will need to be uppercase.
|
// If we're inside the curly brace, the following character will need to be uppercase.
|
||||||
// Otherwise, just add the character.
|
// Otherwise, just add the character.
|
||||||
if (insideCurly > 0) {
|
if (insideCurly > 0) {
|
||||||
foundUnderscore = true;
|
foundUnderscore = true;
|
||||||
} else {
|
} else {
|
||||||
pathBuffer.append(op.path.charAt(i));
|
pathBuffer.append(op.path.charAt(i));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// If we previously found an underscore, we need an uppercase letter.
|
// If we previously found an underscore, we need an uppercase letter.
|
||||||
// Otherwise, just add the character.
|
// Otherwise, just add the character.
|
||||||
if (foundUnderscore) {
|
if (foundUnderscore) {
|
||||||
pathBuffer.append(Character.toUpperCase(op.path.charAt(i)));
|
pathBuffer.append(Character.toUpperCase(op.path.charAt(i)));
|
||||||
foundUnderscore = false;
|
foundUnderscore = false;
|
||||||
} else {
|
} else {
|
||||||
pathBuffer.append(op.path.charAt(i));
|
pathBuffer.append(op.path.charAt(i));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -300,7 +309,7 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode
|
|||||||
|
|
||||||
// Add additional filename information for model imports in the services
|
// Add additional filename information for model imports in the services
|
||||||
List<Map<String, Object>> imports = (List<Map<String, Object>>) operations.get("imports");
|
List<Map<String, Object>> imports = (List<Map<String, Object>>) operations.get("imports");
|
||||||
for(Map<String, Object> im : imports) {
|
for (Map<String, Object> im : imports) {
|
||||||
im.put("filename", im.get("import"));
|
im.put("filename", im.get("import"));
|
||||||
im.put("classname", getModelnameFromModelFilename(im.get("filename").toString()));
|
im.put("classname", getModelnameFromModelFilename(im.get("filename").toString()));
|
||||||
}
|
}
|
||||||
@ -317,23 +326,23 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode
|
|||||||
for (Object _mo : models) {
|
for (Object _mo : models) {
|
||||||
Map<String, Object> mo = (Map<String, Object>) _mo;
|
Map<String, Object> mo = (Map<String, Object>) _mo;
|
||||||
CodegenModel cm = (CodegenModel) mo.get("model");
|
CodegenModel cm = (CodegenModel) mo.get("model");
|
||||||
mo.put("tsImports", toTsImports(cm,cm.imports));
|
mo.put("tsImports", toTsImports(cm, cm.imports));
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<Map<String, String>> toTsImports(CodegenModel cm, Set<String> imports) {
|
private List<Map<String, String>> toTsImports(CodegenModel cm, Set<String> imports) {
|
||||||
List<Map<String, String>> tsImports = new ArrayList<>();
|
List<Map<String, String>> tsImports = new ArrayList<>();
|
||||||
for(String im : imports) {
|
for (String im : imports) {
|
||||||
if(!im.equals(cm.classname)) {
|
if (!im.equals(cm.classname)) {
|
||||||
HashMap<String, String> tsImport = new HashMap<>();
|
HashMap<String, String> tsImport = new HashMap<>();
|
||||||
tsImport.put("classname", im);
|
tsImport.put("classname", im);
|
||||||
tsImport.put("filename", toModelFilename(im));
|
tsImport.put("filename", toModelFilename(im));
|
||||||
tsImports.add(tsImport);
|
tsImports.add(tsImport);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return tsImports;
|
}
|
||||||
|
return tsImports;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1,8 +1,3 @@
|
|||||||
{{#useHttpClient}}
|
|
||||||
// RxJS imports are not needed for Angular 4.3 and later
|
|
||||||
{{/useHttpClient}}
|
|
||||||
|
|
||||||
{{^useHttpClient}}
|
|
||||||
// RxJS imports according to https://angular.io/docs/ts/latest/guide/server-communication.html#!#rxjs
|
// RxJS imports according to https://angular.io/docs/ts/latest/guide/server-communication.html#!#rxjs
|
||||||
|
|
||||||
// See node_module/rxjs/Rxjs.js
|
// See node_module/rxjs/Rxjs.js
|
||||||
@ -14,4 +9,3 @@ import 'rxjs/add/observable/throw';
|
|||||||
// Operators
|
// Operators
|
||||||
import 'rxjs/add/operator/catch';
|
import 'rxjs/add/operator/catch';
|
||||||
import 'rxjs/add/operator/map';
|
import 'rxjs/add/operator/map';
|
||||||
{{/useHttpClient}}
|
|
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
// RxJS imports according to https://angular.io/docs/ts/latest/guide/server-communication.html#!#rxjs
|
// RxJS imports according to https://angular.io/docs/ts/latest/guide/server-communication.html#!#rxjs
|
||||||
|
|
||||||
// See node_module/rxjs/Rxjs.js
|
// See node_module/rxjs/Rxjs.js
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
// RxJS imports according to https://angular.io/docs/ts/latest/guide/server-communication.html#!#rxjs
|
// RxJS imports according to https://angular.io/docs/ts/latest/guide/server-communication.html#!#rxjs
|
||||||
|
|
||||||
// See node_module/rxjs/Rxjs.js
|
// See node_module/rxjs/Rxjs.js
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
// RxJS imports according to https://angular.io/docs/ts/latest/guide/server-communication.html#!#rxjs
|
// RxJS imports according to https://angular.io/docs/ts/latest/guide/server-communication.html#!#rxjs
|
||||||
|
|
||||||
// See node_module/rxjs/Rxjs.js
|
// See node_module/rxjs/Rxjs.js
|
||||||
|
@ -1,2 +0,0 @@
|
|||||||
// RxJS imports are not needed for Angular 4.3 and later
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
// RxJS imports according to https://angular.io/docs/ts/latest/guide/server-communication.html#!#rxjs
|
// RxJS imports according to https://angular.io/docs/ts/latest/guide/server-communication.html#!#rxjs
|
||||||
|
|
||||||
// See node_module/rxjs/Rxjs.js
|
// See node_module/rxjs/Rxjs.js
|
||||||
|
Loading…
x
Reference in New Issue
Block a user