@modern-js/bff-core 2.5.0 → 2.5.1-alpha.0

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 +5 -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 +51 -27
  5. package/dist/cjs/utils/meta.js +8 -0
  6. package/dist/esm/client/generate-client.js +5 -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 +52 -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 +4 -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
@@ -39,7 +39,8 @@ const generateClient = async ({
39
39
  target,
40
40
  requestCreator,
41
41
  fetcher,
42
- requireResolve = require.resolve
42
+ requireResolve = require.resolve,
43
+ httpMethodDecider
43
44
  }) => {
44
45
  if (!requestCreator) {
45
46
  requestCreator = requireResolve(
@@ -58,7 +59,8 @@ const generateClient = async ({
58
59
  }
59
60
  const apiRouter = new import_router.ApiRouter({
60
61
  apiDir,
61
- prefix
62
+ prefix,
63
+ httpMethodDecider
62
64
  });
63
65
  const handlerInfos = apiRouter.getSingleModuleHandlers(resourcePath);
64
66
  if (!handlerInfos) {
@@ -73,7 +75,7 @@ const generateClient = async ({
73
75
  }
74
76
  const upperHttpMethod = httpMethod.toUpperCase();
75
77
  const routeName = routePath;
76
- handlersCode += `export ${exportStatement} createRequest('${routeName}', '${upperHttpMethod}', ${process.env.PORT || String(port)}${fetcher ? `, fetch` : ""});
78
+ handlersCode += `export ${exportStatement} createRequest('${routeName}', '${upperHttpMethod}', '${httpMethodDecider}', ${process.env.PORT || String(port)}${fetcher ? `, fetch` : ""});
77
79
  `;
78
80
  }
79
81
  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,42 @@ 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
+ import_utils.logger.warn(
173
+ `Only api handlers are allowd to be exported, please remove the function ${originHandlerName} from exports`
174
+ );
175
+ return null;
160
176
  }
161
- default:
162
- import_utils.logger.warn(
163
- `Only api handlers are allowd to be exported, please remove the function ${originHandlerName} from exports`
164
- );
177
+ } else {
178
+ if (!handler)
165
179
  return null;
180
+ if (typeof handler === "function" && handler.length > 0) {
181
+ return import_types.HttpMethod.Post;
182
+ }
183
+ return import_types.HttpMethod.Get;
166
184
  }
167
185
  }
168
186
  loadApiFiles() {
@@ -231,8 +249,14 @@ class ApiRouter {
231
249
  }
232
250
  getModuleHandlerInfos(moduleInfo) {
233
251
  const { module: module2, filename } = moduleInfo;
252
+ const { httpMethodDecider } = this;
234
253
  return Object.entries(module2).filter(([, handler]) => typeof handler === "function").map(([key]) => {
235
254
  const handler = module2[key];
255
+ if (httpMethodDecider === "inputParams") {
256
+ Object.assign(handler, {
257
+ [import_utils2.INPUT_PARAMS_DECIDER]: true
258
+ });
259
+ }
236
260
  const handlerInfo = this.getHandlerInfo(filename, key, handler);
237
261
  return handlerInfo;
238
262
  }).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
  });
@@ -10,7 +10,8 @@ const generateClient = async ({
10
10
  target,
11
11
  requestCreator,
12
12
  fetcher,
13
- requireResolve = require.resolve
13
+ requireResolve = require.resolve,
14
+ httpMethodDecider
14
15
  }) => {
15
16
  if (!requestCreator) {
16
17
  requestCreator = requireResolve(
@@ -29,7 +30,8 @@ const generateClient = async ({
29
30
  }
30
31
  const apiRouter = new ApiRouter({
31
32
  apiDir,
32
- prefix
33
+ prefix,
34
+ httpMethodDecider
33
35
  });
34
36
  const handlerInfos = apiRouter.getSingleModuleHandlers(resourcePath);
35
37
  if (!handlerInfos) {
@@ -44,7 +46,7 @@ const generateClient = async ({
44
46
  }
45
47
  const upperHttpMethod = httpMethod.toUpperCase();
46
48
  const routeName = routePath;
47
- handlersCode += `export ${exportStatement} createRequest('${routeName}', '${upperHttpMethod}', ${process.env.PORT || String(port)}${fetcher ? `, fetch` : ""});
49
+ handlersCode += `export ${exportStatement} createRequest('${routeName}', '${upperHttpMethod}', '${httpMethodDecider}', ${process.env.PORT || String(port)}${fetcher ? `, fetch` : ""});
48
50
  `;
49
51
  }
50
52
  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,42 @@ 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
+ logger.warn(
154
+ `Only api handlers are allowd to be exported, please remove the function ${originHandlerName} from exports`
155
+ );
156
+ return null;
141
157
  }
142
- default:
143
- logger.warn(
144
- `Only api handlers are allowd to be exported, please remove the function ${originHandlerName} from exports`
145
- );
158
+ } else {
159
+ if (!handler)
146
160
  return null;
161
+ if (typeof handler === "function" && handler.length > 0) {
162
+ return HttpMethod.Post;
163
+ }
164
+ return HttpMethod.Get;
147
165
  }
148
166
  }
149
167
  loadApiFiles() {
@@ -212,8 +230,14 @@ class ApiRouter {
212
230
  }
213
231
  getModuleHandlerInfos(moduleInfo) {
214
232
  const { module, filename } = moduleInfo;
233
+ const { httpMethodDecider } = this;
215
234
  return Object.entries(module).filter(([, handler]) => typeof handler === "function").map(([key]) => {
216
235
  const handler = module[key];
236
+ if (httpMethodDecider === "inputParams") {
237
+ Object.assign(handler, {
238
+ [INPUT_PARAMS_DECIDER]: true
239
+ });
240
+ }
217
241
  const handlerInfo = this.getHandlerInfo(filename, key, handler);
218
242
  return handlerInfo;
219
243
  }).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
+ };