Skip to content

Commit 2b9c91a

Browse files
committed
Add project files
1 parent 040ef2e commit 2b9c91a

21 files changed

Lines changed: 1015 additions & 0 deletions

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
2+
node_modules/

bin/generator

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/usr/bin/env node
2+
3+
require("../index.js");

generators/modelFilesGenerator.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
const { join } = require("path");
2+
const fs = require("fs");
3+
const fx = require('mkdir-recursive');
4+
const mustache = require("mustache");
5+
6+
function modelFilesGenerator(path, apiInfo, models) {
7+
fx.mkdirSync(path);
8+
const template = loadTemplate();
9+
models.forEach(model => modelFileGenerator(path, apiInfo, model, template))
10+
}
11+
12+
function modelFileGenerator(path, apiInfo, model, template) {
13+
const view = model;
14+
view.apiInfo = apiInfo;
15+
16+
saveFile(path, template, view);
17+
}
18+
19+
function loadTemplate() {
20+
const path = join(__dirname, "./templates/model.mst");
21+
return fs.readFileSync(path, "utf8");
22+
}
23+
24+
function saveFile(path, template, view) {
25+
const fileContent = mustache.render(template, view);
26+
const fileName = join(path, `${view.fileName}.ts`);
27+
28+
fs.writeFileSync(fileName, fileContent);
29+
}
30+
31+
module.exports = {
32+
modelFilesGenerator
33+
};
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
const { join } = require("path");
2+
const fs = require("fs");
3+
const fx = require('mkdir-recursive');
4+
const mustache = require("mustache");
5+
6+
function requestBodiesGenerator(path, apiInfo, requestBodies) {
7+
const requestBodiesPath = join(path, "/requestBodies");
8+
fx.mkdirSync(requestBodiesPath);
9+
const template = loadTemplate();
10+
requestBodies.forEach(requestBody => requestBodyGenerator(requestBodiesPath, apiInfo, requestBody, template))
11+
}
12+
13+
function requestBodyGenerator(path, apiInfo, requestBody, template) {
14+
const view = requestBody;
15+
view.apiInfo = apiInfo;
16+
17+
saveFile(path, template, view);
18+
}
19+
20+
function loadTemplate() {
21+
const path = join(__dirname, "./templates/requestBody.mst");
22+
return fs.readFileSync(path, "utf8");
23+
}
24+
25+
function saveFile(path, template, view) {
26+
const fileContent = mustache.render(template, view);
27+
const fileName = join(path, `${view.fileName}.ts`);
28+
29+
fs.writeFileSync(fileName, fileContent);
30+
}
31+
32+
module.exports = {
33+
requestBodiesGenerator
34+
};
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
const { join } = require("path");
2+
const fs = require("fs");
3+
const fx = require('mkdir-recursive');
4+
const mustache = require("mustache");
5+
6+
function serviceFilesGenerator(paths, apiInfo, services) {
7+
fx.mkdirSync(paths.services);
8+
const classTemplate = loadTemplate("service");
9+
const interfaceTemplate = loadTemplate("serviceInterface");
10+
services.forEach(service => serviceFileGenerator(paths, apiInfo, service, classTemplate, interfaceTemplate))
11+
}
12+
13+
function serviceFileGenerator(paths, apiInfo, service, classTemplate, interfaceTemplate) {
14+
const view = service;
15+
view.apiInfo = apiInfo;
16+
view.relativeModelsPath = paths.relativeModels;
17+
view.relativeServiceBasePath = paths.relativeServiceBase;
18+
19+
saveFile(paths, `${view.fileName}.ts`, classTemplate, view);
20+
saveFile(paths, `${view.fileName}.interface.ts`, interfaceTemplate, view);
21+
}
22+
23+
function loadTemplate(name) {
24+
const path = join(__dirname, `./templates/${name}.mst`);
25+
return fs.readFileSync(path, "utf8");
26+
}
27+
28+
function saveFile(paths, fileName, template, view) {
29+
const fileContent = mustache.render(template, view);
30+
fileName = join(paths.services, fileName);
31+
32+
fs.writeFileSync(fileName, fileContent);
33+
}
34+
35+
module.exports = {
36+
serviceFilesGenerator
37+
};

generators/templates/model.mst

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/**
2+
* {{apiInfo.name}} {{apiInfo.version.api}} (OpenAPI: {{apiInfo.version.openApi}})
3+
* {{{apiInfo.description}}}
4+
*
5+
* NOTE: This class is auto generated by instage-client-api-generator.
6+
* Do not edit the file manually.
7+
*/
8+
9+
{{#hasUsedTypes}}
10+
{{#usedTypes}}
11+
import { {{name}} } from "./{{fileName}}";
12+
{{/usedTypes}}
13+
14+
{{/hasUsedTypes}}
15+
{{#description}}
16+
/**
17+
* {{.}}
18+
*/
19+
{{/description}}
20+
export class {{name}}{{#supertype}} extends {{name}}{{/supertype}} {
21+
22+
/**
23+
* Creates a {{name}}.
24+
*
25+
{{#supertype}}
26+
{{#properties}}
27+
* @param {{=<% %>=}}{<%type%>}<%={{ }}=%> {{name}} {{description}}
28+
{{/properties}}
29+
{{/supertype}}
30+
{{#properties}}
31+
* @param {{=<% %>=}}{<%type%>}<%={{ }}=%> {{name}} {{description}}
32+
{{/properties}}
33+
*/
34+
constructor({{#supertype}}{{#properties}}{{name}}: {{type}}{{#typeIsArray}}[]{{/typeIsArray}}, {{/properties}}{{/supertype}}{{#properties}}{{name}}: {{type}}{{#typeIsArray}}[]{{/typeIsArray}}{{^isLast}}, {{/isLast}}{{/properties}}) {
35+
{{#supertype}}
36+
super({{#properties}}{{name}}{{^isLast}}, {{/isLast}}{{/properties}});
37+
{{/supertype}}
38+
{{#properties}}
39+
this.{{name}} = {{name}};
40+
{{/properties}}
41+
}
42+
43+
{{#properties}}
44+
{{#description}}
45+
/**
46+
* {{.}}
47+
*/
48+
{{/description}}
49+
public {{name}}: {{type}}{{#typeIsArray}}[]{{/typeIsArray}};
50+
{{^isLast}}
51+
52+
{{/isLast}}
53+
{{/properties}}
54+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/**
2+
* {{apiInfo.name}} {{apiInfo.version.api}} (OpenAPI: {{apiInfo.version.openApi}})
3+
* {{{apiInfo.description}}}
4+
*
5+
* NOTE: This class is auto generated by instage-client-api-generator.
6+
* Do not edit the file manually.
7+
*/
8+
9+
import { {{type}} } from "../{{typeFileName}}";
10+
11+
export type {{name}} = {{type}}{{#isArray}}[]{{/isArray}};

generators/templates/service.mst

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
/**
2+
* {{apiInfo.name}} {{apiInfo.version.api}} (OpenAPI: {{apiInfo.version.openApi}})
3+
* {{{apiInfo.description}}}
4+
*
5+
* NOTE: This class is auto generated by instage-client-api-generator.
6+
* Do not edit the file manually.
7+
*/
8+
9+
import axios from "axios";
10+
11+
import { ServiceBase } from "{{{relativeServiceBasePath}}}/serviceBase";
12+
import { I{{name}} } from "./{{fileName}}.interface";
13+
14+
{{#usedTypes}}
15+
import { {{name}} } from "{{{relativeModelsPath}}}/{{{fileName}}}";
16+
{{/usedTypes}}
17+
{{#usedRequestBodies}}
18+
import { {{name}} as {{name}}RequestBody } from "{{{relativeModelsPath}}}/requestBodies/{{{fileName}}}";
19+
{{/usedRequestBodies}}
20+
21+
export class {{name}} extends ServiceBase implements I{{name}} {
22+
{{#endpoints}}
23+
/**
24+
{{#description}}
25+
* {{{.}}}
26+
*
27+
{{/description}}
28+
{{#parameters}}
29+
* @param {{=<% %>=}}{<%type%><%#isBody%>RequestBody<%/isBody%>}<%={{ }}=%> {{^required}}[{{/required}}{{name}}{{^required}}]{{/required}} {{{description}}}
30+
{{/parameters}}
31+
*/
32+
public async {{name}}({{#parameters}}{{name}}{{^required}}?{{/required}}: {{type}}{{#isBody}}RequestBody{{/isBody}}{{^isLastParam}}, {{/isLastParam}}{{/parameters}}): Promise<{{returnType}}> {
33+
const config = this.getAxiosConfiguration();
34+
35+
{{#hasQueryParameters}}
36+
const queryList: string[] = [];
37+
{{#queryParameters}}
38+
if ({{name}} !== undefined) {
39+
queryList.push(`{{name}}=${{=<% %>=}}{<%name%>}<%={{ }}=%>`);
40+
}
41+
{{/queryParameters}}
42+
const query = `?${queryList.join("&")}`;
43+
44+
{{/hasQueryParameters}}
45+
const response = await axios.{{#isGet}}get{{/isGet}}{{#isPost}}post{{/isPost}}{{#isPut}}put{{/isPut}}{{#isDelete}}delete{{/isDelete}}<{{returnType}}>(`{{{path}}}{{#hasQueryParameters}}${query}{{/hasQueryParameters}}`,{{#body}} body,{{/body}} config);
46+
{{^returnTypeIsArray}}
47+
48+
{{#subReturnTypes}}
49+
if (response.data.discriminator === "{{name}}") {
50+
const data = response.data as {{name}};
51+
return new {{name}}({{#supertype}}{{#properties}}data.{{name}}, {{/properties}}{{/supertype}}{{#properties}}data.{{name}}{{^isLast}}, {{/isLast}}{{/properties}});
52+
}
53+
{{/subReturnTypes}}
54+
55+
{{/returnTypeIsArray}}
56+
{{#returnTypeIsArray}}
57+
58+
response.data = response.data.map(item => {
59+
{{#subReturnTypes}}
60+
if (item.discriminator === "{{name}}") {
61+
const data = item as {{name}};
62+
return new {{name}}({{#supertype}}{{#properties}}data.{{name}}, {{/properties}}{{/supertype}}{{#properties}}data.{{name}}{{^isLast}}, {{/isLast}}{{/properties}});
63+
}
64+
{{/subReturnTypes}}
65+
return item;
66+
});
67+
68+
{{/returnTypeIsArray}}
69+
return response.data;
70+
}
71+
{{^isLast}}
72+
73+
{{/isLast}}
74+
{{/endpoints}}
75+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/**
2+
* {{apiInfo.name}} {{apiInfo.version.api}} (OpenAPI: {{apiInfo.version.openApi}})
3+
* {{{apiInfo.description}}}
4+
*
5+
* NOTE: This class is auto generated by instage-client-api-generator.
6+
* Do not edit the file manually.
7+
*/
8+
9+
{{#usedTypes}}
10+
import { {{name}} } from "{{{relativeModelsPath}}}/{{{fileName}}}";
11+
{{/usedTypes}}
12+
{{#usedRequestBodies}}
13+
import { {{name}} as {{name}}RequestBody } from "{{{relativeModelsPath}}}/requestBodies/{{{fileName}}}";
14+
{{/usedRequestBodies}}
15+
16+
export interface I{{name}} {
17+
{{#endpoints}}
18+
/**
19+
{{#description}}
20+
* {{{.}}}
21+
*
22+
{{/description}}
23+
{{#parameters}}
24+
* @param {{=<% %>=}}{<%type%><%#isBody%>RequestBody<%/isBody%>}<%={{ }}=%> {{^required}}[{{/required}}{{name}}{{^required}}]{{/required}} {{{description}}}
25+
{{/parameters}}
26+
*/
27+
{{name}}({{#parameters}}{{name}}{{^required}}?{{/required}}: {{type}}{{#isBody}}RequestBody{{/isBody}}{{^isLastParam}}, {{/isLastParam}}{{/parameters}}): Promise<{{returnType}}>
28+
{{^isLast}}
29+
30+
{{/isLast}}
31+
{{/endpoints}}
32+
}

index.js

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
const { createPaths } = require("./pathCreator");
2+
3+
const { configFileLoader } = require("./loaders/configFileLoader");
4+
const { apiInfoLoader } = require("./loaders/apiInfoLoader");
5+
const { modelsLoader } = require("./loaders/modelsLoader");
6+
const { requestBodiesLoader } = require("./loaders/requestBodiesLoader");
7+
const { servicesLoader } = require("./loaders/servicesLoader");
8+
9+
const { modelFilesGenerator } = require("./generators/modelFilesGenerator");
10+
const { requestBodiesGenerator } = require("./generators/requestBodiesGenerator");
11+
const { serviceFilesGenerator } = require("./generators/serviceFilesGenerator");
12+
13+
const args = process.argv.slice(2);
14+
const errorMessage = "Too few arguments. Specify openapi config file with -c <path>, path of service base class location with -cb <path>, path of service generation destination with -s <path>, path of models generation destination with -m <path> and path of server models location with -sm <path>.";
15+
if (!args || !args[1] || !args[3] || !args[5] || !args[7] || !args[9]) {
16+
console.log(errorMessage);
17+
return;
18+
}
19+
20+
async function generate() {
21+
console.log("InStage client api generator");
22+
const paths = createPaths(args[1], args[3], args[5], args[7], args[9]);
23+
24+
console.log("Loading config file...");
25+
const config = await configFileLoader(paths.configFile, paths.serverModels);
26+
console.log("Config file loaded.");
27+
28+
console.log("Loading api info...");
29+
const apiInfo = apiInfoLoader(config);
30+
console.log("Done.");
31+
32+
console.log("Loading models...");
33+
const models = modelsLoader(config);
34+
console.log(`Loaded ${models.length} models.`);
35+
36+
console.log("Generating model files...");
37+
modelFilesGenerator(paths.models, apiInfo, models);
38+
console.log(`Generated ${models.length} model files.`);
39+
40+
console.log("Loading request bodies...");
41+
const requestBodies = requestBodiesLoader(config);
42+
console.log(`Loaded ${requestBodies.length} request bodies.`);
43+
44+
console.log("Generating request body files...");
45+
requestBodiesGenerator(paths.models, apiInfo, requestBodies);
46+
console.log(`Generated ${requestBodies.length} request body files.`);
47+
48+
const services = servicesLoader(config, models, requestBodies);
49+
serviceFilesGenerator(paths, apiInfo, services);
50+
51+
console.log(`Generated ${services.length} services.`);
52+
}
53+
54+
generate();
55+

0 commit comments

Comments
 (0)