@modern-js/plugin-bff 2.67.1 → 2.67.3

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.
@@ -0,0 +1,6 @@
1
+ export * from "@modern-js/bff-core";
2
+ import { useHonoContext } from "@modern-js/server-core";
3
+ export * from "./operators";
4
+ export {
5
+ useHonoContext
6
+ };
@@ -0,0 +1,79 @@
1
+ import { _ as _async_to_generator } from "@swc/helpers/_/_async_to_generator";
2
+ import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
3
+ import { useHonoContext } from "@modern-js/server-core";
4
+ var Pipe = function(func) {
5
+ return {
6
+ name: "pipe",
7
+ execute: function execute(executeHelper, next) {
8
+ return _async_to_generator(function() {
9
+ var inputs, ctx, res, isPiped, end, output;
10
+ return _ts_generator(this, function(_state) {
11
+ switch (_state.label) {
12
+ case 0:
13
+ inputs = executeHelper.inputs;
14
+ ctx = useHonoContext();
15
+ res = ctx.res;
16
+ if (!(typeof func === "function"))
17
+ return [
18
+ 3,
19
+ 3
20
+ ];
21
+ isPiped = true;
22
+ end = function(value) {
23
+ isPiped = false;
24
+ if (typeof value === "function") {
25
+ value(res);
26
+ return;
27
+ }
28
+ return value;
29
+ };
30
+ return [
31
+ 4,
32
+ func(inputs, end)
33
+ ];
34
+ case 1:
35
+ output = _state.sent();
36
+ if (!isPiped) {
37
+ if (output) {
38
+ return [
39
+ 2,
40
+ executeHelper.result = output
41
+ ];
42
+ } else {
43
+ return [
44
+ 2
45
+ ];
46
+ }
47
+ }
48
+ executeHelper.inputs = output;
49
+ return [
50
+ 4,
51
+ next()
52
+ ];
53
+ case 2:
54
+ _state.sent();
55
+ _state.label = 3;
56
+ case 3:
57
+ return [
58
+ 2
59
+ ];
60
+ }
61
+ });
62
+ })();
63
+ }
64
+ };
65
+ };
66
+ var Middleware = function(middleware) {
67
+ return {
68
+ name: "middleware",
69
+ metadata: function metadata(helper) {
70
+ var middlewares = helper.getMetadata("pipe") || [];
71
+ middlewares.push(middleware);
72
+ helper.setMetadata("middleware", middlewares);
73
+ }
74
+ };
75
+ };
76
+ export {
77
+ Middleware,
78
+ Pipe
79
+ };
@@ -6,7 +6,9 @@ import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
6
6
  import path from "path";
7
7
  import { ApiRouter } from "@modern-js/bff-core";
8
8
  import { API_DIR, isProd, isWebOnly, requireExistModule } from "@modern-js/utils";
9
+ import { isFunction } from "@modern-js/utils";
9
10
  import { API_APP_NAME } from "./constants";
11
+ import { HonoAdapter } from "./runtime/hono/adapter";
10
12
  var Storage = /* @__PURE__ */ function() {
11
13
  "use strict";
12
14
  function Storage2() {
@@ -34,6 +36,7 @@ function server_default() {
34
36
  var transformAPI = createTransformAPI(storage);
35
37
  var apiAppPath = "";
36
38
  var apiRouter;
39
+ var honoAdapter = new HonoAdapter(api);
37
40
  return {
38
41
  prepare: function prepare() {
39
42
  return _async_to_generator(function() {
@@ -121,7 +124,7 @@ function server_default() {
121
124
  handler = _state.sent();
122
125
  _state.label = 5;
123
126
  case 5:
124
- if (handler) {
127
+ if (handler && isFunction(handler)) {
125
128
  globalMiddlewares.push({
126
129
  name: "bind-bff",
127
130
  handler: function(c, next) {
@@ -139,6 +142,10 @@ function server_default() {
139
142
  ]
140
143
  });
141
144
  }
145
+ honoAdapter.registerMiddleware({
146
+ prefix,
147
+ enableHandleWeb
148
+ });
142
149
  return [
143
150
  2
144
151
  ];
@@ -171,7 +178,7 @@ function server_default() {
171
178
  if (!(event.type === "file-change"))
172
179
  return [
173
180
  3,
174
- 3
181
+ 5
175
182
  ];
176
183
  return [
177
184
  4,
@@ -183,8 +190,20 @@ function server_default() {
183
190
  api.setAppContext(_object_spread_props(_object_spread({}, appContext1), {
184
191
  apiHandlerInfos
185
192
  }));
186
- _state.label = 3;
193
+ return [
194
+ 4,
195
+ honoAdapter.setHandlers()
196
+ ];
187
197
  case 3:
198
+ _state.sent();
199
+ return [
200
+ 4,
201
+ honoAdapter.registerApiRoutes()
202
+ ];
203
+ case 4:
204
+ _state.sent();
205
+ _state.label = 5;
206
+ case 5:
188
207
  return [
189
208
  2
190
209
  ];
@@ -0,0 +1,330 @@
1
+ import { _ as _async_to_generator } from "@swc/helpers/_/_async_to_generator";
2
+ import { _ as _instanceof } from "@swc/helpers/_/_instanceof";
3
+ import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array";
4
+ import { _ as _to_consumable_array } from "@swc/helpers/_/_to_consumable_array";
5
+ import { _ as _type_of } from "@swc/helpers/_/_type_of";
6
+ import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
7
+ import { HttpMetadata, ResponseMetaType, ValidationError, isWithMetaHandler } from "@modern-js/bff-core";
8
+ import typeIs from "type-is";
9
+ var createHonoRoutes = function(handlerInfos) {
10
+ return handlerInfos.map(function(param) {
11
+ var routePath = param.routePath, handler = param.handler, httpMethod = param.httpMethod;
12
+ var routeMiddlwares = Reflect.getMetadata("middleware", handler) || [];
13
+ var honoHandler = createHonoHandler(handler);
14
+ return {
15
+ method: httpMethod.toLowerCase(),
16
+ path: routePath,
17
+ handler: routeMiddlwares.length > 0 ? _to_consumable_array(routeMiddlwares).concat([
18
+ honoHandler
19
+ ]) : honoHandler
20
+ };
21
+ });
22
+ };
23
+ var handleResponseMeta = function(c, handler) {
24
+ var responseMeta = Reflect.getMetadata(HttpMetadata.Response, handler);
25
+ if (Array.isArray(responseMeta)) {
26
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
27
+ try {
28
+ for (var _iterator = responseMeta[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
29
+ var meta = _step.value;
30
+ switch (meta.type) {
31
+ case ResponseMetaType.Headers:
32
+ var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = void 0;
33
+ try {
34
+ for (var _iterator1 = Object.entries(meta.value)[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true) {
35
+ var _step_value = _sliced_to_array(_step1.value, 2), key = _step_value[0], value = _step_value[1];
36
+ c.header(key, value);
37
+ }
38
+ } catch (err) {
39
+ _didIteratorError1 = true;
40
+ _iteratorError1 = err;
41
+ } finally {
42
+ try {
43
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
44
+ _iterator1.return();
45
+ }
46
+ } finally {
47
+ if (_didIteratorError1) {
48
+ throw _iteratorError1;
49
+ }
50
+ }
51
+ }
52
+ break;
53
+ case ResponseMetaType.Redirect:
54
+ return c.redirect(meta.value);
55
+ case ResponseMetaType.StatusCode:
56
+ c.status(meta.value);
57
+ break;
58
+ default:
59
+ break;
60
+ }
61
+ }
62
+ } catch (err) {
63
+ _didIteratorError = true;
64
+ _iteratorError = err;
65
+ } finally {
66
+ try {
67
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
68
+ _iterator.return();
69
+ }
70
+ } finally {
71
+ if (_didIteratorError) {
72
+ throw _iteratorError;
73
+ }
74
+ }
75
+ }
76
+ }
77
+ return null;
78
+ };
79
+ var createHonoHandler = function(handler) {
80
+ return function() {
81
+ var _ref = _async_to_generator(function(c, next) {
82
+ var input, response, result, error, args, body, e, error1;
83
+ return _ts_generator(this, function(_state) {
84
+ switch (_state.label) {
85
+ case 0:
86
+ _state.trys.push([
87
+ 0,
88
+ 13,
89
+ ,
90
+ 14
91
+ ]);
92
+ return [
93
+ 4,
94
+ getHonoInput(c)
95
+ ];
96
+ case 1:
97
+ input = _state.sent();
98
+ if (!isWithMetaHandler(handler))
99
+ return [
100
+ 3,
101
+ 6
102
+ ];
103
+ _state.label = 2;
104
+ case 2:
105
+ _state.trys.push([
106
+ 2,
107
+ 4,
108
+ ,
109
+ 5
110
+ ]);
111
+ response = handleResponseMeta(c, handler);
112
+ if (response) {
113
+ return [
114
+ 2,
115
+ response
116
+ ];
117
+ }
118
+ if (c.finalized)
119
+ return [
120
+ 2
121
+ ];
122
+ return [
123
+ 4,
124
+ handler(input)
125
+ ];
126
+ case 3:
127
+ result = _state.sent();
128
+ return [
129
+ 2,
130
+ result && (typeof result === "undefined" ? "undefined" : _type_of(result)) === "object" ? c.json(result) : c.body(result)
131
+ ];
132
+ case 4:
133
+ error = _state.sent();
134
+ if (_instanceof(error, ValidationError)) {
135
+ c.status(error.status);
136
+ return [
137
+ 2,
138
+ c.json({
139
+ message: error.message
140
+ })
141
+ ];
142
+ }
143
+ throw error;
144
+ case 5:
145
+ return [
146
+ 3,
147
+ 12
148
+ ];
149
+ case 6:
150
+ args = Object.values(input.params).concat(input);
151
+ _state.label = 7;
152
+ case 7:
153
+ _state.trys.push([
154
+ 7,
155
+ 11,
156
+ ,
157
+ 12
158
+ ]);
159
+ return [
160
+ 4,
161
+ handler.apply(void 0, _to_consumable_array(args))
162
+ ];
163
+ case 8:
164
+ body = _state.sent();
165
+ if (!c.finalized)
166
+ return [
167
+ 3,
168
+ 10
169
+ ];
170
+ return [
171
+ 4,
172
+ Promise.resolve()
173
+ ];
174
+ case 9:
175
+ return [
176
+ 2,
177
+ _state.sent()
178
+ ];
179
+ case 10:
180
+ if (typeof body !== "undefined") {
181
+ return [
182
+ 2,
183
+ c.json(body)
184
+ ];
185
+ }
186
+ return [
187
+ 3,
188
+ 12
189
+ ];
190
+ case 11:
191
+ e = _state.sent();
192
+ return [
193
+ 2,
194
+ next()
195
+ ];
196
+ case 12:
197
+ return [
198
+ 3,
199
+ 14
200
+ ];
201
+ case 13:
202
+ error1 = _state.sent();
203
+ next();
204
+ return [
205
+ 3,
206
+ 14
207
+ ];
208
+ case 14:
209
+ return [
210
+ 2
211
+ ];
212
+ }
213
+ });
214
+ });
215
+ return function(c, next) {
216
+ return _ref.apply(this, arguments);
217
+ };
218
+ }();
219
+ };
220
+ var getHonoInput = function() {
221
+ var _ref = _async_to_generator(function(c) {
222
+ var draft, contentType, error;
223
+ return _ts_generator(this, function(_state) {
224
+ switch (_state.label) {
225
+ case 0:
226
+ draft = {
227
+ params: c.req.param(),
228
+ query: c.req.query(),
229
+ headers: c.req.header(),
230
+ cookies: c.req.header("cookie")
231
+ };
232
+ _state.label = 1;
233
+ case 1:
234
+ _state.trys.push([
235
+ 1,
236
+ 10,
237
+ ,
238
+ 11
239
+ ]);
240
+ contentType = c.req.header("content-type") || "";
241
+ if (!typeIs.is(contentType, [
242
+ "application/json"
243
+ ]))
244
+ return [
245
+ 3,
246
+ 3
247
+ ];
248
+ return [
249
+ 4,
250
+ c.req.json()
251
+ ];
252
+ case 2:
253
+ draft.data = _state.sent();
254
+ return [
255
+ 3,
256
+ 9
257
+ ];
258
+ case 3:
259
+ if (!typeIs.is(contentType, [
260
+ "multipart/form-data"
261
+ ]))
262
+ return [
263
+ 3,
264
+ 5
265
+ ];
266
+ return [
267
+ 4,
268
+ c.req.parseBody()
269
+ ];
270
+ case 4:
271
+ draft.formData = _state.sent();
272
+ return [
273
+ 3,
274
+ 9
275
+ ];
276
+ case 5:
277
+ if (!typeIs.is(contentType, [
278
+ "application/x-www-form-urlencoded"
279
+ ]))
280
+ return [
281
+ 3,
282
+ 7
283
+ ];
284
+ return [
285
+ 4,
286
+ c.req.parseBody()
287
+ ];
288
+ case 6:
289
+ draft.formUrlencoded = _state.sent();
290
+ return [
291
+ 3,
292
+ 9
293
+ ];
294
+ case 7:
295
+ return [
296
+ 4,
297
+ c.req.json()
298
+ ];
299
+ case 8:
300
+ draft.body = _state.sent();
301
+ _state.label = 9;
302
+ case 9:
303
+ return [
304
+ 3,
305
+ 11
306
+ ];
307
+ case 10:
308
+ error = _state.sent();
309
+ draft.body = null;
310
+ return [
311
+ 3,
312
+ 11
313
+ ];
314
+ case 11:
315
+ return [
316
+ 2,
317
+ draft
318
+ ];
319
+ }
320
+ });
321
+ });
322
+ return function getHonoInput2(c) {
323
+ return _ref.apply(this, arguments);
324
+ };
325
+ }();
326
+ var createHonoRoutes_default = createHonoRoutes;
327
+ export {
328
+ createHonoHandler,
329
+ createHonoRoutes_default as default
330
+ };
@@ -8,6 +8,7 @@ import runtimeGenerator from "./utils/runtimeGenerator";
8
8
  const DEFAULT_API_PREFIX = "/api";
9
9
  const TS_CONFIG_FILENAME = "tsconfig.json";
10
10
  const RUNTIME_CREATE_REQUEST = "@modern-js/plugin-bff/runtime/create-request";
11
+ const RUNTIME_HONO = "@modern-js/plugin-bff/hono";
11
12
  const bffPlugin = () => ({
12
13
  name: "@modern-js/plugin-bff",
13
14
  setup: (api) => {
@@ -96,8 +97,15 @@ const bffPlugin = () => ({
96
97
  await generator();
97
98
  }
98
99
  };
100
+ const isHono = () => {
101
+ const { bffRuntimeFramework } = api.useAppContext();
102
+ return bffRuntimeFramework === "hono";
103
+ };
99
104
  return {
100
105
  config() {
106
+ const honoRuntimePath = isHono() ? {
107
+ [RUNTIME_HONO]: RUNTIME_HONO
108
+ } : void 0;
101
109
  return {
102
110
  tools: {
103
111
  bundlerChain: (chain, { CHAIN_ID, isServer }) => {
@@ -140,6 +148,9 @@ const bffPlugin = () => ({
140
148
  `./${API_DIR}`,
141
149
  /create-request/
142
150
  ]
151
+ },
152
+ output: {
153
+ externals: honoRuntimePath
143
154
  }
144
155
  };
145
156
  },
@@ -160,7 +171,7 @@ const bffPlugin = () => ({
160
171
  isSPA: false,
161
172
  isSSR: false
162
173
  }));
163
- if (bff === null || bff === void 0 ? void 0 : bff.enableHandleWeb) {
174
+ if (!isHono() && (bff === null || bff === void 0 ? void 0 : bff.enableHandleWeb)) {
164
175
  return {
165
176
  routes: routes.map((route) => {
166
177
  return {
@@ -0,0 +1,86 @@
1
+ import { Hono } from "@modern-js/server-core";
2
+ import { isProd } from "@modern-js/utils";
3
+ import createHonoRoutes from "../../utils/createHonoRoutes";
4
+ const before = [
5
+ "custom-server-hook",
6
+ "custom-server-middleware",
7
+ "render"
8
+ ];
9
+ class HonoAdapter {
10
+ wrapInArray(handler) {
11
+ if (Array.isArray(handler)) {
12
+ return handler;
13
+ } else {
14
+ return [
15
+ handler
16
+ ];
17
+ }
18
+ }
19
+ constructor(api) {
20
+ this.apiMiddleware = [];
21
+ this.apiServer = null;
22
+ this.isHono = true;
23
+ this.setHandlers = async () => {
24
+ if (!this.isHono) {
25
+ return;
26
+ }
27
+ const { apiHandlerInfos } = this.api.useAppContext();
28
+ const honoHandlers = createHonoRoutes(apiHandlerInfos);
29
+ this.apiMiddleware = honoHandlers.map(({ path, method, handler }) => ({
30
+ name: "hono-bff-api",
31
+ path,
32
+ method,
33
+ handler,
34
+ order: "post",
35
+ before
36
+ }));
37
+ };
38
+ this.registerApiRoutes = async () => {
39
+ if (!this.isHono) {
40
+ return;
41
+ }
42
+ this.apiServer = new Hono();
43
+ this.apiMiddleware.forEach(({ path = "*", method = "all", handler }) => {
44
+ var _this_apiServer;
45
+ const handlers = this.wrapInArray(handler);
46
+ (_this_apiServer = this.apiServer) === null || _this_apiServer === void 0 ? void 0 : _this_apiServer[method](path, ...handlers);
47
+ });
48
+ };
49
+ this.registerMiddleware = async (options) => {
50
+ const { prefix } = options;
51
+ const { bffRuntimeFramework } = this.api.useAppContext();
52
+ if (bffRuntimeFramework !== "hono") {
53
+ this.isHono = false;
54
+ return;
55
+ }
56
+ const { middlewares: globalMiddlewares } = this.api.useAppContext();
57
+ await this.setHandlers();
58
+ if (isProd()) {
59
+ globalMiddlewares.push(...this.apiMiddleware);
60
+ } else {
61
+ await this.registerApiRoutes();
62
+ const dynamicApiMiddleware = {
63
+ name: "dynamic-bff-handler",
64
+ path: `${prefix}/*`,
65
+ method: "all",
66
+ order: "post",
67
+ before,
68
+ handler: async (c, next) => {
69
+ if (this.apiServer) {
70
+ const response = await this.apiServer.fetch(c.req, c.env);
71
+ if (response.status !== 404) {
72
+ return new Response(response.body, response);
73
+ }
74
+ }
75
+ await next();
76
+ }
77
+ };
78
+ globalMiddlewares.push(dynamicApiMiddleware);
79
+ }
80
+ };
81
+ this.api = api;
82
+ }
83
+ }
84
+ export {
85
+ HonoAdapter
86
+ };
@@ -0,0 +1,6 @@
1
+ export * from "@modern-js/bff-core";
2
+ import { useHonoContext } from "@modern-js/server-core";
3
+ export * from "./operators";
4
+ export {
5
+ useHonoContext
6
+ };
@@ -0,0 +1,46 @@
1
+ import { useHonoContext } from "@modern-js/server-core";
2
+ const Pipe = (func) => {
3
+ return {
4
+ name: "pipe",
5
+ async execute(executeHelper, next) {
6
+ const { inputs } = executeHelper;
7
+ const ctx = useHonoContext();
8
+ const { res } = ctx;
9
+ if (typeof func === "function") {
10
+ let isPiped = true;
11
+ const end = (value) => {
12
+ isPiped = false;
13
+ if (typeof value === "function") {
14
+ value(res);
15
+ return;
16
+ }
17
+ return value;
18
+ };
19
+ const output = await func(inputs, end);
20
+ if (!isPiped) {
21
+ if (output) {
22
+ return executeHelper.result = output;
23
+ } else {
24
+ return;
25
+ }
26
+ }
27
+ executeHelper.inputs = output;
28
+ await next();
29
+ }
30
+ }
31
+ };
32
+ };
33
+ const Middleware = (middleware) => {
34
+ return {
35
+ name: "middleware",
36
+ metadata(helper) {
37
+ const middlewares = helper.getMetadata("pipe") || [];
38
+ middlewares.push(middleware);
39
+ helper.setMetadata("middleware", middlewares);
40
+ }
41
+ };
42
+ };
43
+ export {
44
+ Middleware,
45
+ Pipe
46
+ };