@modern-js/bff-core 2.5.0 → 2.5.1-alpha.1
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/cjs/client/generate-client.js +7 -3
- package/dist/cjs/index.js +4 -0
- package/dist/cjs/operators/http.js +7 -1
- package/dist/cjs/router/index.js +53 -27
- package/dist/cjs/utils/meta.js +8 -0
- package/dist/esm/client/generate-client.js +7 -3
- package/dist/esm/index.js +4 -0
- package/dist/esm/operators/http.js +1 -1
- package/dist/esm/router/index.js +54 -28
- package/dist/esm/utils/meta.js +6 -0
- package/dist/js/modern/api.js +69 -0
- package/dist/js/modern/client/generate-client.js +79 -0
- package/dist/js/modern/client/index.js +1 -0
- package/dist/js/modern/client/result.js +22 -0
- package/dist/js/modern/errors/http.js +16 -0
- package/dist/js/modern/index.js +23 -0
- package/dist/js/modern/operators/http.js +210 -0
- package/dist/js/modern/router/constants.js +32 -0
- package/dist/js/modern/router/index.js +236 -0
- package/dist/js/modern/router/types.js +0 -0
- package/dist/js/modern/router/utils.js +83 -0
- package/dist/js/modern/types.js +45 -0
- package/dist/js/modern/utils/alias.js +76 -0
- package/dist/js/modern/utils/debug.js +5 -0
- package/dist/js/modern/utils/index.js +8 -0
- package/dist/js/modern/utils/meta.js +8 -0
- package/dist/js/modern/utils/storage.js +42 -0
- package/dist/js/modern/utils/validate.js +43 -0
- package/dist/js/node/api.js +98 -0
- package/dist/js/node/client/generate-client.js +109 -0
- package/dist/js/node/client/index.js +17 -0
- package/dist/js/node/client/result.js +46 -0
- package/dist/js/node/errors/http.js +40 -0
- package/dist/js/node/index.js +48 -0
- package/dist/js/node/operators/http.js +241 -0
- package/dist/js/node/router/constants.js +61 -0
- package/dist/js/node/router/index.js +256 -0
- package/dist/js/node/router/types.js +15 -0
- package/dist/js/node/router/utils.js +116 -0
- package/dist/js/node/types.js +73 -0
- package/dist/js/node/utils/alias.js +107 -0
- package/dist/js/node/utils/debug.js +28 -0
- package/dist/js/node/utils/index.js +32 -0
- package/dist/js/node/utils/meta.js +32 -0
- package/dist/js/node/utils/storage.js +71 -0
- package/dist/js/node/utils/validate.js +74 -0
- package/dist/types/client/generate-client.d.ts +6 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/router/index.d.ts +5 -1
- package/dist/types/utils/meta.d.ts +3 -1
- package/package.json +8 -7
|
@@ -34,12 +34,14 @@ const DEFAULT_CLIENT_REQUEST_CREATOR = "@modern-js/create-request";
|
|
|
34
34
|
const generateClient = async ({
|
|
35
35
|
resourcePath,
|
|
36
36
|
apiDir,
|
|
37
|
+
lambdaDir,
|
|
37
38
|
prefix,
|
|
38
39
|
port,
|
|
39
40
|
target,
|
|
40
41
|
requestCreator,
|
|
41
42
|
fetcher,
|
|
42
|
-
requireResolve = require.resolve
|
|
43
|
+
requireResolve = require.resolve,
|
|
44
|
+
httpMethodDecider
|
|
43
45
|
}) => {
|
|
44
46
|
if (!requestCreator) {
|
|
45
47
|
requestCreator = requireResolve(
|
|
@@ -58,7 +60,9 @@ const generateClient = async ({
|
|
|
58
60
|
}
|
|
59
61
|
const apiRouter = new import_router.ApiRouter({
|
|
60
62
|
apiDir,
|
|
61
|
-
|
|
63
|
+
lambdaDir,
|
|
64
|
+
prefix,
|
|
65
|
+
httpMethodDecider
|
|
62
66
|
});
|
|
63
67
|
const handlerInfos = apiRouter.getSingleModuleHandlers(resourcePath);
|
|
64
68
|
if (!handlerInfos) {
|
|
@@ -73,7 +77,7 @@ const generateClient = async ({
|
|
|
73
77
|
}
|
|
74
78
|
const upperHttpMethod = httpMethod.toUpperCase();
|
|
75
79
|
const routeName = routePath;
|
|
76
|
-
handlersCode += `export ${exportStatement} createRequest('${routeName}', '${upperHttpMethod}', ${process.env.PORT || String(port)}${fetcher ? `, fetch` : ""});
|
|
80
|
+
handlersCode += `export ${exportStatement} createRequest('${routeName}', '${upperHttpMethod}', '${httpMethodDecider}', ${process.env.PORT || String(port)}${fetcher ? `, fetch` : ""});
|
|
77
81
|
`;
|
|
78
82
|
}
|
|
79
83
|
const importCode = `import { createRequest } from '${requestCreator}';
|
package/dist/cjs/index.js
CHANGED
|
@@ -21,9 +21,11 @@ __export(src_exports, {
|
|
|
21
21
|
Api: () => import_api.Api,
|
|
22
22
|
HANDLER_WITH_META: () => import_utils.HANDLER_WITH_META,
|
|
23
23
|
HttpError: () => import_http.HttpError,
|
|
24
|
+
INPUT_PARAMS_DECIDER: () => import_utils.INPUT_PARAMS_DECIDER,
|
|
24
25
|
ValidationError: () => import_http.ValidationError,
|
|
25
26
|
createStorage: () => import_utils.createStorage,
|
|
26
27
|
getRelativeRuntimePath: () => import_utils.getRelativeRuntimePath,
|
|
28
|
+
isInputParamsDeciderHandler: () => import_utils.isInputParamsDeciderHandler,
|
|
27
29
|
isWithMetaHandler: () => import_utils.isWithMetaHandler,
|
|
28
30
|
registerPaths: () => import_utils.registerPaths
|
|
29
31
|
});
|
|
@@ -40,9 +42,11 @@ var import_utils = require("./utils");
|
|
|
40
42
|
Api,
|
|
41
43
|
HANDLER_WITH_META,
|
|
42
44
|
HttpError,
|
|
45
|
+
INPUT_PARAMS_DECIDER,
|
|
43
46
|
ValidationError,
|
|
44
47
|
createStorage,
|
|
45
48
|
getRelativeRuntimePath,
|
|
49
|
+
isInputParamsDeciderHandler,
|
|
46
50
|
isWithMetaHandler,
|
|
47
51
|
registerPaths
|
|
48
52
|
});
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
1
2
|
var __defProp = Object.defineProperty;
|
|
2
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
4
6
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
7
|
var __export = (target, all) => {
|
|
6
8
|
for (var name in all)
|
|
@@ -14,6 +16,10 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
14
16
|
}
|
|
15
17
|
return to;
|
|
16
18
|
};
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
21
|
+
mod
|
|
22
|
+
));
|
|
17
23
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
24
|
var http_exports = {};
|
|
19
25
|
__export(http_exports, {
|
|
@@ -42,7 +48,7 @@ const validateInput = async (schema, input) => {
|
|
|
42
48
|
try {
|
|
43
49
|
return await schema.parseAsync(input);
|
|
44
50
|
} catch (error) {
|
|
45
|
-
const { z: zod } = require("zod");
|
|
51
|
+
const { z: zod } = await Promise.resolve().then(() => __toESM(require("zod")));
|
|
46
52
|
if (error instanceof zod.ZodError) {
|
|
47
53
|
throw new import_http.ValidationError(400, error.message);
|
|
48
54
|
}
|
package/dist/cjs/router/index.js
CHANGED
|
@@ -40,7 +40,8 @@ class ApiRouter {
|
|
|
40
40
|
constructor({
|
|
41
41
|
apiDir,
|
|
42
42
|
lambdaDir,
|
|
43
|
-
prefix
|
|
43
|
+
prefix,
|
|
44
|
+
httpMethodDecider = "functionName"
|
|
44
45
|
}) {
|
|
45
46
|
this.apiFiles = [];
|
|
46
47
|
this.getExactApiMode = (apiDir) => {
|
|
@@ -66,6 +67,7 @@ class ApiRouter {
|
|
|
66
67
|
this.prefix = this.initPrefix(prefix);
|
|
67
68
|
this.apiDir = apiDir;
|
|
68
69
|
this.apiMode = this.getExactApiMode(apiDir);
|
|
70
|
+
this.httpMethodDecider = httpMethodDecider;
|
|
69
71
|
this.lambdaDir = lambdaDir || this.getExactLambdaDir(this.apiDir);
|
|
70
72
|
this.existLambdaDir = import_utils.fs.existsSync(this.lambdaDir);
|
|
71
73
|
}
|
|
@@ -126,7 +128,14 @@ class ApiRouter {
|
|
|
126
128
|
return trigger.path;
|
|
127
129
|
}
|
|
128
130
|
}
|
|
129
|
-
|
|
131
|
+
let routePath = (0, import_utils3.getPathFromFilename)(this.lambdaDir, filename);
|
|
132
|
+
if (this.httpMethodDecider === "inputParams") {
|
|
133
|
+
if (routePath.endsWith("/")) {
|
|
134
|
+
routePath += `${handler == null ? void 0 : handler.name}`;
|
|
135
|
+
} else {
|
|
136
|
+
routePath += `/${handler == null ? void 0 : handler.name}`;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
130
139
|
return routePath;
|
|
131
140
|
}
|
|
132
141
|
getHttpMethod(originHandlerName, handler) {
|
|
@@ -136,33 +145,44 @@ class ApiRouter {
|
|
|
136
145
|
return trigger.method;
|
|
137
146
|
}
|
|
138
147
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
148
|
+
if (this.httpMethodDecider === "functionName") {
|
|
149
|
+
const upperName = originHandlerName.toUpperCase();
|
|
150
|
+
switch (upperName) {
|
|
151
|
+
case "GET":
|
|
152
|
+
return import_types.HttpMethod.Get;
|
|
153
|
+
case "POST":
|
|
154
|
+
return import_types.HttpMethod.Post;
|
|
155
|
+
case "PUT":
|
|
156
|
+
return import_types.HttpMethod.Put;
|
|
157
|
+
case "DELETE":
|
|
158
|
+
case "DEL":
|
|
159
|
+
return import_types.HttpMethod.Delete;
|
|
160
|
+
case "CONNECT":
|
|
161
|
+
return import_types.HttpMethod.Connect;
|
|
162
|
+
case "TRACE":
|
|
163
|
+
return import_types.HttpMethod.Trace;
|
|
164
|
+
case "PATCH":
|
|
165
|
+
return import_types.HttpMethod.Patch;
|
|
166
|
+
case "OPTION":
|
|
167
|
+
return import_types.HttpMethod.Option;
|
|
168
|
+
case "DEFAULT": {
|
|
169
|
+
return import_types.HttpMethod.Get;
|
|
170
|
+
}
|
|
171
|
+
default:
|
|
172
|
+
if (process.env.NODE_ENV !== "test") {
|
|
173
|
+
import_utils.logger.warn(
|
|
174
|
+
`Only api handlers are allowd to be exported, please remove the function ${originHandlerName} from exports`
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
return null;
|
|
160
178
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
`Only api handlers are allowd to be exported, please remove the function ${originHandlerName} from exports`
|
|
164
|
-
);
|
|
179
|
+
} else {
|
|
180
|
+
if (!handler)
|
|
165
181
|
return null;
|
|
182
|
+
if (typeof handler === "function" && handler.length > 0) {
|
|
183
|
+
return import_types.HttpMethod.Post;
|
|
184
|
+
}
|
|
185
|
+
return import_types.HttpMethod.Get;
|
|
166
186
|
}
|
|
167
187
|
}
|
|
168
188
|
loadApiFiles() {
|
|
@@ -231,8 +251,14 @@ class ApiRouter {
|
|
|
231
251
|
}
|
|
232
252
|
getModuleHandlerInfos(moduleInfo) {
|
|
233
253
|
const { module: module2, filename } = moduleInfo;
|
|
254
|
+
const { httpMethodDecider } = this;
|
|
234
255
|
return Object.entries(module2).filter(([, handler]) => typeof handler === "function").map(([key]) => {
|
|
235
256
|
const handler = module2[key];
|
|
257
|
+
if (httpMethodDecider === "inputParams") {
|
|
258
|
+
Object.assign(handler, {
|
|
259
|
+
[import_utils2.INPUT_PARAMS_DECIDER]: true
|
|
260
|
+
});
|
|
261
|
+
}
|
|
236
262
|
const handlerInfo = this.getHandlerInfo(filename, key, handler);
|
|
237
263
|
return handlerInfo;
|
|
238
264
|
}).filter((handlerInfo) => Boolean(handlerInfo));
|
package/dist/cjs/utils/meta.js
CHANGED
|
@@ -18,15 +18,23 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
18
18
|
var meta_exports = {};
|
|
19
19
|
__export(meta_exports, {
|
|
20
20
|
HANDLER_WITH_META: () => HANDLER_WITH_META,
|
|
21
|
+
INPUT_PARAMS_DECIDER: () => INPUT_PARAMS_DECIDER,
|
|
22
|
+
isInputParamsDeciderHandler: () => isInputParamsDeciderHandler,
|
|
21
23
|
isWithMetaHandler: () => isWithMetaHandler
|
|
22
24
|
});
|
|
23
25
|
module.exports = __toCommonJS(meta_exports);
|
|
24
26
|
const HANDLER_WITH_META = "HANDLER_WITH_META";
|
|
27
|
+
const INPUT_PARAMS_DECIDER = "INPUT_PARAMS_DECIDER";
|
|
25
28
|
const isWithMetaHandler = (handler) => {
|
|
26
29
|
return typeof handler === "function" && handler[HANDLER_WITH_META];
|
|
27
30
|
};
|
|
31
|
+
const isInputParamsDeciderHandler = (handler) => {
|
|
32
|
+
return typeof handler === "function" && handler[INPUT_PARAMS_DECIDER];
|
|
33
|
+
};
|
|
28
34
|
// Annotate the CommonJS export names for ESM import in node:
|
|
29
35
|
0 && (module.exports = {
|
|
30
36
|
HANDLER_WITH_META,
|
|
37
|
+
INPUT_PARAMS_DECIDER,
|
|
38
|
+
isInputParamsDeciderHandler,
|
|
31
39
|
isWithMetaHandler
|
|
32
40
|
});
|
|
@@ -5,12 +5,14 @@ const DEFAULT_CLIENT_REQUEST_CREATOR = "@modern-js/create-request";
|
|
|
5
5
|
const generateClient = async ({
|
|
6
6
|
resourcePath,
|
|
7
7
|
apiDir,
|
|
8
|
+
lambdaDir,
|
|
8
9
|
prefix,
|
|
9
10
|
port,
|
|
10
11
|
target,
|
|
11
12
|
requestCreator,
|
|
12
13
|
fetcher,
|
|
13
|
-
requireResolve = require.resolve
|
|
14
|
+
requireResolve = require.resolve,
|
|
15
|
+
httpMethodDecider
|
|
14
16
|
}) => {
|
|
15
17
|
if (!requestCreator) {
|
|
16
18
|
requestCreator = requireResolve(
|
|
@@ -29,7 +31,9 @@ const generateClient = async ({
|
|
|
29
31
|
}
|
|
30
32
|
const apiRouter = new ApiRouter({
|
|
31
33
|
apiDir,
|
|
32
|
-
|
|
34
|
+
lambdaDir,
|
|
35
|
+
prefix,
|
|
36
|
+
httpMethodDecider
|
|
33
37
|
});
|
|
34
38
|
const handlerInfos = apiRouter.getSingleModuleHandlers(resourcePath);
|
|
35
39
|
if (!handlerInfos) {
|
|
@@ -44,7 +48,7 @@ const generateClient = async ({
|
|
|
44
48
|
}
|
|
45
49
|
const upperHttpMethod = httpMethod.toUpperCase();
|
|
46
50
|
const routeName = routePath;
|
|
47
|
-
handlersCode += `export ${exportStatement} createRequest('${routeName}', '${upperHttpMethod}', ${process.env.PORT || String(port)}${fetcher ? `, fetch` : ""});
|
|
51
|
+
handlersCode += `export ${exportStatement} createRequest('${routeName}', '${upperHttpMethod}', '${httpMethodDecider}', ${process.env.PORT || String(port)}${fetcher ? `, fetch` : ""});
|
|
48
52
|
`;
|
|
49
53
|
}
|
|
50
54
|
const importCode = `import { createRequest } from '${requestCreator}';
|
package/dist/esm/index.js
CHANGED
|
@@ -8,6 +8,8 @@ import {
|
|
|
8
8
|
getRelativeRuntimePath,
|
|
9
9
|
HANDLER_WITH_META,
|
|
10
10
|
isWithMetaHandler,
|
|
11
|
+
INPUT_PARAMS_DECIDER,
|
|
12
|
+
isInputParamsDeciderHandler,
|
|
11
13
|
createStorage,
|
|
12
14
|
registerPaths
|
|
13
15
|
} from "./utils";
|
|
@@ -15,9 +17,11 @@ export {
|
|
|
15
17
|
Api,
|
|
16
18
|
HANDLER_WITH_META,
|
|
17
19
|
HttpError,
|
|
20
|
+
INPUT_PARAMS_DECIDER,
|
|
18
21
|
ValidationError,
|
|
19
22
|
createStorage,
|
|
20
23
|
getRelativeRuntimePath,
|
|
24
|
+
isInputParamsDeciderHandler,
|
|
21
25
|
isWithMetaHandler,
|
|
22
26
|
registerPaths
|
|
23
27
|
};
|
|
@@ -10,7 +10,7 @@ const validateInput = async (schema, input) => {
|
|
|
10
10
|
try {
|
|
11
11
|
return await schema.parseAsync(input);
|
|
12
12
|
} catch (error) {
|
|
13
|
-
const { z: zod } =
|
|
13
|
+
const { z: zod } = await import("zod");
|
|
14
14
|
if (error instanceof zod.ZodError) {
|
|
15
15
|
throw new ValidationError(400, error.message);
|
|
16
16
|
}
|
package/dist/esm/router/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import path from "path";
|
|
|
2
2
|
import { fs, logger } from "@modern-js/utils";
|
|
3
3
|
import "reflect-metadata";
|
|
4
4
|
import { HttpMethod, httpMethods, OperatorType, TriggerType } from "../types";
|
|
5
|
-
import { debug } from "../utils";
|
|
5
|
+
import { debug, INPUT_PARAMS_DECIDER } from "../utils";
|
|
6
6
|
import {
|
|
7
7
|
APIMode,
|
|
8
8
|
FRAMEWORK_MODE_LAMBDA_DIR,
|
|
@@ -21,7 +21,8 @@ class ApiRouter {
|
|
|
21
21
|
constructor({
|
|
22
22
|
apiDir,
|
|
23
23
|
lambdaDir,
|
|
24
|
-
prefix
|
|
24
|
+
prefix,
|
|
25
|
+
httpMethodDecider = "functionName"
|
|
25
26
|
}) {
|
|
26
27
|
this.apiFiles = [];
|
|
27
28
|
this.getExactApiMode = (apiDir) => {
|
|
@@ -47,6 +48,7 @@ class ApiRouter {
|
|
|
47
48
|
this.prefix = this.initPrefix(prefix);
|
|
48
49
|
this.apiDir = apiDir;
|
|
49
50
|
this.apiMode = this.getExactApiMode(apiDir);
|
|
51
|
+
this.httpMethodDecider = httpMethodDecider;
|
|
50
52
|
this.lambdaDir = lambdaDir || this.getExactLambdaDir(this.apiDir);
|
|
51
53
|
this.existLambdaDir = fs.existsSync(this.lambdaDir);
|
|
52
54
|
}
|
|
@@ -107,7 +109,14 @@ class ApiRouter {
|
|
|
107
109
|
return trigger.path;
|
|
108
110
|
}
|
|
109
111
|
}
|
|
110
|
-
|
|
112
|
+
let routePath = getPathFromFilename(this.lambdaDir, filename);
|
|
113
|
+
if (this.httpMethodDecider === "inputParams") {
|
|
114
|
+
if (routePath.endsWith("/")) {
|
|
115
|
+
routePath += `${handler == null ? void 0 : handler.name}`;
|
|
116
|
+
} else {
|
|
117
|
+
routePath += `/${handler == null ? void 0 : handler.name}`;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
111
120
|
return routePath;
|
|
112
121
|
}
|
|
113
122
|
getHttpMethod(originHandlerName, handler) {
|
|
@@ -117,33 +126,44 @@ class ApiRouter {
|
|
|
117
126
|
return trigger.method;
|
|
118
127
|
}
|
|
119
128
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
129
|
+
if (this.httpMethodDecider === "functionName") {
|
|
130
|
+
const upperName = originHandlerName.toUpperCase();
|
|
131
|
+
switch (upperName) {
|
|
132
|
+
case "GET":
|
|
133
|
+
return HttpMethod.Get;
|
|
134
|
+
case "POST":
|
|
135
|
+
return HttpMethod.Post;
|
|
136
|
+
case "PUT":
|
|
137
|
+
return HttpMethod.Put;
|
|
138
|
+
case "DELETE":
|
|
139
|
+
case "DEL":
|
|
140
|
+
return HttpMethod.Delete;
|
|
141
|
+
case "CONNECT":
|
|
142
|
+
return HttpMethod.Connect;
|
|
143
|
+
case "TRACE":
|
|
144
|
+
return HttpMethod.Trace;
|
|
145
|
+
case "PATCH":
|
|
146
|
+
return HttpMethod.Patch;
|
|
147
|
+
case "OPTION":
|
|
148
|
+
return HttpMethod.Option;
|
|
149
|
+
case "DEFAULT": {
|
|
150
|
+
return HttpMethod.Get;
|
|
151
|
+
}
|
|
152
|
+
default:
|
|
153
|
+
if (process.env.NODE_ENV !== "test") {
|
|
154
|
+
logger.warn(
|
|
155
|
+
`Only api handlers are allowd to be exported, please remove the function ${originHandlerName} from exports`
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
return null;
|
|
141
159
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
`Only api handlers are allowd to be exported, please remove the function ${originHandlerName} from exports`
|
|
145
|
-
);
|
|
160
|
+
} else {
|
|
161
|
+
if (!handler)
|
|
146
162
|
return null;
|
|
163
|
+
if (typeof handler === "function" && handler.length > 0) {
|
|
164
|
+
return HttpMethod.Post;
|
|
165
|
+
}
|
|
166
|
+
return HttpMethod.Get;
|
|
147
167
|
}
|
|
148
168
|
}
|
|
149
169
|
loadApiFiles() {
|
|
@@ -212,8 +232,14 @@ class ApiRouter {
|
|
|
212
232
|
}
|
|
213
233
|
getModuleHandlerInfos(moduleInfo) {
|
|
214
234
|
const { module, filename } = moduleInfo;
|
|
235
|
+
const { httpMethodDecider } = this;
|
|
215
236
|
return Object.entries(module).filter(([, handler]) => typeof handler === "function").map(([key]) => {
|
|
216
237
|
const handler = module[key];
|
|
238
|
+
if (httpMethodDecider === "inputParams") {
|
|
239
|
+
Object.assign(handler, {
|
|
240
|
+
[INPUT_PARAMS_DECIDER]: true
|
|
241
|
+
});
|
|
242
|
+
}
|
|
217
243
|
const handlerInfo = this.getHandlerInfo(filename, key, handler);
|
|
218
244
|
return handlerInfo;
|
|
219
245
|
}).filter((handlerInfo) => Boolean(handlerInfo));
|
package/dist/esm/utils/meta.js
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
const HANDLER_WITH_META = "HANDLER_WITH_META";
|
|
2
|
+
const INPUT_PARAMS_DECIDER = "INPUT_PARAMS_DECIDER";
|
|
2
3
|
const isWithMetaHandler = (handler) => {
|
|
3
4
|
return typeof handler === "function" && handler[HANDLER_WITH_META];
|
|
4
5
|
};
|
|
6
|
+
const isInputParamsDeciderHandler = (handler) => {
|
|
7
|
+
return typeof handler === "function" && handler[INPUT_PARAMS_DECIDER];
|
|
8
|
+
};
|
|
5
9
|
export {
|
|
6
10
|
HANDLER_WITH_META,
|
|
11
|
+
INPUT_PARAMS_DECIDER,
|
|
12
|
+
isInputParamsDeciderHandler,
|
|
7
13
|
isWithMetaHandler
|
|
8
14
|
};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
var __async = (__this, __arguments, generator) => {
|
|
2
|
+
return new Promise((resolve, reject) => {
|
|
3
|
+
var fulfilled = (value) => {
|
|
4
|
+
try {
|
|
5
|
+
step(generator.next(value));
|
|
6
|
+
} catch (e) {
|
|
7
|
+
reject(e);
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
var rejected = (value) => {
|
|
11
|
+
try {
|
|
12
|
+
step(generator.throw(value));
|
|
13
|
+
} catch (e) {
|
|
14
|
+
reject(e);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
18
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
import "reflect-metadata";
|
|
22
|
+
import compose from "koa-compose";
|
|
23
|
+
import { validateFunction, HANDLER_WITH_META } from "./utils";
|
|
24
|
+
function Api(...args) {
|
|
25
|
+
const handler = args.pop();
|
|
26
|
+
validateFunction(handler, "Apihandler");
|
|
27
|
+
const operators = args;
|
|
28
|
+
const metadataHelper = {
|
|
29
|
+
getMetadata(key) {
|
|
30
|
+
return Reflect.getMetadata(key, runner);
|
|
31
|
+
},
|
|
32
|
+
setMetadata(key, value) {
|
|
33
|
+
return Reflect.defineMetadata(key, value, runner);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
for (const operator of operators) {
|
|
37
|
+
if (operator.metadata) {
|
|
38
|
+
operator.metadata(metadataHelper);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const validateHandlers = operators.filter((operator) => operator.validate).map((operator) => operator.validate);
|
|
42
|
+
const pipeHandlers = operators.filter((operator) => operator.execute).map((operator) => operator.execute);
|
|
43
|
+
function runner(inputs) {
|
|
44
|
+
return __async(this, null, function* () {
|
|
45
|
+
const executeHelper = {
|
|
46
|
+
result: null,
|
|
47
|
+
get inputs() {
|
|
48
|
+
return inputs;
|
|
49
|
+
},
|
|
50
|
+
set inputs(val) {
|
|
51
|
+
inputs = val;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
const stack = [...validateHandlers, ...pipeHandlers];
|
|
55
|
+
stack.push((helper, next) => __async(this, null, function* () {
|
|
56
|
+
const res = yield handler(helper.inputs);
|
|
57
|
+
helper.result = res;
|
|
58
|
+
return next();
|
|
59
|
+
}));
|
|
60
|
+
yield compose(stack)(executeHelper);
|
|
61
|
+
return executeHelper.result;
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
runner[HANDLER_WITH_META] = true;
|
|
65
|
+
return runner;
|
|
66
|
+
}
|
|
67
|
+
export {
|
|
68
|
+
Api
|
|
69
|
+
};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
var __async = (__this, __arguments, generator) => {
|
|
2
|
+
return new Promise((resolve, reject) => {
|
|
3
|
+
var fulfilled = (value) => {
|
|
4
|
+
try {
|
|
5
|
+
step(generator.next(value));
|
|
6
|
+
} catch (e) {
|
|
7
|
+
reject(e);
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
var rejected = (value) => {
|
|
11
|
+
try {
|
|
12
|
+
step(generator.throw(value));
|
|
13
|
+
} catch (e) {
|
|
14
|
+
reject(e);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
18
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
import * as path from "path";
|
|
22
|
+
import { ApiRouter } from "../router";
|
|
23
|
+
import { Ok, Err } from "./result";
|
|
24
|
+
const DEFAULT_CLIENT_REQUEST_CREATOR = "@modern-js/create-request";
|
|
25
|
+
const generateClient = (_0) => __async(void 0, [_0], function* ({
|
|
26
|
+
resourcePath,
|
|
27
|
+
apiDir,
|
|
28
|
+
prefix,
|
|
29
|
+
port,
|
|
30
|
+
target,
|
|
31
|
+
requestCreator,
|
|
32
|
+
fetcher,
|
|
33
|
+
requireResolve = require.resolve
|
|
34
|
+
}) {
|
|
35
|
+
if (!requestCreator) {
|
|
36
|
+
requestCreator = requireResolve(
|
|
37
|
+
`${DEFAULT_CLIENT_REQUEST_CREATOR}${target ? `/${target}` : ""}`
|
|
38
|
+
).replace(/\\/g, "/");
|
|
39
|
+
} else {
|
|
40
|
+
let resolvedPath = requestCreator;
|
|
41
|
+
try {
|
|
42
|
+
resolvedPath = path.dirname(requireResolve(requestCreator));
|
|
43
|
+
} catch (error) {
|
|
44
|
+
}
|
|
45
|
+
requestCreator = `${resolvedPath}${target ? `/${target}` : ""}`.replace(
|
|
46
|
+
/\\/g,
|
|
47
|
+
"/"
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
const apiRouter = new ApiRouter({
|
|
51
|
+
apiDir,
|
|
52
|
+
prefix
|
|
53
|
+
});
|
|
54
|
+
const handlerInfos = apiRouter.getSingleModuleHandlers(resourcePath);
|
|
55
|
+
if (!handlerInfos) {
|
|
56
|
+
return Err(`generate client error: Cannot require module ${resourcePath}`);
|
|
57
|
+
}
|
|
58
|
+
let handlersCode = "";
|
|
59
|
+
for (const handlerInfo of handlerInfos) {
|
|
60
|
+
const { name, httpMethod, routePath } = handlerInfo;
|
|
61
|
+
let exportStatement = `const ${name} =`;
|
|
62
|
+
if (name.toLowerCase() === "default") {
|
|
63
|
+
exportStatement = "default";
|
|
64
|
+
}
|
|
65
|
+
const upperHttpMethod = httpMethod.toUpperCase();
|
|
66
|
+
const routeName = routePath;
|
|
67
|
+
handlersCode += `export ${exportStatement} createRequest('${routeName}', '${upperHttpMethod}', ${process.env.PORT || String(port)}${fetcher ? `, fetch` : ""});
|
|
68
|
+
`;
|
|
69
|
+
}
|
|
70
|
+
const importCode = `import { createRequest } from '${requestCreator}';
|
|
71
|
+
${fetcher ? `import { fetch } from '${fetcher}';
|
|
72
|
+
` : ""}`;
|
|
73
|
+
return Ok(`${importCode}
|
|
74
|
+
${handlersCode}`);
|
|
75
|
+
});
|
|
76
|
+
export {
|
|
77
|
+
DEFAULT_CLIENT_REQUEST_CREATOR,
|
|
78
|
+
generateClient
|
|
79
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./generate-client";
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
const Err = (value) => {
|
|
2
|
+
const err = {
|
|
3
|
+
kind: "Err",
|
|
4
|
+
value,
|
|
5
|
+
isErr: true,
|
|
6
|
+
isOk: false
|
|
7
|
+
};
|
|
8
|
+
return err;
|
|
9
|
+
};
|
|
10
|
+
const Ok = (value) => {
|
|
11
|
+
const ok = {
|
|
12
|
+
kind: "Ok",
|
|
13
|
+
value,
|
|
14
|
+
isErr: false,
|
|
15
|
+
isOk: true
|
|
16
|
+
};
|
|
17
|
+
return ok;
|
|
18
|
+
};
|
|
19
|
+
export {
|
|
20
|
+
Err,
|
|
21
|
+
Ok
|
|
22
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
class HttpError extends Error {
|
|
2
|
+
constructor(status, message) {
|
|
3
|
+
super(message);
|
|
4
|
+
this.status = status;
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
class ValidationError extends HttpError {
|
|
8
|
+
constructor(status, message) {
|
|
9
|
+
super(status, message);
|
|
10
|
+
this.code = "VALIDATION_ERROR";
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export {
|
|
14
|
+
HttpError,
|
|
15
|
+
ValidationError
|
|
16
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Api } from "./api";
|
|
2
|
+
import { HttpError, ValidationError } from "./errors/http";
|
|
3
|
+
export * from "./router";
|
|
4
|
+
export * from "./types";
|
|
5
|
+
export * from "./client";
|
|
6
|
+
export * from "./operators/http";
|
|
7
|
+
import {
|
|
8
|
+
getRelativeRuntimePath,
|
|
9
|
+
HANDLER_WITH_META,
|
|
10
|
+
isWithMetaHandler,
|
|
11
|
+
createStorage,
|
|
12
|
+
registerPaths
|
|
13
|
+
} from "./utils";
|
|
14
|
+
export {
|
|
15
|
+
Api,
|
|
16
|
+
HANDLER_WITH_META,
|
|
17
|
+
HttpError,
|
|
18
|
+
ValidationError,
|
|
19
|
+
createStorage,
|
|
20
|
+
getRelativeRuntimePath,
|
|
21
|
+
isWithMetaHandler,
|
|
22
|
+
registerPaths
|
|
23
|
+
};
|