@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.
- package/dist/cjs/cli.js +12 -1
- package/dist/cjs/runtime/hono/adapter.js +120 -0
- package/dist/cjs/runtime/hono/index.js +33 -0
- package/dist/cjs/runtime/hono/operators.js +71 -0
- package/dist/cjs/server.js +10 -1
- package/dist/cjs/utils/createHonoRoutes.js +148 -0
- package/dist/esm/cli.js +11 -1
- package/dist/esm/runtime/hono/adapter.js +184 -0
- package/dist/esm/runtime/hono/index.js +6 -0
- package/dist/esm/runtime/hono/operators.js +79 -0
- package/dist/esm/server.js +22 -3
- package/dist/esm/utils/createHonoRoutes.js +330 -0
- package/dist/esm-node/cli.js +12 -1
- package/dist/esm-node/runtime/hono/adapter.js +86 -0
- package/dist/esm-node/runtime/hono/index.js +6 -0
- package/dist/esm-node/runtime/hono/operators.js +46 -0
- package/dist/esm-node/server.js +10 -1
- package/dist/esm-node/utils/createHonoRoutes.js +114 -0
- package/dist/types/runtime/hono/adapter.d.ts +18 -0
- package/dist/types/runtime/hono/index.d.ts +3 -0
- package/dist/types/runtime/hono/operators.d.ts +10 -0
- package/dist/types/utils/createHonoRoutes.d.ts +10 -0
- package/package.json +25 -14
|
@@ -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
|
+
};
|
package/dist/esm/server.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
+
};
|
package/dist/esm-node/cli.js
CHANGED
|
@@ -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,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
|
+
};
|