gg-express 1.0.110 → 1.0.112
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/v2/GGExpressV2.d.ts +29 -18
- package/dist/v2/GGExpressV2.js +1 -0
- package/dist/v2/generateStaticRouteFileV2.d.ts +3 -1
- package/dist/v2/generateStaticRouteFileV2.js +4 -1
- package/dist/v2/output/staticRouteInterface_hotel_v2.d.ts +31 -23
- package/dist/v2/run_v2.test.js +6 -32
- package/dist/v2/typeResolver.d.ts +4 -4
- package/package.json +1 -1
- package/src/v2/GGExpressV2.ts +51 -48
- package/src/v2/generateStaticRouteFileV2.ts +8 -3
- package/src/v2/output/staticRouteInterface_hotel_v2.ts +28 -23
- package/src/v2/run_v2.test.ts +6 -32
- package/src/v2/typeResolver.ts +8 -4
package/dist/v2/GGExpressV2.d.ts
CHANGED
|
@@ -1,14 +1,21 @@
|
|
|
1
1
|
import { NextFunction } from "express";
|
|
2
2
|
import { Request, Response } from "express-serve-static-core";
|
|
3
3
|
import Express from "express-serve-static-core";
|
|
4
|
-
import { TypeResolve, ConstSchemaType } from "./typeResolver";
|
|
4
|
+
import { TypeResolve, ConstSchemaType, CustomType } from "./typeResolver";
|
|
5
5
|
export type Method = "get" | "post" | "put" | "delete";
|
|
6
|
-
type MyRequest<M extends Method, RQ extends ConstSchemaType, S extends readonly (keyof TypeResolve<RQ>)[] = [], P extends boolean = false> = M extends "get" ? MyRequestQuery<RQ, S, P> : MyRequestBody<RQ, S, P>;
|
|
6
|
+
type MyRequest<M extends Method, RQ extends ConstSchemaType, PR extends ParameterType, S extends readonly (keyof TypeResolve<RQ>)[] = [], P extends boolean = false> = M extends "get" ? MyRequestQuery<RQ, PR, S, P> : MyRequestBody<RQ, PR, S, P>;
|
|
7
7
|
type NonNullableObject<T> = {
|
|
8
8
|
[K in keyof T]-?: NonNullable<T[K]>;
|
|
9
9
|
};
|
|
10
|
-
type
|
|
11
|
-
|
|
10
|
+
type ResolvePartial<T extends ConstSchemaType, PR extends ParameterType, S extends readonly (keyof TypeResolve<T>)[] = [], P extends boolean = false> = P extends true ? {
|
|
11
|
+
data: Partial<Omit<TypeResolve<T>, S[number]>> & NonNullableObject<Pick<TypeResolve<T>, S[number]>>;
|
|
12
|
+
parameter: TypeResolve<PR>;
|
|
13
|
+
} : {
|
|
14
|
+
data: Omit<TypeResolve<T>, S[number]> & NonNullableObject<Pick<TypeResolve<T>, S[number]>>;
|
|
15
|
+
parameter: TypeResolve<PR>;
|
|
16
|
+
};
|
|
17
|
+
type MyRequestQuery<T extends ConstSchemaType, PR extends ParameterType, S extends readonly (keyof TypeResolve<T>)[] = [], P extends boolean = false> = P extends true ? Request<{}, {}, {}, ResolvePartial<T, PR, S, P>, {}> : Request<{}, {}, {}, ResolvePartial<T, PR, S, P>, {}>;
|
|
18
|
+
type MyRequestBody<T extends ConstSchemaType, PR extends ParameterType, S extends readonly (keyof TypeResolve<T>)[] = [], P extends boolean = false> = P extends true ? Request<{}, {}, ResolvePartial<T, PR, S, P>, {}, {}> : Request<{}, {}, ResolvePartial<T, PR, S, P>, {}, {}>;
|
|
12
19
|
type SuccessResponse<T extends ConstSchemaType> = {
|
|
13
20
|
status: "SUCCESS";
|
|
14
21
|
message: string;
|
|
@@ -19,34 +26,38 @@ type ErrorResponse = {
|
|
|
19
26
|
message: string;
|
|
20
27
|
};
|
|
21
28
|
type MyResponse<T extends ConstSchemaType> = Response<SuccessResponse<T> | ErrorResponse>;
|
|
22
|
-
type RequestParamWrapper<RQ extends ConstSchemaType, S extends readonly (keyof TypeResolve<RQ>)[] = [], P extends boolean = false> = {
|
|
29
|
+
type RequestParamWrapper<RQ extends ConstSchemaType, PR extends ParameterType, S extends readonly (keyof TypeResolve<RQ>)[] = [], P extends boolean = false> = {
|
|
23
30
|
nonNullableKey?: S;
|
|
24
31
|
isPartial?: P;
|
|
25
32
|
data: RQ;
|
|
33
|
+
parameter?: PR;
|
|
34
|
+
};
|
|
35
|
+
type RequestQueryBodyWrapper<M extends Method, RQ extends ConstSchemaType, PR extends ParameterType, S extends readonly (keyof TypeResolve<RQ>)[] = [], P extends boolean = false> = MyRequest<M, RQ, PR, S, P>;
|
|
36
|
+
export type ParameterType = {
|
|
37
|
+
[key in string]: CustomType;
|
|
26
38
|
};
|
|
27
|
-
type RequestQueryBodyWrapper<M extends Method, RQ extends ConstSchemaType, S extends readonly (keyof TypeResolve<RQ>)[] = [], P extends boolean = false> = MyRequest<M, RQ, S, P>;
|
|
28
39
|
export default class GGExpressV2<appName extends string, urlPrefix extends string> {
|
|
29
40
|
express: Express.Express;
|
|
30
41
|
private outputPath;
|
|
31
42
|
appName: string;
|
|
32
43
|
constructor(app: Express.Express, appName: appName, outputPath: string[]);
|
|
33
44
|
private rootMethod;
|
|
34
|
-
get<RQ extends ConstSchemaType, RS extends ConstSchemaType, S extends readonly (keyof TypeResolve<RQ>)[] = [], P extends boolean = false>(url: `${urlPrefix}/${appName}/${string}` | `${urlPrefix}/${appName}/${string}`[], options: {
|
|
35
|
-
requireParams: RequestParamWrapper<RQ, S, P>;
|
|
45
|
+
get<RQ extends ConstSchemaType, RS extends ConstSchemaType, PR extends ParameterType, S extends readonly (keyof TypeResolve<RQ>)[] = [], P extends boolean = false>(url: `${urlPrefix}/${appName}/${string}` | `${urlPrefix}/${appName}/${string}`[], options: {
|
|
46
|
+
requireParams: RequestParamWrapper<RQ, PR, S, P>;
|
|
36
47
|
responseStructure: RS;
|
|
37
|
-
}, ...middlewares: Array<(req: RequestQueryBodyWrapper<"get", RQ, S, P>, res: MyResponse<RS>, next: NextFunction) => any>): Express.Express;
|
|
38
|
-
post<RQ extends ConstSchemaType, RS extends ConstSchemaType, S extends readonly (keyof TypeResolve<RQ>)[] = [], P extends boolean = false>(url: `${urlPrefix}/${appName}/${string}` | `${urlPrefix}/${appName}/${string}`[], options: {
|
|
39
|
-
requireParams: RequestParamWrapper<RQ, S, P>;
|
|
48
|
+
}, ...middlewares: Array<(req: RequestQueryBodyWrapper<"get", RQ, PR, S, P>, res: MyResponse<RS>, next: NextFunction) => any>): Express.Express;
|
|
49
|
+
post<RQ extends ConstSchemaType, RS extends ConstSchemaType, PR extends ParameterType, S extends readonly (keyof TypeResolve<RQ>)[] = [], P extends boolean = false>(url: `${urlPrefix}/${appName}/${string}` | `${urlPrefix}/${appName}/${string}`[], options: {
|
|
50
|
+
requireParams: RequestParamWrapper<RQ, PR, S, P>;
|
|
40
51
|
responseStructure: RS;
|
|
41
|
-
}, ...middlewares: Array<(req: RequestQueryBodyWrapper<"post", RQ, S, P>, res: MyResponse<RS>, next: NextFunction) => any>): Express.Express;
|
|
42
|
-
put<RQ extends ConstSchemaType, RS extends ConstSchemaType, S extends readonly (keyof TypeResolve<RQ>)[] = [], P extends boolean = false>(url: `${urlPrefix}/${appName}/${string}` | `${urlPrefix}/${appName}/${string}`[], options: {
|
|
43
|
-
requireParams: RequestParamWrapper<RQ, S, P>;
|
|
52
|
+
}, ...middlewares: Array<(req: RequestQueryBodyWrapper<"post", RQ, PR, S, P>, res: MyResponse<RS>, next: NextFunction) => any>): Express.Express;
|
|
53
|
+
put<RQ extends ConstSchemaType, RS extends ConstSchemaType, PR extends ParameterType, S extends readonly (keyof TypeResolve<RQ>)[] = [], P extends boolean = false>(url: `${urlPrefix}/${appName}/${string}` | `${urlPrefix}/${appName}/${string}`[], options: {
|
|
54
|
+
requireParams: RequestParamWrapper<RQ, PR, S, P>;
|
|
44
55
|
responseStructure: RS;
|
|
45
|
-
}, ...middlewares: Array<(req: RequestQueryBodyWrapper<"put", RQ, S, P>, res: MyResponse<RS>, next: NextFunction) => any>): Express.Express;
|
|
46
|
-
delete<RQ extends ConstSchemaType, RS extends ConstSchemaType, S extends readonly (keyof TypeResolve<RQ>)[] = [], P extends boolean = false>(url: `${urlPrefix}/${appName}/${string}` | `${urlPrefix}/${appName}/${string}`[], options: {
|
|
47
|
-
requireParams: RequestParamWrapper<RQ, S, P>;
|
|
56
|
+
}, ...middlewares: Array<(req: RequestQueryBodyWrapper<"put", RQ, PR, S, P>, res: MyResponse<RS>, next: NextFunction) => any>): Express.Express;
|
|
57
|
+
delete<RQ extends ConstSchemaType, RS extends ConstSchemaType, PR extends ParameterType, S extends readonly (keyof TypeResolve<RQ>)[] = [], P extends boolean = false>(url: `${urlPrefix}/${appName}/${string}` | `${urlPrefix}/${appName}/${string}`[], options: {
|
|
58
|
+
requireParams: RequestParamWrapper<RQ, PR, S, P>;
|
|
48
59
|
responseStructure: RS;
|
|
49
|
-
}, ...middlewares: Array<(req: RequestQueryBodyWrapper<"delete", RQ, S, P>, res: MyResponse<RS>, next: NextFunction) => any>): Express.Express;
|
|
60
|
+
}, ...middlewares: Array<(req: RequestQueryBodyWrapper<"delete", RQ, PR, S, P>, res: MyResponse<RS>, next: NextFunction) => any>): Express.Express;
|
|
50
61
|
generateAPIFiles(): Promise<void>;
|
|
51
62
|
private generateStaticRouteFile;
|
|
52
63
|
}
|
package/dist/v2/GGExpressV2.js
CHANGED
|
@@ -38,6 +38,7 @@ class GGExpressV2 {
|
|
|
38
38
|
isPartialRequireParam: options.requireParams.isPartial === true ? true : false,
|
|
39
39
|
requireParams: options.requireParams.data,
|
|
40
40
|
responseStructure: options.responseStructure,
|
|
41
|
+
parameter: options.requireParams.parameter,
|
|
41
42
|
});
|
|
42
43
|
});
|
|
43
44
|
return this.express[method](url,
|
|
@@ -1,16 +1,18 @@
|
|
|
1
|
-
import { Method } from "./GGExpressV2";
|
|
1
|
+
import { Method, ParameterType } from "./GGExpressV2";
|
|
2
2
|
import { ConstSchemaType } from "./typeResolver";
|
|
3
3
|
export type routeList = {
|
|
4
4
|
method: Method;
|
|
5
5
|
url: string;
|
|
6
6
|
isPartialRequireParam: boolean;
|
|
7
7
|
requireParams: ConstSchemaType;
|
|
8
|
+
parameter?: ParameterType;
|
|
8
9
|
responseStructure: ConstSchemaType;
|
|
9
10
|
};
|
|
10
11
|
type PrepareRouteStructure = {
|
|
11
12
|
[K in Method]: {
|
|
12
13
|
[key in string]: {
|
|
13
14
|
requireParams: string;
|
|
15
|
+
parameter: string;
|
|
14
16
|
responseStructure: string;
|
|
15
17
|
isPartial: boolean;
|
|
16
18
|
};
|
|
@@ -16,6 +16,9 @@ function extract(allData, prepareRoute) {
|
|
|
16
16
|
for (const route of allData) {
|
|
17
17
|
prepareRoute[route.method][route.url] = {
|
|
18
18
|
requireParams: parentInputToCode(route.requireParams, route.isPartialRequireParam),
|
|
19
|
+
parameter: route.parameter
|
|
20
|
+
? parentInputToCode({ data: route.parameter }, false)
|
|
21
|
+
: "never",
|
|
19
22
|
responseStructure: parentInputToCode(route.responseStructure, false),
|
|
20
23
|
isPartial: route.isPartialRequireParam,
|
|
21
24
|
};
|
|
@@ -99,7 +102,7 @@ function generateStaticRouteFileV2(appName, data) {
|
|
|
99
102
|
return keyName
|
|
100
103
|
.map((keyName) => `
|
|
101
104
|
"${keyName}" : {
|
|
102
|
-
requireParams : ${data[keyName].requireParams} ,
|
|
105
|
+
requireParams : { data: ${data[keyName].requireParams}, parameter : ${data[keyName].parameter} },
|
|
103
106
|
responseStructure : {
|
|
104
107
|
data : ${data[keyName].responseStructure},
|
|
105
108
|
status: "SUCCESS" | "ERROR",
|
|
@@ -1,27 +1,35 @@
|
|
|
1
1
|
export interface staticRouteInterface_hotel_v2 {
|
|
2
2
|
get: {
|
|
3
|
-
"/api/hotel/users/id": {
|
|
3
|
+
"/api/v2/hotel/users/id": {
|
|
4
4
|
requireParams: {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
5
|
+
data: {
|
|
6
|
+
id: number;
|
|
7
|
+
bookingGroupID: number;
|
|
8
|
+
checkInDate: string;
|
|
9
|
+
checkOutDate: string;
|
|
10
|
+
checkInTime: string;
|
|
11
|
+
checkOutTime: string;
|
|
12
|
+
roomRate: number;
|
|
13
|
+
extraBedRate: number;
|
|
14
|
+
roomNumber?: string | undefined | null;
|
|
15
|
+
editTime: string;
|
|
16
|
+
createTime: string;
|
|
17
|
+
shiftDate: string;
|
|
18
|
+
shiftName: string | null;
|
|
19
|
+
userName: string;
|
|
20
|
+
bookingStatus: "ACTIVE" | "CLOSE" | "CANCEL" | "NO_SHOW";
|
|
21
|
+
is_specificRoom: number;
|
|
22
|
+
guestCount: number;
|
|
23
|
+
reasonToCancel: string;
|
|
24
|
+
note?: string | undefined | null;
|
|
25
|
+
};
|
|
26
|
+
parameter: {
|
|
27
|
+
data: {
|
|
28
|
+
xx: boolean;
|
|
29
|
+
data: string[];
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
};
|
|
25
33
|
responseStructure: {
|
|
26
34
|
data: {
|
|
27
35
|
id: number;
|
|
@@ -36,13 +44,13 @@ export interface staticRouteInterface_hotel_v2 {
|
|
|
36
44
|
editTime: string;
|
|
37
45
|
createTime: string;
|
|
38
46
|
shiftDate: string;
|
|
39
|
-
shiftName: string;
|
|
47
|
+
shiftName: string | null;
|
|
40
48
|
userName: string;
|
|
41
49
|
bookingStatus: "ACTIVE" | "CLOSE" | "CANCEL" | "NO_SHOW";
|
|
42
50
|
is_specificRoom: number;
|
|
43
51
|
guestCount: number;
|
|
44
52
|
reasonToCancel: string;
|
|
45
|
-
note
|
|
53
|
+
note?: string | undefined | null;
|
|
46
54
|
}[];
|
|
47
55
|
status: "SUCCESS" | "ERROR";
|
|
48
56
|
message: string;
|
package/dist/v2/run_v2.test.js
CHANGED
|
@@ -45,48 +45,22 @@ function run() {
|
|
|
45
45
|
requireParams: {
|
|
46
46
|
data: exports.hotel_model_const_temp.booking,
|
|
47
47
|
nonNullableKey: ["id", "note"],
|
|
48
|
+
parameter: {
|
|
49
|
+
xx: "boolean",
|
|
50
|
+
data: "string[]",
|
|
51
|
+
},
|
|
48
52
|
// isPartial: true,
|
|
49
53
|
},
|
|
50
54
|
responseStructure: [exports.hotel_model_const_temp.booking],
|
|
51
55
|
}, (req, res, next) => {
|
|
52
|
-
req.query;
|
|
56
|
+
req.query.parameter.xx;
|
|
57
|
+
req.query.data;
|
|
53
58
|
return res.json({
|
|
54
59
|
message: "",
|
|
55
60
|
status: "SUCCESS",
|
|
56
61
|
data: [],
|
|
57
62
|
});
|
|
58
63
|
});
|
|
59
|
-
// ggapp.post(
|
|
60
|
-
// "/api/hotel/booking/id",
|
|
61
|
-
// {
|
|
62
|
-
// requireParams: {
|
|
63
|
-
// isPartial: true,
|
|
64
|
-
// data: {
|
|
65
|
-
// id: "number",
|
|
66
|
-
// id2: "number",
|
|
67
|
-
// name: "string",
|
|
68
|
-
// },
|
|
69
|
-
// },
|
|
70
|
-
// responseStructure: {
|
|
71
|
-
// bookingData: {
|
|
72
|
-
// id: "number",
|
|
73
|
-
// roomNumber: "string",
|
|
74
|
-
// },
|
|
75
|
-
// },
|
|
76
|
-
// },
|
|
77
|
-
// (req, res, next) => {
|
|
78
|
-
// return res.json({
|
|
79
|
-
// message: "",
|
|
80
|
-
// status: "SUCCESS",
|
|
81
|
-
// data: {
|
|
82
|
-
// bookingData: {
|
|
83
|
-
// id: 2,
|
|
84
|
-
// roomNumber: "dd",
|
|
85
|
-
// },
|
|
86
|
-
// },
|
|
87
|
-
// })
|
|
88
|
-
// }
|
|
89
|
-
// )
|
|
90
64
|
app.listen(3002, () => __awaiter(this, void 0, void 0, function* () {
|
|
91
65
|
yield ggapp.generateAPIFiles();
|
|
92
66
|
console.log("done");
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
type Unarray<T> = T extends (infer U)[] ? U : T;
|
|
2
2
|
type BaseType = "string" | "number" | "boolean" | "string[]" | "number[]" | "boolean[]";
|
|
3
|
-
type CustomType = BaseType | `${BaseType}?` | `${BaseType}~` | `${BaseType}?~`;
|
|
4
|
-
type
|
|
3
|
+
export type CustomType = BaseType | `${BaseType}?` | `${BaseType}~` | `${BaseType}?~`;
|
|
4
|
+
export type InputEnumType = readonly string[] | readonly number[];
|
|
5
5
|
export type ConstSchemaType = {
|
|
6
|
-
[key in string]: CustomType | ConstSchemaType | ConstSchemaType[] |
|
|
6
|
+
[key in string]: CustomType | ConstSchemaType | ConstSchemaType[] | InputEnumType;
|
|
7
7
|
} | ConstSchemaType[];
|
|
8
8
|
type ResolveBase<T extends BaseType> = T extends "string" ? string : T extends "string[]" ? string[] : T extends "number" ? number : T extends "number[]" ? number[] : T extends "boolean" ? boolean : T extends "boolean[]" ? boolean[] : never;
|
|
9
9
|
export declare const toArray: <T>(input: T) => T[];
|
|
10
10
|
type ResolveExtraType<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>;
|
|
11
|
-
type chooseType<T> = T extends
|
|
11
|
+
type chooseType<T> = T extends InputEnumType ? T[number] : T extends any[] ? chooseType<Unarray<T>>[] : T extends object ? TypeResolve<T> : ResolveExtraType<T>;
|
|
12
12
|
export type TypeResolve<T> = {
|
|
13
13
|
[K in keyof T]: chooseType<T[K]>;
|
|
14
14
|
};
|
package/package.json
CHANGED
package/src/v2/GGExpressV2.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { NextFunction } from "express"
|
|
|
2
2
|
import { Request, Response } from "express-serve-static-core"
|
|
3
3
|
import Express from "express-serve-static-core"
|
|
4
4
|
import fs from "fs"
|
|
5
|
-
import { TypeResolve, ConstSchemaType } from "./typeResolver"
|
|
5
|
+
import { TypeResolve, ConstSchemaType, CustomType } from "./typeResolver"
|
|
6
6
|
import {
|
|
7
7
|
generateStaticRouteFileV2,
|
|
8
8
|
routeList,
|
|
@@ -15,60 +15,52 @@ export type Method = "get" | "post" | "put" | "delete"
|
|
|
15
15
|
type MyRequest<
|
|
16
16
|
M extends Method,
|
|
17
17
|
RQ extends ConstSchemaType,
|
|
18
|
+
PR extends ParameterType,
|
|
18
19
|
S extends readonly (keyof TypeResolve<RQ>)[] = [],
|
|
19
20
|
P extends boolean = false
|
|
20
21
|
> = M extends "get"
|
|
21
22
|
? // get
|
|
22
|
-
MyRequestQuery<RQ, S, P>
|
|
23
|
+
MyRequestQuery<RQ, PR, S, P>
|
|
23
24
|
: // post, put, delete
|
|
24
|
-
MyRequestBody<RQ, S, P>
|
|
25
|
+
MyRequestBody<RQ, PR, S, P>
|
|
25
26
|
|
|
26
27
|
type NonNullableObject<T> = {
|
|
27
28
|
[K in keyof T]-?: NonNullable<T[K]>
|
|
28
29
|
}
|
|
30
|
+
type ResolvePartial<
|
|
31
|
+
T extends ConstSchemaType,
|
|
32
|
+
PR extends ParameterType,
|
|
33
|
+
S extends readonly (keyof TypeResolve<T>)[] = [],
|
|
34
|
+
P extends boolean = false
|
|
35
|
+
> = P extends true
|
|
36
|
+
? {
|
|
37
|
+
data: Partial<Omit<TypeResolve<T>, S[number]>> &
|
|
38
|
+
NonNullableObject<Pick<TypeResolve<T>, S[number]>>
|
|
39
|
+
parameter: TypeResolve<PR>
|
|
40
|
+
}
|
|
41
|
+
: {
|
|
42
|
+
data: Omit<TypeResolve<T>, S[number]> &
|
|
43
|
+
NonNullableObject<Pick<TypeResolve<T>, S[number]>>
|
|
44
|
+
parameter: TypeResolve<PR>
|
|
45
|
+
}
|
|
46
|
+
|
|
29
47
|
type MyRequestQuery<
|
|
30
48
|
T extends ConstSchemaType,
|
|
49
|
+
PR extends ParameterType,
|
|
31
50
|
S extends readonly (keyof TypeResolve<T>)[] = [],
|
|
32
51
|
P extends boolean = false
|
|
33
52
|
> = P extends true
|
|
34
|
-
? Request<
|
|
35
|
-
|
|
36
|
-
{},
|
|
37
|
-
{},
|
|
38
|
-
Partial<Omit<TypeResolve<T>, S[number]>> &
|
|
39
|
-
NonNullableObject<Pick<TypeResolve<T>, S[number]>>,
|
|
40
|
-
{}
|
|
41
|
-
>
|
|
42
|
-
: Request<
|
|
43
|
-
{},
|
|
44
|
-
{},
|
|
45
|
-
{},
|
|
46
|
-
Omit<TypeResolve<T>, S[number]> &
|
|
47
|
-
NonNullableObject<Pick<TypeResolve<T>, S[number]>>,
|
|
48
|
-
{}
|
|
49
|
-
>
|
|
53
|
+
? Request<{}, {}, {}, ResolvePartial<T, PR, S, P>, {}>
|
|
54
|
+
: Request<{}, {}, {}, ResolvePartial<T, PR, S, P>, {}>
|
|
50
55
|
|
|
51
56
|
type MyRequestBody<
|
|
52
57
|
T extends ConstSchemaType,
|
|
58
|
+
PR extends ParameterType,
|
|
53
59
|
S extends readonly (keyof TypeResolve<T>)[] = [],
|
|
54
60
|
P extends boolean = false
|
|
55
61
|
> = P extends true
|
|
56
|
-
? Request<
|
|
57
|
-
|
|
58
|
-
{},
|
|
59
|
-
Partial<Omit<TypeResolve<T>, S[number]>> &
|
|
60
|
-
NonNullableObject<Pick<TypeResolve<T>, S[number]>>,
|
|
61
|
-
{},
|
|
62
|
-
{}
|
|
63
|
-
>
|
|
64
|
-
: Request<
|
|
65
|
-
{},
|
|
66
|
-
{},
|
|
67
|
-
Omit<TypeResolve<T>, S[number]> &
|
|
68
|
-
NonNullableObject<Pick<TypeResolve<T>, S[number]>>,
|
|
69
|
-
{},
|
|
70
|
-
{}
|
|
71
|
-
>
|
|
62
|
+
? Request<{}, {}, ResolvePartial<T, PR, S, P>, {}, {}>
|
|
63
|
+
: Request<{}, {}, ResolvePartial<T, PR, S, P>, {}, {}>
|
|
72
64
|
|
|
73
65
|
type SuccessResponse<T extends ConstSchemaType> = {
|
|
74
66
|
status: "SUCCESS"
|
|
@@ -86,23 +78,28 @@ type MyResponse<T extends ConstSchemaType> = Response<
|
|
|
86
78
|
|
|
87
79
|
type RequestParamWrapper<
|
|
88
80
|
RQ extends ConstSchemaType,
|
|
81
|
+
PR extends ParameterType,
|
|
89
82
|
S extends readonly (keyof TypeResolve<RQ>)[] = [],
|
|
90
83
|
P extends boolean = false
|
|
91
84
|
> = {
|
|
92
85
|
nonNullableKey?: S
|
|
93
86
|
isPartial?: P
|
|
94
87
|
data: RQ
|
|
88
|
+
parameter?: PR
|
|
95
89
|
}
|
|
96
90
|
|
|
97
91
|
type RequestQueryBodyWrapper<
|
|
98
92
|
M extends Method,
|
|
99
93
|
RQ extends ConstSchemaType,
|
|
94
|
+
PR extends ParameterType,
|
|
100
95
|
S extends readonly (keyof TypeResolve<RQ>)[] = [],
|
|
101
96
|
P extends boolean = false
|
|
102
|
-
> = MyRequest<M, RQ, S, P>
|
|
97
|
+
> = MyRequest<M, RQ, PR, S, P>
|
|
103
98
|
|
|
104
99
|
const myExpressRouteList: routeList[] = []
|
|
105
|
-
|
|
100
|
+
export type ParameterType = {
|
|
101
|
+
[key in string]: CustomType
|
|
102
|
+
}
|
|
106
103
|
export default class GGExpressV2<
|
|
107
104
|
appName extends string,
|
|
108
105
|
urlPrefix extends string
|
|
@@ -120,18 +117,19 @@ export default class GGExpressV2<
|
|
|
120
117
|
M extends Method,
|
|
121
118
|
RQ extends ConstSchemaType,
|
|
122
119
|
RS extends ConstSchemaType,
|
|
120
|
+
PR extends ParameterType,
|
|
123
121
|
S extends readonly (keyof TypeResolve<RQ>)[] = [],
|
|
124
122
|
P extends boolean = false
|
|
125
123
|
>(
|
|
126
124
|
method: M,
|
|
127
125
|
url: string | string[],
|
|
128
126
|
options: {
|
|
129
|
-
requireParams: RequestParamWrapper<RQ, S, P>
|
|
127
|
+
requireParams: RequestParamWrapper<RQ, PR, S, P>
|
|
130
128
|
responseStructure: RS
|
|
131
129
|
},
|
|
132
130
|
...middlewares: Array<
|
|
133
131
|
(
|
|
134
|
-
req: RequestQueryBodyWrapper<M, RQ, S, P>,
|
|
132
|
+
req: RequestQueryBodyWrapper<M, RQ, PR, S, P>,
|
|
135
133
|
res: MyResponse<RS>,
|
|
136
134
|
next: NextFunction
|
|
137
135
|
) => void | Promise<void>
|
|
@@ -151,6 +149,7 @@ export default class GGExpressV2<
|
|
|
151
149
|
options.requireParams.isPartial === true ? true : false,
|
|
152
150
|
requireParams: options.requireParams.data,
|
|
153
151
|
responseStructure: options.responseStructure,
|
|
152
|
+
parameter: options.requireParams.parameter,
|
|
154
153
|
})
|
|
155
154
|
})
|
|
156
155
|
|
|
@@ -163,7 +162,7 @@ export default class GGExpressV2<
|
|
|
163
162
|
...middlewares.map(
|
|
164
163
|
(mw) => (req: Request, res: Response, next: NextFunction) =>
|
|
165
164
|
mw(
|
|
166
|
-
req as RequestQueryBodyWrapper<M, RQ, S, P>,
|
|
165
|
+
req as RequestQueryBodyWrapper<M, RQ, PR, S, P>,
|
|
167
166
|
res as MyResponse<RS>,
|
|
168
167
|
next
|
|
169
168
|
)
|
|
@@ -173,6 +172,7 @@ export default class GGExpressV2<
|
|
|
173
172
|
get<
|
|
174
173
|
RQ extends ConstSchemaType,
|
|
175
174
|
RS extends ConstSchemaType,
|
|
175
|
+
PR extends ParameterType,
|
|
176
176
|
S extends readonly (keyof TypeResolve<RQ>)[] = [],
|
|
177
177
|
P extends boolean = false
|
|
178
178
|
>(
|
|
@@ -180,12 +180,12 @@ export default class GGExpressV2<
|
|
|
180
180
|
| `${urlPrefix}/${appName}/${string}`
|
|
181
181
|
| `${urlPrefix}/${appName}/${string}`[],
|
|
182
182
|
options: {
|
|
183
|
-
requireParams: RequestParamWrapper<RQ, S, P>
|
|
183
|
+
requireParams: RequestParamWrapper<RQ, PR, S, P>
|
|
184
184
|
responseStructure: RS
|
|
185
185
|
},
|
|
186
186
|
...middlewares: Array<
|
|
187
187
|
(
|
|
188
|
-
req: RequestQueryBodyWrapper<"get", RQ, S, P>,
|
|
188
|
+
req: RequestQueryBodyWrapper<"get", RQ, PR, S, P>,
|
|
189
189
|
res: MyResponse<RS>,
|
|
190
190
|
next: NextFunction
|
|
191
191
|
) => any
|
|
@@ -197,6 +197,7 @@ export default class GGExpressV2<
|
|
|
197
197
|
post<
|
|
198
198
|
RQ extends ConstSchemaType,
|
|
199
199
|
RS extends ConstSchemaType,
|
|
200
|
+
PR extends ParameterType,
|
|
200
201
|
S extends readonly (keyof TypeResolve<RQ>)[] = [],
|
|
201
202
|
P extends boolean = false
|
|
202
203
|
>(
|
|
@@ -204,12 +205,12 @@ export default class GGExpressV2<
|
|
|
204
205
|
| `${urlPrefix}/${appName}/${string}`
|
|
205
206
|
| `${urlPrefix}/${appName}/${string}`[],
|
|
206
207
|
options: {
|
|
207
|
-
requireParams: RequestParamWrapper<RQ, S, P>
|
|
208
|
+
requireParams: RequestParamWrapper<RQ, PR, S, P>
|
|
208
209
|
responseStructure: RS
|
|
209
210
|
},
|
|
210
211
|
...middlewares: Array<
|
|
211
212
|
(
|
|
212
|
-
req: RequestQueryBodyWrapper<"post", RQ, S, P>,
|
|
213
|
+
req: RequestQueryBodyWrapper<"post", RQ, PR, S, P>,
|
|
213
214
|
res: MyResponse<RS>,
|
|
214
215
|
next: NextFunction
|
|
215
216
|
) => any
|
|
@@ -220,6 +221,7 @@ export default class GGExpressV2<
|
|
|
220
221
|
put<
|
|
221
222
|
RQ extends ConstSchemaType,
|
|
222
223
|
RS extends ConstSchemaType,
|
|
224
|
+
PR extends ParameterType,
|
|
223
225
|
S extends readonly (keyof TypeResolve<RQ>)[] = [],
|
|
224
226
|
P extends boolean = false
|
|
225
227
|
>(
|
|
@@ -227,12 +229,12 @@ export default class GGExpressV2<
|
|
|
227
229
|
| `${urlPrefix}/${appName}/${string}`
|
|
228
230
|
| `${urlPrefix}/${appName}/${string}`[],
|
|
229
231
|
options: {
|
|
230
|
-
requireParams: RequestParamWrapper<RQ, S, P>
|
|
232
|
+
requireParams: RequestParamWrapper<RQ, PR, S, P>
|
|
231
233
|
responseStructure: RS
|
|
232
234
|
},
|
|
233
235
|
...middlewares: Array<
|
|
234
236
|
(
|
|
235
|
-
req: RequestQueryBodyWrapper<"put", RQ, S, P>,
|
|
237
|
+
req: RequestQueryBodyWrapper<"put", RQ, PR, S, P>,
|
|
236
238
|
res: MyResponse<RS>,
|
|
237
239
|
next: NextFunction
|
|
238
240
|
) => any
|
|
@@ -243,6 +245,7 @@ export default class GGExpressV2<
|
|
|
243
245
|
delete<
|
|
244
246
|
RQ extends ConstSchemaType,
|
|
245
247
|
RS extends ConstSchemaType,
|
|
248
|
+
PR extends ParameterType,
|
|
246
249
|
S extends readonly (keyof TypeResolve<RQ>)[] = [],
|
|
247
250
|
P extends boolean = false
|
|
248
251
|
>(
|
|
@@ -250,12 +253,12 @@ export default class GGExpressV2<
|
|
|
250
253
|
| `${urlPrefix}/${appName}/${string}`
|
|
251
254
|
| `${urlPrefix}/${appName}/${string}`[],
|
|
252
255
|
options: {
|
|
253
|
-
requireParams: RequestParamWrapper<RQ, S, P>
|
|
256
|
+
requireParams: RequestParamWrapper<RQ, PR, S, P>
|
|
254
257
|
responseStructure: RS
|
|
255
258
|
},
|
|
256
259
|
...middlewares: Array<
|
|
257
260
|
(
|
|
258
|
-
req: RequestQueryBodyWrapper<"delete", RQ, S, P>,
|
|
261
|
+
req: RequestQueryBodyWrapper<"delete", RQ, PR, S, P>,
|
|
259
262
|
res: MyResponse<RS>,
|
|
260
263
|
next: NextFunction
|
|
261
264
|
) => any
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { Method } from "./GGExpressV2"
|
|
2
|
-
import { ConstSchemaType } from "./typeResolver"
|
|
1
|
+
import { Method, ParameterType } from "./GGExpressV2"
|
|
2
|
+
import { ConstSchemaType, CustomType } from "./typeResolver"
|
|
3
3
|
export type routeList = {
|
|
4
4
|
method: Method
|
|
5
5
|
url: string
|
|
6
6
|
isPartialRequireParam: boolean
|
|
7
7
|
requireParams: ConstSchemaType
|
|
8
|
+
parameter?: ParameterType
|
|
8
9
|
responseStructure: ConstSchemaType
|
|
9
10
|
}
|
|
10
11
|
|
|
@@ -12,6 +13,7 @@ type PrepareRouteStructure = {
|
|
|
12
13
|
[K in Method]: {
|
|
13
14
|
[key in string]: {
|
|
14
15
|
requireParams: string
|
|
16
|
+
parameter: string
|
|
15
17
|
responseStructure: string
|
|
16
18
|
isPartial: boolean
|
|
17
19
|
}
|
|
@@ -38,6 +40,9 @@ function extract(
|
|
|
38
40
|
route.requireParams,
|
|
39
41
|
route.isPartialRequireParam
|
|
40
42
|
),
|
|
43
|
+
parameter: route.parameter
|
|
44
|
+
? parentInputToCode({ data: route.parameter }, false)
|
|
45
|
+
: "never",
|
|
41
46
|
responseStructure: parentInputToCode(route.responseStructure, false),
|
|
42
47
|
isPartial: route.isPartialRequireParam,
|
|
43
48
|
}
|
|
@@ -126,7 +131,7 @@ export function generateStaticRouteFileV2(appName: string, data: routeList[]) {
|
|
|
126
131
|
.map(
|
|
127
132
|
(keyName) => `
|
|
128
133
|
"${keyName}" : {
|
|
129
|
-
requireParams : ${data[keyName].requireParams} ,
|
|
134
|
+
requireParams : { data: ${data[keyName].requireParams}, parameter : ${data[keyName].parameter} },
|
|
130
135
|
responseStructure : {
|
|
131
136
|
data : ${data[keyName].responseStructure},
|
|
132
137
|
status: "SUCCESS" | "ERROR",
|
|
@@ -1,27 +1,32 @@
|
|
|
1
1
|
export interface staticRouteInterface_hotel_v2 {
|
|
2
2
|
get: {
|
|
3
|
-
"/api/hotel/users/id": {
|
|
3
|
+
"/api/v2/hotel/users/id": {
|
|
4
4
|
requireParams: {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
5
|
+
data: {
|
|
6
|
+
id: number
|
|
7
|
+
bookingGroupID: number
|
|
8
|
+
checkInDate: string
|
|
9
|
+
checkOutDate: string
|
|
10
|
+
checkInTime: string
|
|
11
|
+
checkOutTime: string
|
|
12
|
+
roomRate: number
|
|
13
|
+
extraBedRate: number
|
|
14
|
+
roomNumber?: string | undefined | null
|
|
15
|
+
editTime: string
|
|
16
|
+
createTime: string
|
|
17
|
+
shiftDate: string
|
|
18
|
+
shiftName: string | null
|
|
19
|
+
userName: string
|
|
20
|
+
bookingStatus: "ACTIVE" | "CLOSE" | "CANCEL" | "NO_SHOW"
|
|
21
|
+
is_specificRoom: number
|
|
22
|
+
guestCount: number
|
|
23
|
+
reasonToCancel: string
|
|
24
|
+
note?: string | undefined | null
|
|
25
|
+
}
|
|
26
|
+
parameter: {
|
|
27
|
+
data: { xx: boolean; data: string[] }
|
|
28
|
+
}
|
|
29
|
+
}
|
|
25
30
|
responseStructure: {
|
|
26
31
|
data: {
|
|
27
32
|
id: number
|
|
@@ -36,13 +41,13 @@ export interface staticRouteInterface_hotel_v2 {
|
|
|
36
41
|
editTime: string
|
|
37
42
|
createTime: string
|
|
38
43
|
shiftDate: string
|
|
39
|
-
shiftName: string
|
|
44
|
+
shiftName: string | null
|
|
40
45
|
userName: string
|
|
41
46
|
bookingStatus: "ACTIVE" | "CLOSE" | "CANCEL" | "NO_SHOW"
|
|
42
47
|
is_specificRoom: number
|
|
43
48
|
guestCount: number
|
|
44
49
|
reasonToCancel: string
|
|
45
|
-
note
|
|
50
|
+
note?: string | undefined | null
|
|
46
51
|
}[]
|
|
47
52
|
status: "SUCCESS" | "ERROR"
|
|
48
53
|
message: string
|
package/src/v2/run_v2.test.ts
CHANGED
|
@@ -36,12 +36,17 @@ function run() {
|
|
|
36
36
|
requireParams: {
|
|
37
37
|
data: hotel_model_const_temp.booking,
|
|
38
38
|
nonNullableKey: ["id", "note"],
|
|
39
|
+
parameter: {
|
|
40
|
+
xx: "boolean",
|
|
41
|
+
data: "string[]",
|
|
42
|
+
},
|
|
39
43
|
// isPartial: true,
|
|
40
44
|
},
|
|
41
45
|
responseStructure: [hotel_model_const_temp.booking],
|
|
42
46
|
},
|
|
43
47
|
(req, res, next) => {
|
|
44
|
-
req.query
|
|
48
|
+
req.query.parameter.xx
|
|
49
|
+
req.query.data
|
|
45
50
|
return res.json({
|
|
46
51
|
message: "",
|
|
47
52
|
status: "SUCCESS",
|
|
@@ -49,37 +54,6 @@ function run() {
|
|
|
49
54
|
})
|
|
50
55
|
}
|
|
51
56
|
)
|
|
52
|
-
// ggapp.post(
|
|
53
|
-
// "/api/hotel/booking/id",
|
|
54
|
-
// {
|
|
55
|
-
// requireParams: {
|
|
56
|
-
// isPartial: true,
|
|
57
|
-
// data: {
|
|
58
|
-
// id: "number",
|
|
59
|
-
// id2: "number",
|
|
60
|
-
// name: "string",
|
|
61
|
-
// },
|
|
62
|
-
// },
|
|
63
|
-
// responseStructure: {
|
|
64
|
-
// bookingData: {
|
|
65
|
-
// id: "number",
|
|
66
|
-
// roomNumber: "string",
|
|
67
|
-
// },
|
|
68
|
-
// },
|
|
69
|
-
// },
|
|
70
|
-
// (req, res, next) => {
|
|
71
|
-
// return res.json({
|
|
72
|
-
// message: "",
|
|
73
|
-
// status: "SUCCESS",
|
|
74
|
-
// data: {
|
|
75
|
-
// bookingData: {
|
|
76
|
-
// id: 2,
|
|
77
|
-
// roomNumber: "dd",
|
|
78
|
-
// },
|
|
79
|
-
// },
|
|
80
|
-
// })
|
|
81
|
-
// }
|
|
82
|
-
// )
|
|
83
57
|
|
|
84
58
|
app.listen(3002, async () => {
|
|
85
59
|
await ggapp.generateAPIFiles()
|
package/src/v2/typeResolver.ts
CHANGED
|
@@ -8,8 +8,12 @@ type BaseType =
|
|
|
8
8
|
| "number[]"
|
|
9
9
|
| "boolean[]"
|
|
10
10
|
|
|
11
|
-
type CustomType =
|
|
12
|
-
|
|
11
|
+
export type CustomType =
|
|
12
|
+
| BaseType
|
|
13
|
+
| `${BaseType}?`
|
|
14
|
+
| `${BaseType}~`
|
|
15
|
+
| `${BaseType}?~`
|
|
16
|
+
export type InputEnumType = readonly string[] | readonly number[]
|
|
13
17
|
|
|
14
18
|
export type ConstSchemaType =
|
|
15
19
|
| {
|
|
@@ -17,7 +21,7 @@ export type ConstSchemaType =
|
|
|
17
21
|
| CustomType
|
|
18
22
|
| ConstSchemaType
|
|
19
23
|
| ConstSchemaType[]
|
|
20
|
-
|
|
|
24
|
+
| InputEnumType
|
|
21
25
|
}
|
|
22
26
|
| ConstSchemaType[]
|
|
23
27
|
|
|
@@ -52,7 +56,7 @@ type ResolveExtraType<T> =
|
|
|
52
56
|
: // plain primitive
|
|
53
57
|
ResolveBase<T & BaseType>
|
|
54
58
|
|
|
55
|
-
type chooseType<T> = T extends
|
|
59
|
+
type chooseType<T> = T extends InputEnumType
|
|
56
60
|
? T[number]
|
|
57
61
|
: T extends any[]
|
|
58
62
|
? chooseType<Unarray<T>>[]
|