gg-express 1.0.79 → 1.0.83
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.d.ts +3 -0
- package/dist/main.js +10 -0
- package/dist/run.test.js +14 -6
- package/dist/v2/GGExpressV2.d.ts +38 -0
- package/dist/v2/GGExpressV2.js +76 -0
- package/dist/v2/generateGGApi_v2.d.ts +1 -0
- package/dist/v2/generateGGApi_v2.js +81 -0
- package/dist/v2/generateStaticRouteFileV2.d.ts +19 -0
- package/dist/v2/generateStaticRouteFileV2.js +100 -0
- package/dist/v2/output/apiConnector_hotel_v2.d.ts +8 -0
- package/dist/v2/output/apiConnector_hotel_v2.js +59 -0
- package/dist/v2/output/staticRouteInterface_hotel_v2.d.ts +42 -0
- package/dist/v2/output/staticRouteInterface_hotel_v2.js +2 -0
- package/dist/v2/run_v2.test.d.ts +1 -0
- package/dist/v2/run_v2.test.js +78 -0
- package/dist/v2/typeResolver.d.ts +23 -0
- package/dist/v2/typeResolver.js +15 -0
- package/package.json +3 -3
- package/src/main.ts +3 -0
- package/src/run.test.ts +5 -6
- package/src/v2/GGExpressV2.ts +192 -0
- package/src/v2/generateGGApi_v2.ts +79 -0
- package/src/v2/generateStaticRouteFileV2.ts +127 -0
- package/src/v2/output/apiConnector_hotel_v2.ts +68 -0
- package/src/v2/output/staticRouteInterface_hotel_v2.ts +32 -0
- package/src/v2/run_v2.test.ts +74 -0
- package/src/v2/typeResolver.ts +110 -0
package/dist/main.d.ts
ADDED
package/dist/main.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.GGExpressV2 = exports.GGExpress = void 0;
|
|
7
|
+
const GGExpress_1 = __importDefault(require("./GGExpress"));
|
|
8
|
+
exports.GGExpress = GGExpress_1.default;
|
|
9
|
+
const GGExpressV2_1 = __importDefault(require("./v2/GGExpressV2"));
|
|
10
|
+
exports.GGExpressV2 = GGExpressV2_1.default;
|
package/dist/run.test.js
CHANGED
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
2
11
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
12
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
13
|
};
|
|
@@ -82,9 +91,7 @@ function run() {
|
|
|
82
91
|
},
|
|
83
92
|
});
|
|
84
93
|
});
|
|
85
|
-
ggapp.get(["/api/seed/memo/id",
|
|
86
|
-
"/api/hotel/memo/id"
|
|
87
|
-
], {
|
|
94
|
+
ggapp.get(["/api/seed/memo/id", "/api/hotel/memo/id"], {
|
|
88
95
|
requireParams: {
|
|
89
96
|
parameter: { files: "string[]" },
|
|
90
97
|
dataType: "arrayObject",
|
|
@@ -111,8 +118,9 @@ function run() {
|
|
|
111
118
|
},
|
|
112
119
|
});
|
|
113
120
|
});
|
|
114
|
-
app.listen(3002, () => {
|
|
115
|
-
ggapp.generateAPIFiles();
|
|
116
|
-
|
|
121
|
+
app.listen(3002, () => __awaiter(this, void 0, void 0, function* () {
|
|
122
|
+
yield ggapp.generateAPIFiles();
|
|
123
|
+
process.exit();
|
|
124
|
+
}));
|
|
117
125
|
}
|
|
118
126
|
run();
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { NextFunction, Request, Response } from "express";
|
|
2
|
+
import Express from "express-serve-static-core";
|
|
3
|
+
import { convertRoot, InputParent } from "./typeResolver";
|
|
4
|
+
export type Method = "get" | "post" | "put" | "delete";
|
|
5
|
+
type MyRequest<M extends Method, RQ extends InputParent> = M extends "get" ? convertRoot<MyRequestQuery<RQ>> : convertRoot<MyRequestBody<RQ>>;
|
|
6
|
+
type MyRequestQuery<T extends InputParent> = Request<{}, {}, {}, T, {}>;
|
|
7
|
+
type MyRequestBody<T extends InputParent> = Request<{}, {}, T, {}, {}>;
|
|
8
|
+
type MyResponse<T extends InputParent> = Response<{
|
|
9
|
+
status: "SUCCESS" | "ERROR" | "SERVER_ERROR";
|
|
10
|
+
message: string;
|
|
11
|
+
data: convertRoot<T>;
|
|
12
|
+
}>;
|
|
13
|
+
export default class GGExpressV2<appName extends string> {
|
|
14
|
+
express: Express.Express;
|
|
15
|
+
private outputPath;
|
|
16
|
+
appName: string;
|
|
17
|
+
constructor(app: Express.Express, appName: appName, outputPath: string[]);
|
|
18
|
+
private rootMethod;
|
|
19
|
+
get<RQ extends InputParent, RS extends InputParent>(url: `/api/${appName | "seed"}/${string}` | `/api/${appName | "seed"}/${string}`[], options: {
|
|
20
|
+
requireParams: RQ;
|
|
21
|
+
responseStructure: RS;
|
|
22
|
+
}, ...middlewares: Array<(req: MyRequest<"get", RQ>, res: MyResponse<RS>, next: NextFunction) => any>): Express.Express;
|
|
23
|
+
post<RQ extends InputParent, RS extends InputParent>(url: `/api/${appName | "seed"}/${string}` | `/api/${appName | "seed"}/${string}`[], options: {
|
|
24
|
+
requireParams: RQ;
|
|
25
|
+
responseStructure: RS;
|
|
26
|
+
}, ...middlewares: Array<(req: MyRequest<"post", RQ>, res: MyResponse<RS>, next: NextFunction) => any>): Express.Express;
|
|
27
|
+
put<RQ extends InputParent, RS extends InputParent>(url: `/api/${appName | "seed"}/${string}` | `/api/${appName | "seed"}/${string}`[], options: {
|
|
28
|
+
requireParams: RQ;
|
|
29
|
+
responseStructure: RS;
|
|
30
|
+
}, ...middlewares: Array<(req: MyRequest<"put", RQ>, res: MyResponse<RS>, next: NextFunction) => any>): Express.Express;
|
|
31
|
+
delete<RQ extends InputParent, RS extends InputParent>(url: `/api/${appName | "seed"}/${string}` | `/api/${appName | "seed"}/${string}`[], options: {
|
|
32
|
+
requireParams: RQ;
|
|
33
|
+
responseStructure: RS;
|
|
34
|
+
}, ...middlewares: Array<(req: MyRequest<"delete", RQ>, res: MyResponse<RS>, next: NextFunction) => any>): Express.Express;
|
|
35
|
+
generateAPIFiles(): Promise<void>;
|
|
36
|
+
private generateStaticRouteFile;
|
|
37
|
+
}
|
|
38
|
+
export {};
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const fs_1 = __importDefault(require("fs"));
|
|
16
|
+
const generateStaticRouteFileV2_1 = require("./generateStaticRouteFileV2");
|
|
17
|
+
const path_1 = __importDefault(require("path"));
|
|
18
|
+
const generateGGApi_v2_1 = require("./generateGGApi_v2");
|
|
19
|
+
const myExpressRouteList = [];
|
|
20
|
+
class GGExpressV2 {
|
|
21
|
+
constructor(app, appName, outputPath) {
|
|
22
|
+
this.express = app;
|
|
23
|
+
this.outputPath = outputPath;
|
|
24
|
+
this.appName = appName;
|
|
25
|
+
}
|
|
26
|
+
rootMethod(method, url, options, ...middlewares) {
|
|
27
|
+
let tempURL;
|
|
28
|
+
if (Array.isArray(url)) {
|
|
29
|
+
tempURL = url;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
tempURL = [url];
|
|
33
|
+
}
|
|
34
|
+
tempURL.map((url) => {
|
|
35
|
+
myExpressRouteList.push({
|
|
36
|
+
method: method,
|
|
37
|
+
url: url,
|
|
38
|
+
requireParams: options.requireParams,
|
|
39
|
+
responseStructure: Object.assign({}, options.responseStructure),
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
return this.express[method](url,
|
|
43
|
+
// Express handler ต้องกว้าง
|
|
44
|
+
(req, res, next) => next(),
|
|
45
|
+
// แต่ middleware ของคุณจะถูก wrap ทีละตัว
|
|
46
|
+
...middlewares.map((mw) => ((req, res, next) => mw(req, res, next))));
|
|
47
|
+
}
|
|
48
|
+
get(url, options, ...middlewares) {
|
|
49
|
+
return this.rootMethod("get", url, options, ...middlewares);
|
|
50
|
+
}
|
|
51
|
+
post(url, options, ...middlewares) {
|
|
52
|
+
return this.rootMethod("post", url, options, ...middlewares);
|
|
53
|
+
}
|
|
54
|
+
put(url, options, ...middlewares) {
|
|
55
|
+
return this.rootMethod("put", url, options, ...middlewares);
|
|
56
|
+
}
|
|
57
|
+
delete(url, options, ...middlewares) {
|
|
58
|
+
return this.rootMethod("delete", url, options, ...middlewares);
|
|
59
|
+
}
|
|
60
|
+
generateAPIFiles() {
|
|
61
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
62
|
+
yield this.generateStaticRouteFile();
|
|
63
|
+
console.log(`GGExpressV2.ts : ${this.appName} - generate staticRoute done.`);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
generateStaticRouteFile() {
|
|
67
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
68
|
+
const staticRouteCode = (0, generateStaticRouteFileV2_1.generateStaticRouteFileV2)(this.appName, myExpressRouteList);
|
|
69
|
+
for (let row of this.outputPath) {
|
|
70
|
+
fs_1.default.writeFileSync(path_1.default.join(row, `staticRouteInterface_${this.appName}_v2.ts`), staticRouteCode);
|
|
71
|
+
yield (0, generateGGApi_v2_1.generateGGApi_v2)(this.appName, path_1.default.join(row, `apiConnector_${this.appName}_v2.ts`));
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
exports.default = GGExpressV2;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function generateGGApi_v2(appName: string, filePathWithFileName: string): void;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.generateGGApi_v2 = generateGGApi_v2;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
function generateGGApi_v2(appName, filePathWithFileName) {
|
|
9
|
+
const tempInterfaceName = `staticRouteInterface_${appName}_v2`;
|
|
10
|
+
const code = `
|
|
11
|
+
import axios from "axios"
|
|
12
|
+
import { ${tempInterfaceName} } from "./${tempInterfaceName}"
|
|
13
|
+
|
|
14
|
+
export class GGApi_v2 {
|
|
15
|
+
constructor() {}
|
|
16
|
+
|
|
17
|
+
get<T extends keyof ${tempInterfaceName}["get"]>(
|
|
18
|
+
url: T,
|
|
19
|
+
requireParams: ${tempInterfaceName}["get"][T]["requireParams"]
|
|
20
|
+
): Promise<${tempInterfaceName}["get"][T]["responseStructure"]> {
|
|
21
|
+
return new Promise((resolve, reject) => {
|
|
22
|
+
axios
|
|
23
|
+
.get(url as string, { params: requireParams })
|
|
24
|
+
.then((response) => {
|
|
25
|
+
resolve(response.data)
|
|
26
|
+
})
|
|
27
|
+
.catch((error) => {
|
|
28
|
+
reject(error)
|
|
29
|
+
})
|
|
30
|
+
})
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
post<T extends keyof ${tempInterfaceName}["post"]>(
|
|
34
|
+
url: T,
|
|
35
|
+
requireParams: ${tempInterfaceName}["post"][T]["requireParams"]
|
|
36
|
+
): Promise<${tempInterfaceName}["post"][T]["responseStructure"]> {
|
|
37
|
+
return new Promise((resolve, reject) => {
|
|
38
|
+
axios
|
|
39
|
+
.post(url as string, { data: requireParams })
|
|
40
|
+
.then((response) => {
|
|
41
|
+
resolve(response.data)
|
|
42
|
+
})
|
|
43
|
+
.catch((error) => {
|
|
44
|
+
reject(error)
|
|
45
|
+
})
|
|
46
|
+
})
|
|
47
|
+
}
|
|
48
|
+
put<T extends keyof ${tempInterfaceName}["put"]>(
|
|
49
|
+
url: T,
|
|
50
|
+
requireParams: ${tempInterfaceName}["put"][T]["requireParams"]
|
|
51
|
+
): Promise<${tempInterfaceName}["put"][T]["responseStructure"]> {
|
|
52
|
+
return new Promise((resolve, reject) => {
|
|
53
|
+
axios
|
|
54
|
+
.put(url as string, { data: requireParams })
|
|
55
|
+
.then((response) => {
|
|
56
|
+
resolve(response.data)
|
|
57
|
+
})
|
|
58
|
+
.catch((error) => {
|
|
59
|
+
reject(error)
|
|
60
|
+
})
|
|
61
|
+
})
|
|
62
|
+
}
|
|
63
|
+
delete<T extends keyof ${tempInterfaceName}["delete"]>(
|
|
64
|
+
url: T,
|
|
65
|
+
requireParams: ${tempInterfaceName}["delete"][T]["requireParams"]
|
|
66
|
+
): Promise<${tempInterfaceName}["delete"][T]["responseStructure"]> {
|
|
67
|
+
return new Promise((resolve, reject) => {
|
|
68
|
+
axios
|
|
69
|
+
.delete(url as string, { data: { data: requireParams } })
|
|
70
|
+
.then((response) => {
|
|
71
|
+
resolve(response.data)
|
|
72
|
+
})
|
|
73
|
+
.catch((error) => {
|
|
74
|
+
reject(error)
|
|
75
|
+
})
|
|
76
|
+
})
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
`;
|
|
80
|
+
fs_1.default.writeFileSync(filePathWithFileName, code);
|
|
81
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Method } from "./GGExpressV2";
|
|
2
|
+
import { InputParent } from "./typeResolver";
|
|
3
|
+
type routeList = {
|
|
4
|
+
method: Method;
|
|
5
|
+
url: string;
|
|
6
|
+
requireParams: InputParent;
|
|
7
|
+
responseStructure: InputParent;
|
|
8
|
+
};
|
|
9
|
+
type PrepareRouteStucture = {
|
|
10
|
+
[K in Method]: {
|
|
11
|
+
[key in string]: {
|
|
12
|
+
requireParams: string;
|
|
13
|
+
responseStructure: string;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
export declare function prepareExportInterfaceData(data: routeList[]): PrepareRouteStucture;
|
|
18
|
+
export declare function generateStaticRouteFileV2(appName: string, data: routeList[]): string;
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.prepareExportInterfaceData = prepareExportInterfaceData;
|
|
4
|
+
exports.generateStaticRouteFileV2 = generateStaticRouteFileV2;
|
|
5
|
+
function prepareExportInterfaceData(data) {
|
|
6
|
+
let prepareRoute = {
|
|
7
|
+
get: {},
|
|
8
|
+
post: {},
|
|
9
|
+
put: {},
|
|
10
|
+
delete: {},
|
|
11
|
+
};
|
|
12
|
+
prepareRoute = extract(data, prepareRoute);
|
|
13
|
+
return prepareRoute;
|
|
14
|
+
}
|
|
15
|
+
function extract(allData, prepareRoute) {
|
|
16
|
+
for (const route of allData) {
|
|
17
|
+
prepareRoute[route.method][route.url] = {
|
|
18
|
+
requireParams: parentInputToCode(route.requireParams),
|
|
19
|
+
responseStructure: parentInputToCode(route.responseStructure),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
return prepareRoute;
|
|
23
|
+
}
|
|
24
|
+
function parentInputToCode(data) {
|
|
25
|
+
const recursiveExtract = (target, parentKeyName) => {
|
|
26
|
+
let result = "";
|
|
27
|
+
// check nest pimitive -------------------
|
|
28
|
+
if (typeof target === "string") {
|
|
29
|
+
const isUndefinedAble = target.includes("?")
|
|
30
|
+
? "undefined"
|
|
31
|
+
: "";
|
|
32
|
+
const isNullAble = target.includes("~") ? "null" : "";
|
|
33
|
+
const isArray = target.includes("[]") ? "[]" : "";
|
|
34
|
+
const varType = target.replace(/\[\]|\?|\~/g, "");
|
|
35
|
+
let result = [`${varType}`, isUndefinedAble, isNullAble]
|
|
36
|
+
.filter((row) => row !== "")
|
|
37
|
+
.join(" | ");
|
|
38
|
+
if (isArray)
|
|
39
|
+
result = `(${result})[]`;
|
|
40
|
+
else
|
|
41
|
+
result;
|
|
42
|
+
return `${parentKeyName} : ${result}`;
|
|
43
|
+
}
|
|
44
|
+
// check object ---------------------------
|
|
45
|
+
else if (typeof target === "object" && Array.isArray(target) === false) {
|
|
46
|
+
const keyList = Object.keys(target);
|
|
47
|
+
const tempResult = [];
|
|
48
|
+
for (const keyName of keyList) {
|
|
49
|
+
//@ts-ignore
|
|
50
|
+
const recusiveResult = recursiveExtract(target[keyName], keyName);
|
|
51
|
+
tempResult.push(recusiveResult);
|
|
52
|
+
}
|
|
53
|
+
result = `${result} \n ${parentKeyName} : { ${tempResult.join(",")} }`;
|
|
54
|
+
}
|
|
55
|
+
// check array ---------------------------
|
|
56
|
+
else if (Array.isArray(target)) {
|
|
57
|
+
// enum
|
|
58
|
+
if (typeof target[0] === "number" ||
|
|
59
|
+
typeof target[0] === "string" ||
|
|
60
|
+
target[0] === null ||
|
|
61
|
+
target[0] === undefined)
|
|
62
|
+
return `${parentKeyName} : [${target
|
|
63
|
+
.map((word) => ` "${word}" `)
|
|
64
|
+
.join(",")}] `;
|
|
65
|
+
// nest or input nest
|
|
66
|
+
else if (typeof target[0] === "object")
|
|
67
|
+
for (const row of target) {
|
|
68
|
+
result = result + " " + recursiveExtract(row, parentKeyName) + "[] ";
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return `${result}`;
|
|
72
|
+
};
|
|
73
|
+
const result = recursiveExtract(data, "data");
|
|
74
|
+
return `${result} `;
|
|
75
|
+
}
|
|
76
|
+
function generateStaticRouteFileV2(appName, data) {
|
|
77
|
+
const interfaceName = `staticRouteInterface_${appName}_v2`;
|
|
78
|
+
const generateEachUrl = (data) => {
|
|
79
|
+
const keyName = Object.keys(data);
|
|
80
|
+
return keyName
|
|
81
|
+
.map((keyName) => `
|
|
82
|
+
"${keyName}" : {
|
|
83
|
+
requireParams : { ${data[keyName].requireParams} },
|
|
84
|
+
responseStructure : { ${data[keyName].responseStructure},
|
|
85
|
+
status: "SUCCESS" | "ERROR",
|
|
86
|
+
message: string }
|
|
87
|
+
}`)
|
|
88
|
+
.join(", ");
|
|
89
|
+
};
|
|
90
|
+
const preparedData = prepareExportInterfaceData(data);
|
|
91
|
+
let code = `
|
|
92
|
+
export interface ${interfaceName} {
|
|
93
|
+
get : { ${generateEachUrl(preparedData.get)} },
|
|
94
|
+
post : { ${generateEachUrl(preparedData.post)} },
|
|
95
|
+
put : { ${generateEachUrl(preparedData.put)} },
|
|
96
|
+
delete : { ${generateEachUrl(preparedData.delete)} },
|
|
97
|
+
}
|
|
98
|
+
`;
|
|
99
|
+
return code;
|
|
100
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { staticRouteInterface_hotel_v2 } from "./staticRouteInterface_hotel_v2";
|
|
2
|
+
export declare class GGApi_v2 {
|
|
3
|
+
constructor();
|
|
4
|
+
get<T extends keyof staticRouteInterface_hotel_v2["get"]>(url: T, requireParams: staticRouteInterface_hotel_v2["get"][T]["requireParams"]): Promise<staticRouteInterface_hotel_v2["get"][T]["responseStructure"]>;
|
|
5
|
+
post<T extends keyof staticRouteInterface_hotel_v2["post"]>(url: T, requireParams: staticRouteInterface_hotel_v2["post"][T]["requireParams"]): Promise<staticRouteInterface_hotel_v2["post"][T]["responseStructure"]>;
|
|
6
|
+
put<T extends keyof staticRouteInterface_hotel_v2["put"]>(url: T, requireParams: staticRouteInterface_hotel_v2["put"][T]["requireParams"]): Promise<staticRouteInterface_hotel_v2["put"][T]["responseStructure"]>;
|
|
7
|
+
delete<T extends keyof staticRouteInterface_hotel_v2["delete"]>(url: T, requireParams: staticRouteInterface_hotel_v2["delete"][T]["requireParams"]): Promise<staticRouteInterface_hotel_v2["delete"][T]["responseStructure"]>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.GGApi_v2 = void 0;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
class GGApi_v2 {
|
|
9
|
+
constructor() { }
|
|
10
|
+
get(url, requireParams) {
|
|
11
|
+
return new Promise((resolve, reject) => {
|
|
12
|
+
axios_1.default
|
|
13
|
+
.get(url, { params: { data: requireParams } })
|
|
14
|
+
.then((response) => {
|
|
15
|
+
resolve(response.data);
|
|
16
|
+
})
|
|
17
|
+
.catch((error) => {
|
|
18
|
+
reject(error);
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
post(url, requireParams) {
|
|
23
|
+
return new Promise((resolve, reject) => {
|
|
24
|
+
axios_1.default
|
|
25
|
+
.post(url, { data: requireParams })
|
|
26
|
+
.then((response) => {
|
|
27
|
+
resolve(response.data);
|
|
28
|
+
})
|
|
29
|
+
.catch((error) => {
|
|
30
|
+
reject(error);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
put(url, requireParams) {
|
|
35
|
+
return new Promise((resolve, reject) => {
|
|
36
|
+
axios_1.default
|
|
37
|
+
.put(url, { data: requireParams })
|
|
38
|
+
.then((response) => {
|
|
39
|
+
resolve(response.data);
|
|
40
|
+
})
|
|
41
|
+
.catch((error) => {
|
|
42
|
+
reject(error);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
delete(url, requireParams) {
|
|
47
|
+
return new Promise((resolve, reject) => {
|
|
48
|
+
axios_1.default
|
|
49
|
+
.delete(url, { data: { data: requireParams } })
|
|
50
|
+
.then((response) => {
|
|
51
|
+
resolve(response.data);
|
|
52
|
+
})
|
|
53
|
+
.catch((error) => {
|
|
54
|
+
reject(error);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.GGApi_v2 = GGApi_v2;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export interface staticRouteInterface_hotel_v2 {
|
|
2
|
+
get: {
|
|
3
|
+
"/api/hotel/users/id": {
|
|
4
|
+
requireParams: {
|
|
5
|
+
data: {
|
|
6
|
+
id: number;
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
responseStructure: {
|
|
10
|
+
data: {
|
|
11
|
+
userData: {
|
|
12
|
+
id: number;
|
|
13
|
+
name: string;
|
|
14
|
+
}[];
|
|
15
|
+
};
|
|
16
|
+
status: "SUCCESS" | "ERROR";
|
|
17
|
+
message: string;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
post: {
|
|
22
|
+
"/api/hotel/booking/id": {
|
|
23
|
+
requireParams: {
|
|
24
|
+
data: {
|
|
25
|
+
id: number;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
responseStructure: {
|
|
29
|
+
data: {
|
|
30
|
+
bookingData: {
|
|
31
|
+
id: number;
|
|
32
|
+
roomNumber: string;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
status: "SUCCESS" | "ERROR";
|
|
36
|
+
message: string;
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
put: {};
|
|
41
|
+
delete: {};
|
|
42
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const express_1 = __importDefault(require("express"));
|
|
16
|
+
const GGExpressV2_1 = __importDefault(require("./GGExpressV2"));
|
|
17
|
+
const typeResolver_1 = require("./typeResolver");
|
|
18
|
+
const apiConnector_hotel_v2_1 = require("./output/apiConnector_hotel_v2");
|
|
19
|
+
// import { GGApi_v2 } from "./output/apiConnector_hotel_v2"
|
|
20
|
+
function run() {
|
|
21
|
+
const app = (0, express_1.default)();
|
|
22
|
+
const ggapp = new GGExpressV2_1.default(app, "hotel", ["./output"]);
|
|
23
|
+
ggapp.get("/api/hotel/users/id", {
|
|
24
|
+
requireParams: {
|
|
25
|
+
id: "number",
|
|
26
|
+
},
|
|
27
|
+
responseStructure: {
|
|
28
|
+
userData: (0, typeResolver_1.toArray)({
|
|
29
|
+
id: "number",
|
|
30
|
+
name: "string",
|
|
31
|
+
}),
|
|
32
|
+
},
|
|
33
|
+
}, (req, res, next) => {
|
|
34
|
+
console.log(req.query);
|
|
35
|
+
req.query.id;
|
|
36
|
+
return res.json({
|
|
37
|
+
message: "",
|
|
38
|
+
status: "SUCCESS",
|
|
39
|
+
data: { userData: [] },
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
ggapp.post("/api/hotel/booking/id", {
|
|
43
|
+
requireParams: {
|
|
44
|
+
id: "number",
|
|
45
|
+
},
|
|
46
|
+
responseStructure: {
|
|
47
|
+
bookingData: {
|
|
48
|
+
id: "number",
|
|
49
|
+
roomNumber: "string",
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
}, (req, res, next) => {
|
|
53
|
+
return res.json({
|
|
54
|
+
message: "",
|
|
55
|
+
status: "SUCCESS",
|
|
56
|
+
data: {
|
|
57
|
+
bookingData: {
|
|
58
|
+
id: 2,
|
|
59
|
+
roomNumber: "dd",
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
app.listen(3002, () => __awaiter(this, void 0, void 0, function* () {
|
|
65
|
+
yield ggapp.generateAPIFiles();
|
|
66
|
+
console.log("done");
|
|
67
|
+
process.exit(0);
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
run();
|
|
71
|
+
const x = new apiConnector_hotel_v2_1.GGApi_v2();
|
|
72
|
+
x.post("/api/hotel/booking/id", {
|
|
73
|
+
data: { id: 1 },
|
|
74
|
+
}).then((response) => {
|
|
75
|
+
response.status === "ERROR";
|
|
76
|
+
response.data.bookingData;
|
|
77
|
+
response.data.bookingData.roomNumber;
|
|
78
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
type BaseType = "string" | "number" | "string[]" | "number[]";
|
|
2
|
+
export type CustomType = BaseType | `${BaseType}?` | `${BaseType}~` | `${BaseType}?~`;
|
|
3
|
+
export type InputNest = {
|
|
4
|
+
[key in string]: CustomType;
|
|
5
|
+
};
|
|
6
|
+
type InputEnum = string[] | number[];
|
|
7
|
+
export type InputParent = {
|
|
8
|
+
[key in string]: CustomType | InputNest | InputNest[] | InputParent | InputParent[] | InputEnum;
|
|
9
|
+
};
|
|
10
|
+
type ResolveBase<T extends BaseType> = T extends "string" ? string : T extends "string[]" ? string[] : T extends "number" ? number : T extends "number[]" ? number[] : never;
|
|
11
|
+
export declare const toArray: <T extends InputParent>(input: T) => T[];
|
|
12
|
+
type ResolveType<T> = T extends `${infer B}?~` ? ResolveBase<B & BaseType> | null | undefined : T extends `${infer B}?` ? ResolveBase<B & BaseType> | undefined : T extends `${infer B}~` ? ResolveBase<B & BaseType> | null : ResolveBase<T & BaseType>;
|
|
13
|
+
type convertNest<T> = ResolveType<T>;
|
|
14
|
+
type checkEnum<T> = T extends InputEnum ? T[number] : convertNest<T>;
|
|
15
|
+
type convertChildObjet<T> = {
|
|
16
|
+
[K in keyof T]: chooseType<T[K]>;
|
|
17
|
+
};
|
|
18
|
+
type convertObject<T> = T extends object ? convertChildObjet<T> : checkEnum<T>;
|
|
19
|
+
type chooseType<T> = T extends InputEnum ? T[number] : convertObject<T>;
|
|
20
|
+
export type convertRoot<T> = {
|
|
21
|
+
[K in keyof T]: chooseType<T[K]>;
|
|
22
|
+
};
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toArray = void 0;
|
|
4
|
+
const toArray = (input) => {
|
|
5
|
+
return [input];
|
|
6
|
+
};
|
|
7
|
+
exports.toArray = toArray;
|
|
8
|
+
// const data = {} as convertRoot<typeof req2>
|
|
9
|
+
// data.booking.bookingStatus
|
|
10
|
+
// data.status
|
|
11
|
+
// const id = data.booking.id
|
|
12
|
+
// const roomNumber = data.booking.bookingStatus === data.booking.bookingStatus
|
|
13
|
+
// data.rooms.map((row) => row.status === "OFF")
|
|
14
|
+
// data.data.level_1.level_2.id
|
|
15
|
+
// data.booking.createTime
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gg-express",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.83",
|
|
4
4
|
"description": "",
|
|
5
|
-
"main": "dist/
|
|
5
|
+
"main": "dist/main.js",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"build": "tsc && npm version patch --no-git-tag-version",
|
|
8
8
|
"test": "echo \"Error: no test specified\" && exit 1"
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@types/express": "^5.0.0",
|
|
27
|
-
"typescript": "^5.
|
|
27
|
+
"typescript": "^5.9.3"
|
|
28
28
|
},
|
|
29
29
|
"keywords": [
|
|
30
30
|
"express",
|
package/src/main.ts
ADDED
package/src/run.test.ts
CHANGED
|
@@ -88,10 +88,8 @@ function run() {
|
|
|
88
88
|
}
|
|
89
89
|
)
|
|
90
90
|
|
|
91
|
-
|
|
92
|
-
["/api/seed/memo/id",
|
|
93
|
-
"/api/hotel/memo/id"
|
|
94
|
-
],
|
|
91
|
+
ggapp.get(
|
|
92
|
+
["/api/seed/memo/id", "/api/hotel/memo/id"],
|
|
95
93
|
{
|
|
96
94
|
requireParams: {
|
|
97
95
|
parameter: { files: "string[]" },
|
|
@@ -121,8 +119,9 @@ function run() {
|
|
|
121
119
|
})
|
|
122
120
|
}
|
|
123
121
|
)
|
|
124
|
-
app.listen(3002, () => {
|
|
125
|
-
ggapp.generateAPIFiles()
|
|
122
|
+
app.listen(3002, async () => {
|
|
123
|
+
await ggapp.generateAPIFiles()
|
|
124
|
+
process.exit()
|
|
126
125
|
})
|
|
127
126
|
}
|
|
128
127
|
run()
|