@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.
@@ -1,7 +1,9 @@
1
1
  import path from "path";
2
2
  import { ApiRouter } from "@modern-js/bff-core";
3
3
  import { API_DIR, isProd, isWebOnly, requireExistModule } from "@modern-js/utils";
4
+ import { isFunction } from "@modern-js/utils";
4
5
  import { API_APP_NAME } from "./constants";
6
+ import { HonoAdapter } from "./runtime/hono/adapter";
5
7
  class Storage {
6
8
  reset() {
7
9
  this.middlewares = [];
@@ -22,6 +24,7 @@ var server_default = () => ({
22
24
  const transformAPI = createTransformAPI(storage);
23
25
  let apiAppPath = "";
24
26
  let apiRouter;
27
+ const honoAdapter = new HonoAdapter(api);
25
28
  return {
26
29
  async prepare() {
27
30
  var _config_bff, _config_bff1, _config_bff2;
@@ -63,7 +66,7 @@ var server_default = () => ({
63
66
  onLast: () => null
64
67
  });
65
68
  }
66
- if (handler) {
69
+ if (handler && isFunction(handler)) {
67
70
  globalMiddlewares.push({
68
71
  name: "bind-bff",
69
72
  handler: (c, next) => {
@@ -81,6 +84,10 @@ var server_default = () => ({
81
84
  ]
82
85
  });
83
86
  }
87
+ honoAdapter.registerMiddleware({
88
+ prefix,
89
+ enableHandleWeb
90
+ });
84
91
  },
85
92
  async reset({ event }) {
86
93
  storage.reset();
@@ -101,6 +108,8 @@ var server_default = () => ({
101
108
  ...appContext2,
102
109
  apiHandlerInfos
103
110
  });
111
+ await honoAdapter.setHandlers();
112
+ await honoAdapter.registerApiRoutes();
104
113
  }
105
114
  },
106
115
  async prepareApiServer(props, next) {
@@ -0,0 +1,114 @@
1
+ import { HttpMetadata, ResponseMetaType, ValidationError, isWithMetaHandler } from "@modern-js/bff-core";
2
+ import typeIs from "type-is";
3
+ const createHonoRoutes = (handlerInfos) => {
4
+ return handlerInfos.map(({ routePath, handler, httpMethod }) => {
5
+ const routeMiddlwares = Reflect.getMetadata("middleware", handler) || [];
6
+ const honoHandler = createHonoHandler(handler);
7
+ return {
8
+ method: httpMethod.toLowerCase(),
9
+ path: routePath,
10
+ handler: routeMiddlwares.length > 0 ? [
11
+ ...routeMiddlwares,
12
+ honoHandler
13
+ ] : honoHandler
14
+ };
15
+ });
16
+ };
17
+ const handleResponseMeta = (c, handler) => {
18
+ const responseMeta = Reflect.getMetadata(HttpMetadata.Response, handler);
19
+ if (Array.isArray(responseMeta)) {
20
+ for (const meta of responseMeta) {
21
+ switch (meta.type) {
22
+ case ResponseMetaType.Headers:
23
+ for (const [key, value] of Object.entries(meta.value)) {
24
+ c.header(key, value);
25
+ }
26
+ break;
27
+ case ResponseMetaType.Redirect:
28
+ return c.redirect(meta.value);
29
+ case ResponseMetaType.StatusCode:
30
+ c.status(meta.value);
31
+ break;
32
+ default:
33
+ break;
34
+ }
35
+ }
36
+ }
37
+ return null;
38
+ };
39
+ const createHonoHandler = (handler) => {
40
+ return async (c, next) => {
41
+ try {
42
+ const input = await getHonoInput(c);
43
+ if (isWithMetaHandler(handler)) {
44
+ try {
45
+ const response = handleResponseMeta(c, handler);
46
+ if (response) {
47
+ return response;
48
+ }
49
+ if (c.finalized)
50
+ return;
51
+ const result = await handler(input);
52
+ return result && typeof result === "object" ? c.json(result) : c.body(result);
53
+ } catch (error) {
54
+ if (error instanceof ValidationError) {
55
+ c.status(error.status);
56
+ return c.json({
57
+ message: error.message
58
+ });
59
+ }
60
+ throw error;
61
+ }
62
+ } else {
63
+ const args = Object.values(input.params).concat(input);
64
+ try {
65
+ const body = await handler(...args);
66
+ if (c.finalized) {
67
+ return await Promise.resolve();
68
+ }
69
+ if (typeof body !== "undefined") {
70
+ return c.json(body);
71
+ }
72
+ } catch {
73
+ return next();
74
+ }
75
+ }
76
+ } catch (error) {
77
+ next();
78
+ }
79
+ };
80
+ };
81
+ const getHonoInput = async (c) => {
82
+ const draft = {
83
+ params: c.req.param(),
84
+ query: c.req.query(),
85
+ headers: c.req.header(),
86
+ cookies: c.req.header("cookie")
87
+ };
88
+ try {
89
+ const contentType = c.req.header("content-type") || "";
90
+ if (typeIs.is(contentType, [
91
+ "application/json"
92
+ ])) {
93
+ draft.data = await c.req.json();
94
+ } else if (typeIs.is(contentType, [
95
+ "multipart/form-data"
96
+ ])) {
97
+ draft.formData = await c.req.parseBody();
98
+ } else if (typeIs.is(contentType, [
99
+ "application/x-www-form-urlencoded"
100
+ ])) {
101
+ draft.formUrlencoded = await c.req.parseBody();
102
+ } else {
103
+ draft.body = await c.req.json();
104
+ }
105
+ } catch (error) {
106
+ draft.body = null;
107
+ }
108
+ return draft;
109
+ };
110
+ var createHonoRoutes_default = createHonoRoutes;
111
+ export {
112
+ createHonoHandler,
113
+ createHonoRoutes_default as default
114
+ };
@@ -0,0 +1,18 @@
1
+ import type { MiddlewareHandler, PluginAPI, ServerMiddleware } from '@modern-js/server-core';
2
+ import { Hono } from '@modern-js/server-core';
3
+ interface MiddlewareOptions {
4
+ prefix: string;
5
+ enableHandleWeb?: boolean;
6
+ }
7
+ export declare class HonoAdapter {
8
+ apiMiddleware: ServerMiddleware[];
9
+ apiServer: Hono | null;
10
+ api: PluginAPI;
11
+ isHono: boolean;
12
+ constructor(api: PluginAPI);
13
+ setHandlers: () => Promise<void>;
14
+ registerApiRoutes: () => Promise<void>;
15
+ registerMiddleware: (options: MiddlewareOptions) => Promise<void>;
16
+ wrapInArray(handler: MiddlewareHandler[] | MiddlewareHandler): MiddlewareHandler[];
17
+ }
18
+ export {};
@@ -0,0 +1,3 @@
1
+ export * from '@modern-js/bff-core';
2
+ export { useHonoContext } from '@modern-js/server-core';
3
+ export * from './operators';
@@ -0,0 +1,10 @@
1
+ import type { Operator } from '@modern-js/bff-core';
2
+ import { type Context, type Next } from '@modern-js/server-core';
3
+ export type EndFunction = ((func: (res: Response) => void) => void) & ((data: unknown) => void);
4
+ type MaybeAsync<T> = T | Promise<T>;
5
+ type PipeFunction<T> = (value: T, end: EndFunction) => MaybeAsync<void> | MaybeAsync<T>;
6
+ export declare const Pipe: <T>(func: PipeFunction<T>) => Operator<T>;
7
+ export type Pipe = typeof Pipe;
8
+ export declare const Middleware: (middleware: (c: Context, next: Next) => void) => Operator<void>;
9
+ export type Middleware = typeof Middleware;
10
+ export {};
@@ -0,0 +1,10 @@
1
+ import type { APIHandlerInfo } from '@modern-js/bff-core';
2
+ import type { Context, Next } from '@modern-js/server-core';
3
+ type Handler = APIHandlerInfo['handler'];
4
+ declare const createHonoRoutes: (handlerInfos: APIHandlerInfo[]) => {
5
+ method: any;
6
+ path: string;
7
+ handler: any[] | ((c: Context, next: Next) => Promise<void | Response>);
8
+ }[];
9
+ export declare const createHonoHandler: (handler: Handler) => (c: Context, next: Next) => Promise<void | Response>;
10
+ export default createHonoRoutes;
package/package.json CHANGED
@@ -15,7 +15,7 @@
15
15
  "modern",
16
16
  "modern.js"
17
17
  ],
18
- "version": "2.67.1",
18
+ "version": "2.67.3",
19
19
  "jsnext:source": "./src/cli.ts",
20
20
  "types": "./dist/types/cli.d.ts",
21
21
  "main": "./dist/cjs/cli.js",
@@ -42,6 +42,11 @@
42
42
  "jsnext:source": "./src/loader.ts",
43
43
  "default": "./dist/cjs/loader.js"
44
44
  },
45
+ "./hono": {
46
+ "types": "./dist/types/runtime/hono/index.d.ts",
47
+ "jsnext:source": "./src/runtime/hono/index.ts",
48
+ "default": "./dist/cjs/runtime/hono/index.js"
49
+ },
45
50
  "./runtime/create-request": {
46
51
  "types": "./dist/types/create-request/index.d.ts",
47
52
  "jsnext:source": "./src/runtime/create-request/index.ts",
@@ -59,6 +64,9 @@
59
64
  "server": [
60
65
  "./dist/types/server.d.ts"
61
66
  ],
67
+ "hono": [
68
+ "./dist/types/runtime/hono/index.d.ts"
69
+ ],
62
70
  "runtime/create-request": [
63
71
  "./dist/types/runtime/create-request/index.d.ts"
64
72
  ]
@@ -66,30 +74,33 @@
66
74
  },
67
75
  "dependencies": {
68
76
  "@babel/core": "^7.26.0",
77
+ "type-is": "^1.6.18",
69
78
  "@swc/helpers": "0.5.13",
70
- "@modern-js/bff-core": "2.67.1",
71
- "@modern-js/create-request": "2.67.1",
72
- "@modern-js/server-core": "2.67.1",
73
- "@modern-js/server-utils": "2.67.1",
74
- "@modern-js/utils": "2.67.1"
79
+ "@modern-js/bff-core": "2.67.3",
80
+ "@modern-js/create-request": "2.67.3",
81
+ "@modern-js/server-core": "2.67.3",
82
+ "@modern-js/server-utils": "2.67.3",
83
+ "@modern-js/utils": "2.67.3"
75
84
  },
76
85
  "devDependencies": {
77
86
  "@types/babel__core": "^7.20.5",
78
87
  "@types/jest": "^29",
79
88
  "@types/node": "^14",
89
+ "@types/type-is": "^1.6.3",
80
90
  "jest": "^29",
81
91
  "memfs": "^3.5.1",
82
92
  "ts-jest": "^29.1.0",
83
93
  "typescript": "^5",
84
94
  "webpack": "^5.98.0",
85
- "@modern-js/plugin-v2": "2.67.1",
86
- "@modern-js/app-tools": "2.67.1",
87
- "@modern-js/bff-runtime": "2.67.1",
88
- "@modern-js/core": "2.67.1",
89
- "@modern-js/runtime": "2.67.1",
90
- "@modern-js/types": "2.67.1",
91
- "@scripts/jest-config": "2.66.0",
92
- "@scripts/build": "2.66.0"
95
+ "zod": "^3.22.3",
96
+ "@modern-js/plugin-v2": "2.67.3",
97
+ "@modern-js/app-tools": "2.67.3",
98
+ "@modern-js/bff-runtime": "2.67.3",
99
+ "@modern-js/core": "2.67.3",
100
+ "@modern-js/types": "2.67.3",
101
+ "@modern-js/runtime": "2.67.3",
102
+ "@scripts/build": "2.66.0",
103
+ "@scripts/jest-config": "2.66.0"
93
104
  },
94
105
  "sideEffects": false,
95
106
  "publishConfig": {