@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.
Files changed (51) hide show
  1. package/dist/cjs/client/generate-client.js +7 -3
  2. package/dist/cjs/index.js +4 -0
  3. package/dist/cjs/operators/http.js +7 -1
  4. package/dist/cjs/router/index.js +53 -27
  5. package/dist/cjs/utils/meta.js +8 -0
  6. package/dist/esm/client/generate-client.js +7 -3
  7. package/dist/esm/index.js +4 -0
  8. package/dist/esm/operators/http.js +1 -1
  9. package/dist/esm/router/index.js +54 -28
  10. package/dist/esm/utils/meta.js +6 -0
  11. package/dist/js/modern/api.js +69 -0
  12. package/dist/js/modern/client/generate-client.js +79 -0
  13. package/dist/js/modern/client/index.js +1 -0
  14. package/dist/js/modern/client/result.js +22 -0
  15. package/dist/js/modern/errors/http.js +16 -0
  16. package/dist/js/modern/index.js +23 -0
  17. package/dist/js/modern/operators/http.js +210 -0
  18. package/dist/js/modern/router/constants.js +32 -0
  19. package/dist/js/modern/router/index.js +236 -0
  20. package/dist/js/modern/router/types.js +0 -0
  21. package/dist/js/modern/router/utils.js +83 -0
  22. package/dist/js/modern/types.js +45 -0
  23. package/dist/js/modern/utils/alias.js +76 -0
  24. package/dist/js/modern/utils/debug.js +5 -0
  25. package/dist/js/modern/utils/index.js +8 -0
  26. package/dist/js/modern/utils/meta.js +8 -0
  27. package/dist/js/modern/utils/storage.js +42 -0
  28. package/dist/js/modern/utils/validate.js +43 -0
  29. package/dist/js/node/api.js +98 -0
  30. package/dist/js/node/client/generate-client.js +109 -0
  31. package/dist/js/node/client/index.js +17 -0
  32. package/dist/js/node/client/result.js +46 -0
  33. package/dist/js/node/errors/http.js +40 -0
  34. package/dist/js/node/index.js +48 -0
  35. package/dist/js/node/operators/http.js +241 -0
  36. package/dist/js/node/router/constants.js +61 -0
  37. package/dist/js/node/router/index.js +256 -0
  38. package/dist/js/node/router/types.js +15 -0
  39. package/dist/js/node/router/utils.js +116 -0
  40. package/dist/js/node/types.js +73 -0
  41. package/dist/js/node/utils/alias.js +107 -0
  42. package/dist/js/node/utils/debug.js +28 -0
  43. package/dist/js/node/utils/index.js +32 -0
  44. package/dist/js/node/utils/meta.js +32 -0
  45. package/dist/js/node/utils/storage.js +71 -0
  46. package/dist/js/node/utils/validate.js +74 -0
  47. package/dist/types/client/generate-client.d.ts +6 -1
  48. package/dist/types/index.d.ts +1 -1
  49. package/dist/types/router/index.d.ts +5 -1
  50. package/dist/types/utils/meta.d.ts +3 -1
  51. 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
- prefix
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
  }
@@ -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
- const routePath = (0, import_utils3.getPathFromFilename)(this.lambdaDir, filename);
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
- const upperName = originHandlerName.toUpperCase();
140
- switch (upperName) {
141
- case "GET":
142
- return import_types.HttpMethod.Get;
143
- case "POST":
144
- return import_types.HttpMethod.Post;
145
- case "PUT":
146
- return import_types.HttpMethod.Put;
147
- case "DELETE":
148
- case "DEL":
149
- return import_types.HttpMethod.Delete;
150
- case "CONNECT":
151
- return import_types.HttpMethod.Connect;
152
- case "TRACE":
153
- return import_types.HttpMethod.Trace;
154
- case "PATCH":
155
- return import_types.HttpMethod.Patch;
156
- case "OPTION":
157
- return import_types.HttpMethod.Option;
158
- case "DEFAULT": {
159
- return import_types.HttpMethod.Get;
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
- default:
162
- import_utils.logger.warn(
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));
@@ -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
- prefix
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 } = require("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
  }
@@ -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
- const routePath = getPathFromFilename(this.lambdaDir, filename);
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
- const upperName = originHandlerName.toUpperCase();
121
- switch (upperName) {
122
- case "GET":
123
- return HttpMethod.Get;
124
- case "POST":
125
- return HttpMethod.Post;
126
- case "PUT":
127
- return HttpMethod.Put;
128
- case "DELETE":
129
- case "DEL":
130
- return HttpMethod.Delete;
131
- case "CONNECT":
132
- return HttpMethod.Connect;
133
- case "TRACE":
134
- return HttpMethod.Trace;
135
- case "PATCH":
136
- return HttpMethod.Patch;
137
- case "OPTION":
138
- return HttpMethod.Option;
139
- case "DEFAULT": {
140
- return HttpMethod.Get;
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
- default:
143
- logger.warn(
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));
@@ -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
+ };