Skip to content

Commit c30d84a

Browse files
Merge pull request #167 from sebgroup/develop
New release with new OpenAPI generator type for Angular
2 parents 50dedcb + 1273c34 commit c30d84a

File tree

12 files changed

+905
-253
lines changed

12 files changed

+905
-253
lines changed

package-lock.json

Lines changed: 334 additions & 230 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
"moment": "^2.24.0"
4343
},
4444
"devDependencies": {
45-
"@commitlint/cli": "^8.3.5",
45+
"@commitlint/cli": "^9.0.1",
4646
"@commitlint/config-conventional": "^8.3.4",
4747
"@semantic-release/changelog": "^5.0.1",
4848
"@types/jest": "^26.0.0",

src/openapiGenerator/generatorList.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export type OpenApiGenerator = ClientSideGenerator | ServerSideGenerator | DocumentationGenerator | SchemaGenerator | ConfigGenerator;
1+
export type OpenApiGenerator = ClientSideGenerator | ServerSideGenerator | DocumentationGenerator | SchemaGenerator | ConfigGenerator | SEBGenerator;
22

33
export type ClientSideGenerator = "ada" | "android" | "apex" | "bash" | "c" |
44
"clojure" | "cpp-qt5-client" | "cpp-restsdk" | "cpp-tizen" | "csharp" |
@@ -28,4 +28,19 @@ export type DocumentationGenerator = "asciidoc" | "cwiki" | "dynamic-html" | "ht
2828

2929
export type SchemaGenerator = "avro-schema" | "mysql-schema";
3030

31-
export type ConfigGenerator = "apache2" | "graphql-schema" | "protobuf-schema";
31+
export type ConfigGenerator = "apache2" | "graphql-schema" | "protobuf-schema";
32+
33+
export type SEBGenerator = "ts-angular";
34+
35+
/**
36+
* check if generator is custom seb generator
37+
* @param generator generator set
38+
*/
39+
export function isSEBGenerator(generator: OpenApiGenerator){
40+
switch (generator) {
41+
case "ts-angular":
42+
return true;
43+
default:
44+
return false;
45+
}
46+
}

src/openapiGenerator/openapiGenerator.ts

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,13 @@ import {
2424
import {
2525
CustomOptions,
2626
CustomOptionType,
27-
CustomOptionName,
2827
CustomTemplates,
2928
SEBTemplate,
3029
CustomOptionsArgumentType,
30+
customGeneratorMapper,
31+
CustomGeneratorMapper
3132
} from "./options/customOptions";
32-
import { OpenApiGenerator } from "./generatorList";
33+
import { OpenApiGenerator, isSEBGenerator } from "./generatorList";
3334
import { generateMock } from "./mockGenerator/mockGenerator";
3435
import { join } from "path";
3536

@@ -42,6 +43,7 @@ type GeneratorArgs = (BatchArgumentType | ConfigHelpArgumentType | GenerateArgum
4243
};
4344

4445
const minimist = require("minimist");
46+
const dargs = require("dargs");
4547

4648
export function generatorFn() {
4749
const program: commander.Command = createCommand();
@@ -89,8 +91,8 @@ export function generatorFn() {
8991

9092
if (generateArgs.p || generateArgs["additional-properties"]) {
9193
const additionalProps: keyof GenerateArgumentType = !!generateArgs.p ? "p" : "additional-properties";
92-
args[additionalProps] =
93-
args[additionalProps] + `,${extraOptions.toString()}`;
94+
const formattedAdditionalProps: string = removeExtraOption(args[additionalProps]);
95+
args[additionalProps] = `${formattedAdditionalProps}${formattedAdditionalProps.length ? ", " : ""}${extraOptions.toString()}`;
9496
} else {
9597
(args as GenerateArgumentType).p = extraOptions.toString();
9698
}
@@ -107,6 +109,12 @@ export function generatorFn() {
107109
// generate mock
108110
generateMock((generateArgs.i || generateArgs["input-spec"]), outputDir);
109111
}
112+
if (isSEBGenerator(generatorName)) {
113+
const relativeGenerator: OpenApiGenerator = customGeneratorMapper.find(({ generator }: CustomGeneratorMapper) => generatorName === generator)?.relativeGenerator;
114+
if (relativeGenerator) {
115+
(args as GenerateArgumentType)[(args as GenerateArgumentType).g ? "g" : "generator-name"] = relativeGenerator;
116+
}
117+
}
110118
}
111119
CustomOptions.filter(({ option }: CustomOptionType) => !!option).map((item: CustomOptionType) => {
112120
const customOption: CustomOptionsArgumentType = minimist(item.option);
@@ -115,10 +123,11 @@ export function generatorFn() {
115123
delete args[selectedKey];
116124
}
117125
});
118-
const revertArgs: Array<string> = require("dargs")(args, { excludes: ["_"] });
126+
const revertArgs: Array<string> = dargs(args, { excludes: ["_"] });
119127
if (revertArgs) {
120128
command += ` ${revertArgs.join(" ")}`;
121129
}
130+
console.log(command);
122131
process.env[
123132
"JAVA_OPTS"
124133
] = `-Dio.swagger.parser.util.RemoteUrl.trustAll=true -Dio.swagger.v3.parser.util.RemoteUrl.trustAll=true`;
@@ -131,6 +140,24 @@ export function generatorFn() {
131140
program.parse(process.argv);
132141
}
133142

143+
/**
144+
* remove extra option
145+
* @param addtionalProperties additional properties
146+
*/
147+
function removeExtraOption(addtionalProperties: string): string {
148+
const additionalArgs: Array<string> = addtionalProperties.split(",");
149+
let newAdditionalArgs: string = "";
150+
additionalArgs.map((argument: string) => {
151+
const keys: Array<string> = argument.split("=");
152+
const keyName: string = keys[0];
153+
const relatedOption: CustomOptionType = CustomOptions.find((option: CustomOptionType) => !!option.mappingName && option.mappingName === keyName);
154+
if (keys[1] !== "false" || !relatedOption?.removeOnFalse) {
155+
newAdditionalArgs = argument;
156+
}
157+
})
158+
return newAdditionalArgs;
159+
}
160+
134161
/**
135162
* format extra options into array to append to -p
136163
* @param args arguments

src/openapiGenerator/options/customOptions.ts

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { OptionType } from "./option.type";
2-
import { OpenApiGenerator } from "../generatorList";
3-
import { GenerateOptionName } from "./generateOptions";
2+
import { OpenApiGenerator, SEBGenerator } from "../generatorList";
43

54
export interface CustomOptionType extends OptionType {
65
mappingName?: string;
@@ -9,6 +8,11 @@ export interface CustomOptionType extends OptionType {
98
noValue?: boolean;
109
defaultValue?: string;
1110
additionalProp?: boolean;
11+
removeOnFalse?: boolean;
12+
}
13+
14+
export interface AdditionalProps {
15+
withSeparateModelsAndApi?: boolean;
1216
}
1317

1418
export interface SEBTemplate {
@@ -77,7 +81,8 @@ const options: Array<CustomOptionType> = [
7781
description: "separate models and apis",
7882
mappingName: "withSeparateModelsAndApi",
7983
defaultValue: "true",
80-
additionalProp: true
84+
additionalProp: true,
85+
removeOnFalse: true
8186
},
8287
{
8388
option: null,
@@ -95,6 +100,19 @@ const options: Array<CustomOptionType> = [
95100
}
96101
];
97102

103+
104+
export interface CustomGeneratorMapper {
105+
generator: SEBGenerator;
106+
relativeGenerator: OpenApiGenerator;
107+
}
108+
109+
const customGeneratorMapper: Array<CustomGeneratorMapper> = [
110+
{
111+
generator: "ts-angular",
112+
relativeGenerator: "typescript-axios"
113+
}
114+
];
115+
98116
const templates: Array<SEBTemplate> = [
99117
{
100118
generator: "typescript-axios",
@@ -103,7 +121,11 @@ const templates: Array<SEBTemplate> = [
103121
{
104122
generator: "typescript-angular",
105123
templatePath: "./node_modules/@sebgroup/frontend-tools/dist/openapiGenerator/templates/typescript-angular"
124+
},
125+
{
126+
generator: "ts-angular",
127+
templatePath: "./node_modules/@sebgroup/frontend-tools/dist/openapiGenerator/templates/ts-angular"
106128
}
107129
]
108130

109-
export { options as CustomOptions, OptionName as CustomOptionName, templates as CustomTemplates };
131+
export { options as CustomOptions, OptionName as CustomOptionName, templates as CustomTemplates, customGeneratorMapper };

src/openapiGenerator/options/generateOptions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,6 @@ const defaultOptions: Array<DefaultOptionType> = [
295295
key: [OptionName.outputShort, OptionName.output],
296296
value: "./src/apis"
297297
}
298-
]
298+
];
299299

300300
export { options as GenerateOptions, defaultOptions as GenerateDefaultOptions, OptionName as GenerateOptionName, GenerateArgumentType };
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// tslint:disable
2+
{{>licenseInfo}}
3+
4+
{{^withSeparateModelsAndApi}}
5+
import * as globalImportUrl from 'url';
6+
import { Configuration } from './configuration';
7+
import { Observable } from "rxjs";
8+
// Some imports not used depending on template conditions
9+
// @ts-ignore
10+
import { APIModel, APIModelOptions, AttributeMapItem, HttpOptions, APIHandler, APIURLTypes, ApiKeyAuth, OAuth } from "./base";
11+
12+
{{#models}}
13+
{{#model}}{{#isEnum}}{{>modelEnum}}{{/isEnum}}{{#oneOf}}{{#-first}}{{>modelOneOf}}{{/-first}}{{/oneOf}}{{^isEnum}}{{^oneOf}}{{>modelGeneric}}{{/oneOf}}{{/isEnum}}{{/model}}
14+
{{/models}}
15+
{{#apiInfo}}{{#apis}}
16+
{{>apiInner}}
17+
{{/apis}}{{/apiInfo}}
18+
{{/withSeparateModelsAndApi}}
19+
20+
{{#withSeparateModelsAndApi}}
21+
{{#apiInfo}}{{#apis}}{{#operations}}export * from './{{tsApiPackage}}/{{classFilename}}';
22+
{{/operations}}{{/apis}}{{/apiInfo}}
23+
{{/withSeparateModelsAndApi}}
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
{{#withSeparateModelsAndApi}}
2+
// tslint:disable
3+
import { Observable } from "rxjs";
4+
import { APIHandler, APIURLTypes, HttpOptions{{#operations}}{{#operation}}{{#-first}}{{#authMethods}}{{#isBasic}}, HttpBasicAuth{{/isBasic}}{{#isApiKey}}, ApiKeyAuth{{/isApiKey}}{{#isBasicBearer}}, OAuth{{/isBasicBearer}}{{#isOAuth}}, OAuth{{/isOAuth}}{{/authMethods}}{{/-first}}{{/operation}}{{/operations}} } from "{{apiRelativeToRoot}}base";
5+
import { {{#imports}}{{classname}}{{^-last}}, {{/-last}}{{/imports}} } from "{{apiRelativeToRoot}}{{tsModelPackage}}";
6+
{{/withSeparateModelsAndApi}}
7+
8+
{{#operations}}
9+
export class {{classname}} extends APIHandler {
10+
static urls: APIURLTypes.{{classname}} = {
11+
{{#operation}}{{nickname}}: "{{path}}"{{#hasMore}},
12+
{{/hasMore}}{{/operation}}
13+
};
14+
15+
constructor() {
16+
super("{{classname}}");{{#operation}}{{#-first}}{{#authMethods}}
17+
this.authentications.push({{#isBasic}}new HttpBasicAuth(){{/isBasic}}{{#isApiKey}}new ApiKeyAuth({{#isKeyInHeader}}'header', {{/isKeyInHeader}}{{^isKeyInHeader}}'query', {{/isKeyInHeader}}'{{keyParamName}}'){{/isApiKey}}{{#isBasicBearer}}new OAuth(){{/isBasicBearer}}{{#isOAuth}}new OAuth(){{/isOAuth}});{{/authMethods}}{{/-first}}{{/operation}}
18+
}
19+
20+
{{#operation}}
21+
{{#-first}}
22+
{{#authMethods}}
23+
// authentication {{name}} required
24+
{{#isApiKey}}
25+
private _apiKey: string;
26+
get apiKey() {
27+
return this._apiKey;
28+
}
29+
{{#isKeyInHeader}}
30+
set apiKey(key: string | Function) {
31+
const localApiKey: string = typeof key === 'function'
32+
? key("{{keyParamName}}")
33+
: key;
34+
this._apiKey = localApiKey;
35+
}
36+
{{/isKeyInHeader}}
37+
{{#isKeyInQuery}}
38+
set apiKey(key: string | Function) {
39+
const localApiKey: string = typeof key === 'function'
40+
? key("{{keyParamName}}")
41+
: key;
42+
this._apiKey = localApiKey;
43+
}
44+
{{/isKeyInQuery}}
45+
{{/isApiKey}}
46+
{{#isBasicBasic}}
47+
private _username: string;
48+
get username() {
49+
return this._username;
50+
}
51+
set username(username: string) {
52+
this._username = username;
53+
}
54+
private _password: string;
55+
get password() {
56+
return this._password;
57+
}
58+
set password(password: string) {
59+
this._password = password;
60+
}
61+
{{/isBasicBasic}}
62+
{{#isBasicBearer}}
63+
private _accessToken: string;
64+
get accessToken() {
65+
return this._accessToken;
66+
}
67+
// http bearer authentication required
68+
set accessToken(accessToken: string | Function) {
69+
const bearerToken: string = typeof accessToken === 'function'
70+
? accessToken()
71+
: accessToken;
72+
this._accessToken = bearerToken;
73+
}
74+
{{/isBasicBearer}}
75+
{{#isOAuth}}
76+
private _accessToken: string;
77+
get accessToken() {
78+
return this._accessToken;
79+
}
80+
set accessToken(token: string) {
81+
this._accessToken = token;
82+
}
83+
{{/isOAuth}}
84+
{{/authMethods}}
85+
{{/-first}}
86+
/**{{#summary}}
87+
* {{summary}}{{/summary}}{{#notes}}
88+
* {{notes}}{{/notes}}{{#allParams}}
89+
* @param {{paramName}} {{description}}{{/allParams}}
90+
*/
91+
public {{nickname}}(params: {
92+
{{#allParams}}{{paramName}}{{^required}}?{{/required}}: {{^isPrimitiveType}}{{^isFile}}{{/isFile}}{{/isPrimitiveType}}{{{dataType}}};{{#hasMore}}
93+
{{/hasMore}}{{/allParams}}
94+
}{{^hasRequiredParams}} = {}{{/hasRequiredParams}}, options?: HttpOptions): Observable<{{#imports}}{{#.}}{{.}}{{^-last}} | {{/-last}}{{/.}}{{/imports}}> {
95+
const acceptTypes: Array<string> = [{{#produces}}"{{mediaType}}"{{#hasMore}}, {{/hasMore}}{{/produces}}];
96+
this.initAuth({{#hasAuthMethods}}{{#cookieAuth}}false{{/cookieAuth}}{{#authMethods}}true, {{#isApiKey}}{{#isKeyInHeader}}{ token: this.apiKey as string, contentTypes: acceptTypes, key: "Authentication" }{{/isKeyInHeader}}{{/isApiKey}}{{#isBasicBasic}}{ username: this.username, password: this.password, key: "Basic" }{{/isBasicBasic}}{{#isBasicBearer}}{ token: this.accessToken, contentTypes: acceptTypes, key: "Authentication" } {{/isBasicBearer}}{{#isOAuth}}{ token: this.accessToken, contentTypes: acceptTypes, key: "Authentication" }{{/isOAuth}}{{/authMethods}}{{/hasAuthMethods}}{{^hasAuthMethods}}false{{/hasAuthMethods}});
97+
const apiURL: string = this.initAPIURL({{classname}}.urls.{{nickname}}{{#hasPathParams}}, { {{/hasPathParams}}{{#pathParams}}{{baseName}}: params.{{paramName}}{{#hasMore}}, {{/hasMore}}{{/pathParams}}{{#hasPathParams}} } {{/hasPathParams}}{{^pathParams}}, null{{/pathParams}});
98+
options = this.initOptions(options, { {{#queryParams}}{{paramName}}: params.{{paramName}}{{#hasMore}}, {{/hasMore}}{{/queryParams}} }, { {{#headerParams}}{{paramName}}: params.{{paramName}}{{#hasMore}}, {{/hasMore}}{{/headerParams}} });{{#formParams}}{{#isFile}}
99+
const formData: FormData = new FormData();
100+
formData.append("file", params.{{paramName}} as any);{{/isFile}}{{/formParams}}
101+
const body: any = {{#formParams}}{{#-first}}{ {{/-first}}{{#isFile}}formData{{/isFile}}{{^isFile}}{{paramName}}: params.{{paramName}}{{/isFile}}{{#-last}} }{{/-last}}{{^-last}}, {{/-last}}{{/formParams}}{{^formParams}}{{#bodyParam}}params.{{paramName}}{{/bodyParam}}{{/formParams}}{{^formParams}}{{^bodyParam}}null{{/bodyParam}}{{/formParams}};
102+
return this.makeCall<{{#imports}}{{#.}}{{.}}{{^-last}} | {{/-last}}{{/.}}{{/imports}}>("{{httpMethod}}".toLowerCase(), apiURL, options, body);
103+
}
104+
105+
{{/operation}}
106+
}
107+
{{/operations}}

0 commit comments

Comments
 (0)