gg-express 1.0.110 → 1.0.111
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 +34 -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 +50 -24
- 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,26 @@
|
|
|
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 MyRequestQuery<T extends ConstSchemaType, S extends readonly (keyof TypeResolve<T>)[] = [], P extends boolean = false> = P extends true ? Request<{}, {}, {},
|
|
11
|
-
|
|
10
|
+
type MyRequestQuery<T extends ConstSchemaType, PR extends ParameterType, S extends readonly (keyof TypeResolve<T>)[] = [], P extends boolean = false> = P extends true ? Request<{}, {}, {}, {
|
|
11
|
+
data: Partial<Omit<TypeResolve<T>, S[number]>> & NonNullableObject<Pick<TypeResolve<T>, S[number]>>;
|
|
12
|
+
parameter: TypeResolve<PR>;
|
|
13
|
+
}, {}> : Request<{}, {}, {}, {
|
|
14
|
+
data: Omit<TypeResolve<T>, S[number]> & NonNullableObject<Pick<TypeResolve<T>, S[number]>>;
|
|
15
|
+
parameter: TypeResolve<PR>;
|
|
16
|
+
}, {}>;
|
|
17
|
+
type MyRequestBody<T extends ConstSchemaType, PR extends ParameterType, S extends readonly (keyof TypeResolve<T>)[] = [], P extends boolean = false> = P extends true ? Request<{}, {}, {
|
|
18
|
+
data: Partial<Omit<TypeResolve<T>, S[number]>> & NonNullableObject<Pick<TypeResolve<T>, S[number]>>;
|
|
19
|
+
parameter: TypeResolve<PR>;
|
|
20
|
+
}, {}, {}> : Request<{}, {}, {
|
|
21
|
+
data: Omit<TypeResolve<T>, S[number]> & NonNullableObject<Pick<TypeResolve<T>, S[number]>>;
|
|
22
|
+
parameter: TypeResolve<PR>;
|
|
23
|
+
}, {}, {}>;
|
|
12
24
|
type SuccessResponse<T extends ConstSchemaType> = {
|
|
13
25
|
status: "SUCCESS";
|
|
14
26
|
message: string;
|
|
@@ -19,34 +31,38 @@ type ErrorResponse = {
|
|
|
19
31
|
message: string;
|
|
20
32
|
};
|
|
21
33
|
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> = {
|
|
34
|
+
type RequestParamWrapper<RQ extends ConstSchemaType, PR extends ParameterType, S extends readonly (keyof TypeResolve<RQ>)[] = [], P extends boolean = false> = {
|
|
23
35
|
nonNullableKey?: S;
|
|
24
36
|
isPartial?: P;
|
|
25
37
|
data: RQ;
|
|
38
|
+
parameter?: PR;
|
|
39
|
+
};
|
|
40
|
+
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>;
|
|
41
|
+
export type ParameterType = {
|
|
42
|
+
[key in string]: CustomType;
|
|
26
43
|
};
|
|
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
44
|
export default class GGExpressV2<appName extends string, urlPrefix extends string> {
|
|
29
45
|
express: Express.Express;
|
|
30
46
|
private outputPath;
|
|
31
47
|
appName: string;
|
|
32
48
|
constructor(app: Express.Express, appName: appName, outputPath: string[]);
|
|
33
49
|
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>;
|
|
50
|
+
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: {
|
|
51
|
+
requireParams: RequestParamWrapper<RQ, PR, S, P>;
|
|
36
52
|
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>;
|
|
53
|
+
}, ...middlewares: Array<(req: RequestQueryBodyWrapper<"get", RQ, PR, S, P>, res: MyResponse<RS>, next: NextFunction) => any>): Express.Express;
|
|
54
|
+
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: {
|
|
55
|
+
requireParams: RequestParamWrapper<RQ, PR, S, P>;
|
|
40
56
|
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>;
|
|
57
|
+
}, ...middlewares: Array<(req: RequestQueryBodyWrapper<"post", RQ, PR, S, P>, res: MyResponse<RS>, next: NextFunction) => any>): Express.Express;
|
|
58
|
+
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: {
|
|
59
|
+
requireParams: RequestParamWrapper<RQ, PR, S, P>;
|
|
44
60
|
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>;
|
|
61
|
+
}, ...middlewares: Array<(req: RequestQueryBodyWrapper<"put", RQ, PR, S, P>, res: MyResponse<RS>, next: NextFunction) => any>): Express.Express;
|
|
62
|
+
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: {
|
|
63
|
+
requireParams: RequestParamWrapper<RQ, PR, S, P>;
|
|
48
64
|
responseStructure: RS;
|
|
49
|
-
}, ...middlewares: Array<(req: RequestQueryBodyWrapper<"delete", RQ, S, P>, res: MyResponse<RS>, next: NextFunction) => any>): Express.Express;
|
|
65
|
+
}, ...middlewares: Array<(req: RequestQueryBodyWrapper<"delete", RQ, PR, S, P>, res: MyResponse<RS>, next: NextFunction) => any>): Express.Express;
|
|
50
66
|
generateAPIFiles(): Promise<void>;
|
|
51
67
|
private generateStaticRouteFile;
|
|
52
68
|
}
|
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,19 +15,21 @@ 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
|
}
|
|
29
30
|
type MyRequestQuery<
|
|
30
31
|
T extends ConstSchemaType,
|
|
32
|
+
PR extends ParameterType,
|
|
31
33
|
S extends readonly (keyof TypeResolve<T>)[] = [],
|
|
32
34
|
P extends boolean = false
|
|
33
35
|
> = P extends true
|
|
@@ -35,37 +37,50 @@ type MyRequestQuery<
|
|
|
35
37
|
{},
|
|
36
38
|
{},
|
|
37
39
|
{},
|
|
38
|
-
|
|
39
|
-
|
|
40
|
+
{
|
|
41
|
+
data: Partial<Omit<TypeResolve<T>, S[number]>> &
|
|
42
|
+
NonNullableObject<Pick<TypeResolve<T>, S[number]>>
|
|
43
|
+
parameter: TypeResolve<PR>
|
|
44
|
+
},
|
|
40
45
|
{}
|
|
41
46
|
>
|
|
42
47
|
: Request<
|
|
43
48
|
{},
|
|
44
49
|
{},
|
|
45
50
|
{},
|
|
46
|
-
|
|
47
|
-
|
|
51
|
+
{
|
|
52
|
+
data: Omit<TypeResolve<T>, S[number]> &
|
|
53
|
+
NonNullableObject<Pick<TypeResolve<T>, S[number]>>
|
|
54
|
+
parameter: TypeResolve<PR>
|
|
55
|
+
},
|
|
48
56
|
{}
|
|
49
57
|
>
|
|
50
58
|
|
|
51
59
|
type MyRequestBody<
|
|
52
60
|
T extends ConstSchemaType,
|
|
61
|
+
PR extends ParameterType,
|
|
53
62
|
S extends readonly (keyof TypeResolve<T>)[] = [],
|
|
54
63
|
P extends boolean = false
|
|
55
64
|
> = P extends true
|
|
56
65
|
? Request<
|
|
57
66
|
{},
|
|
58
67
|
{},
|
|
59
|
-
|
|
60
|
-
|
|
68
|
+
{
|
|
69
|
+
data: Partial<Omit<TypeResolve<T>, S[number]>> &
|
|
70
|
+
NonNullableObject<Pick<TypeResolve<T>, S[number]>>
|
|
71
|
+
parameter: TypeResolve<PR>
|
|
72
|
+
},
|
|
61
73
|
{},
|
|
62
74
|
{}
|
|
63
75
|
>
|
|
64
76
|
: Request<
|
|
65
77
|
{},
|
|
66
78
|
{},
|
|
67
|
-
|
|
68
|
-
|
|
79
|
+
{
|
|
80
|
+
data: Omit<TypeResolve<T>, S[number]> &
|
|
81
|
+
NonNullableObject<Pick<TypeResolve<T>, S[number]>>
|
|
82
|
+
parameter: TypeResolve<PR>
|
|
83
|
+
},
|
|
69
84
|
{},
|
|
70
85
|
{}
|
|
71
86
|
>
|
|
@@ -86,23 +101,28 @@ type MyResponse<T extends ConstSchemaType> = Response<
|
|
|
86
101
|
|
|
87
102
|
type RequestParamWrapper<
|
|
88
103
|
RQ extends ConstSchemaType,
|
|
104
|
+
PR extends ParameterType,
|
|
89
105
|
S extends readonly (keyof TypeResolve<RQ>)[] = [],
|
|
90
106
|
P extends boolean = false
|
|
91
107
|
> = {
|
|
92
108
|
nonNullableKey?: S
|
|
93
109
|
isPartial?: P
|
|
94
110
|
data: RQ
|
|
111
|
+
parameter?: PR
|
|
95
112
|
}
|
|
96
113
|
|
|
97
114
|
type RequestQueryBodyWrapper<
|
|
98
115
|
M extends Method,
|
|
99
116
|
RQ extends ConstSchemaType,
|
|
117
|
+
PR extends ParameterType,
|
|
100
118
|
S extends readonly (keyof TypeResolve<RQ>)[] = [],
|
|
101
119
|
P extends boolean = false
|
|
102
|
-
> = MyRequest<M, RQ, S, P>
|
|
120
|
+
> = MyRequest<M, RQ, PR, S, P>
|
|
103
121
|
|
|
104
122
|
const myExpressRouteList: routeList[] = []
|
|
105
|
-
|
|
123
|
+
export type ParameterType = {
|
|
124
|
+
[key in string]: CustomType
|
|
125
|
+
}
|
|
106
126
|
export default class GGExpressV2<
|
|
107
127
|
appName extends string,
|
|
108
128
|
urlPrefix extends string
|
|
@@ -120,18 +140,19 @@ export default class GGExpressV2<
|
|
|
120
140
|
M extends Method,
|
|
121
141
|
RQ extends ConstSchemaType,
|
|
122
142
|
RS extends ConstSchemaType,
|
|
143
|
+
PR extends ParameterType,
|
|
123
144
|
S extends readonly (keyof TypeResolve<RQ>)[] = [],
|
|
124
145
|
P extends boolean = false
|
|
125
146
|
>(
|
|
126
147
|
method: M,
|
|
127
148
|
url: string | string[],
|
|
128
149
|
options: {
|
|
129
|
-
requireParams: RequestParamWrapper<RQ, S, P>
|
|
150
|
+
requireParams: RequestParamWrapper<RQ, PR, S, P>
|
|
130
151
|
responseStructure: RS
|
|
131
152
|
},
|
|
132
153
|
...middlewares: Array<
|
|
133
154
|
(
|
|
134
|
-
req: RequestQueryBodyWrapper<M, RQ, S, P>,
|
|
155
|
+
req: RequestQueryBodyWrapper<M, RQ, PR, S, P>,
|
|
135
156
|
res: MyResponse<RS>,
|
|
136
157
|
next: NextFunction
|
|
137
158
|
) => void | Promise<void>
|
|
@@ -151,6 +172,7 @@ export default class GGExpressV2<
|
|
|
151
172
|
options.requireParams.isPartial === true ? true : false,
|
|
152
173
|
requireParams: options.requireParams.data,
|
|
153
174
|
responseStructure: options.responseStructure,
|
|
175
|
+
parameter: options.requireParams.parameter,
|
|
154
176
|
})
|
|
155
177
|
})
|
|
156
178
|
|
|
@@ -163,7 +185,7 @@ export default class GGExpressV2<
|
|
|
163
185
|
...middlewares.map(
|
|
164
186
|
(mw) => (req: Request, res: Response, next: NextFunction) =>
|
|
165
187
|
mw(
|
|
166
|
-
req as RequestQueryBodyWrapper<M, RQ, S, P>,
|
|
188
|
+
req as RequestQueryBodyWrapper<M, RQ, PR, S, P>,
|
|
167
189
|
res as MyResponse<RS>,
|
|
168
190
|
next
|
|
169
191
|
)
|
|
@@ -173,6 +195,7 @@ export default class GGExpressV2<
|
|
|
173
195
|
get<
|
|
174
196
|
RQ extends ConstSchemaType,
|
|
175
197
|
RS extends ConstSchemaType,
|
|
198
|
+
PR extends ParameterType,
|
|
176
199
|
S extends readonly (keyof TypeResolve<RQ>)[] = [],
|
|
177
200
|
P extends boolean = false
|
|
178
201
|
>(
|
|
@@ -180,12 +203,12 @@ export default class GGExpressV2<
|
|
|
180
203
|
| `${urlPrefix}/${appName}/${string}`
|
|
181
204
|
| `${urlPrefix}/${appName}/${string}`[],
|
|
182
205
|
options: {
|
|
183
|
-
requireParams: RequestParamWrapper<RQ, S, P>
|
|
206
|
+
requireParams: RequestParamWrapper<RQ, PR, S, P>
|
|
184
207
|
responseStructure: RS
|
|
185
208
|
},
|
|
186
209
|
...middlewares: Array<
|
|
187
210
|
(
|
|
188
|
-
req: RequestQueryBodyWrapper<"get", RQ, S, P>,
|
|
211
|
+
req: RequestQueryBodyWrapper<"get", RQ, PR, S, P>,
|
|
189
212
|
res: MyResponse<RS>,
|
|
190
213
|
next: NextFunction
|
|
191
214
|
) => any
|
|
@@ -197,6 +220,7 @@ export default class GGExpressV2<
|
|
|
197
220
|
post<
|
|
198
221
|
RQ extends ConstSchemaType,
|
|
199
222
|
RS extends ConstSchemaType,
|
|
223
|
+
PR extends ParameterType,
|
|
200
224
|
S extends readonly (keyof TypeResolve<RQ>)[] = [],
|
|
201
225
|
P extends boolean = false
|
|
202
226
|
>(
|
|
@@ -204,12 +228,12 @@ export default class GGExpressV2<
|
|
|
204
228
|
| `${urlPrefix}/${appName}/${string}`
|
|
205
229
|
| `${urlPrefix}/${appName}/${string}`[],
|
|
206
230
|
options: {
|
|
207
|
-
requireParams: RequestParamWrapper<RQ, S, P>
|
|
231
|
+
requireParams: RequestParamWrapper<RQ, PR, S, P>
|
|
208
232
|
responseStructure: RS
|
|
209
233
|
},
|
|
210
234
|
...middlewares: Array<
|
|
211
235
|
(
|
|
212
|
-
req: RequestQueryBodyWrapper<"post", RQ, S, P>,
|
|
236
|
+
req: RequestQueryBodyWrapper<"post", RQ, PR, S, P>,
|
|
213
237
|
res: MyResponse<RS>,
|
|
214
238
|
next: NextFunction
|
|
215
239
|
) => any
|
|
@@ -220,6 +244,7 @@ export default class GGExpressV2<
|
|
|
220
244
|
put<
|
|
221
245
|
RQ extends ConstSchemaType,
|
|
222
246
|
RS extends ConstSchemaType,
|
|
247
|
+
PR extends ParameterType,
|
|
223
248
|
S extends readonly (keyof TypeResolve<RQ>)[] = [],
|
|
224
249
|
P extends boolean = false
|
|
225
250
|
>(
|
|
@@ -227,12 +252,12 @@ export default class GGExpressV2<
|
|
|
227
252
|
| `${urlPrefix}/${appName}/${string}`
|
|
228
253
|
| `${urlPrefix}/${appName}/${string}`[],
|
|
229
254
|
options: {
|
|
230
|
-
requireParams: RequestParamWrapper<RQ, S, P>
|
|
255
|
+
requireParams: RequestParamWrapper<RQ, PR, S, P>
|
|
231
256
|
responseStructure: RS
|
|
232
257
|
},
|
|
233
258
|
...middlewares: Array<
|
|
234
259
|
(
|
|
235
|
-
req: RequestQueryBodyWrapper<"put", RQ, S, P>,
|
|
260
|
+
req: RequestQueryBodyWrapper<"put", RQ, PR, S, P>,
|
|
236
261
|
res: MyResponse<RS>,
|
|
237
262
|
next: NextFunction
|
|
238
263
|
) => any
|
|
@@ -243,6 +268,7 @@ export default class GGExpressV2<
|
|
|
243
268
|
delete<
|
|
244
269
|
RQ extends ConstSchemaType,
|
|
245
270
|
RS extends ConstSchemaType,
|
|
271
|
+
PR extends ParameterType,
|
|
246
272
|
S extends readonly (keyof TypeResolve<RQ>)[] = [],
|
|
247
273
|
P extends boolean = false
|
|
248
274
|
>(
|
|
@@ -250,12 +276,12 @@ export default class GGExpressV2<
|
|
|
250
276
|
| `${urlPrefix}/${appName}/${string}`
|
|
251
277
|
| `${urlPrefix}/${appName}/${string}`[],
|
|
252
278
|
options: {
|
|
253
|
-
requireParams: RequestParamWrapper<RQ, S, P>
|
|
279
|
+
requireParams: RequestParamWrapper<RQ, PR, S, P>
|
|
254
280
|
responseStructure: RS
|
|
255
281
|
},
|
|
256
282
|
...middlewares: Array<
|
|
257
283
|
(
|
|
258
|
-
req: RequestQueryBodyWrapper<"delete", RQ, S, P>,
|
|
284
|
+
req: RequestQueryBodyWrapper<"delete", RQ, PR, S, P>,
|
|
259
285
|
res: MyResponse<RS>,
|
|
260
286
|
next: NextFunction
|
|
261
287
|
) => 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>>[]
|