vafast 0.3.2 → 0.3.4
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/auth/token.d.ts +13 -11
- package/dist/auth/token.js +118 -111
- package/dist/auth/token.js.map +1 -0
- package/dist/defineRoute.d.ts +5 -2
- package/dist/defineRoute.js +7 -2
- package/dist/defineRoute.js.map +1 -0
- package/dist/index.d.ts +30 -14
- package/dist/index.js +2247 -15
- package/dist/index.js.map +1 -0
- package/dist/middleware/auth.d.ts +8 -6
- package/dist/middleware/auth.js +198 -99
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/authMiddleware.d.ts +5 -2
- package/dist/middleware/authMiddleware.js +55 -11
- package/dist/middleware/authMiddleware.js.map +1 -0
- package/dist/middleware/component-renderer.d.ts +4 -2
- package/dist/middleware/component-renderer.js +87 -80
- package/dist/middleware/component-renderer.js.map +1 -0
- package/dist/middleware/component-router.d.ts +8 -3
- package/dist/middleware/component-router.js +33 -39
- package/dist/middleware/component-router.js.map +1 -0
- package/dist/middleware/cors.d.ts +6 -3
- package/dist/middleware/cors.js +42 -29
- package/dist/middleware/cors.js.map +1 -0
- package/dist/middleware/rateLimit.d.ts +5 -3
- package/dist/middleware/rateLimit.js +45 -29
- package/dist/middleware/rateLimit.js.map +1 -0
- package/dist/middleware.d.ts +6 -3
- package/dist/middleware.js +97 -51
- package/dist/middleware.js.map +1 -0
- package/dist/monitoring/index.d.ts +11 -4
- package/dist/monitoring/index.js +1299 -17
- package/dist/monitoring/index.js.map +1 -0
- package/dist/monitoring/native-monitor.d.ts +12 -6
- package/dist/monitoring/native-monitor.js +1258 -161
- package/dist/monitoring/native-monitor.js.map +1 -0
- package/dist/monitoring/types.d.ts +8 -6
- package/dist/monitoring/types.js +1 -1
- package/dist/monitoring/types.js.map +1 -0
- package/dist/node-server/index.d.ts +4 -22
- package/dist/node-server/index.js +254 -21
- package/dist/node-server/index.js.map +1 -0
- package/dist/node-server/request.d.ts +6 -2
- package/dist/node-server/request.js +102 -134
- package/dist/node-server/request.js.map +1 -0
- package/dist/node-server/response.d.ts +7 -3
- package/dist/node-server/response.js +67 -89
- package/dist/node-server/response.js.map +1 -0
- package/dist/node-server/serve.d.ts +11 -7
- package/dist/node-server/serve.js +231 -82
- package/dist/node-server/serve.js.map +1 -0
- package/dist/router/index.d.ts +3 -5
- package/dist/router/index.js +228 -7
- package/dist/router/index.js.map +1 -0
- package/dist/router/radix-tree.d.ts +7 -4
- package/dist/router/radix-tree.js +186 -218
- package/dist/router/radix-tree.js.map +1 -0
- package/dist/router.d.ts +7 -3
- package/dist/router.js +37 -83
- package/dist/router.js.map +1 -0
- package/dist/serve.d.ts +2 -12
- package/dist/serve.js +237 -11
- package/dist/serve.js.map +1 -0
- package/dist/server/base-server.d.ts +5 -2
- package/dist/server/base-server.js +124 -135
- package/dist/server/base-server.js.map +1 -0
- package/dist/server/component-server.d.ts +9 -4
- package/dist/server/component-server.js +481 -139
- package/dist/server/component-server.js.map +1 -0
- package/dist/server/index.d.ts +8 -7
- package/dist/server/index.js +985 -11
- package/dist/server/index.js.map +1 -0
- package/dist/server/server-factory.d.ts +11 -5
- package/dist/server/server-factory.js +979 -67
- package/dist/server/server-factory.js.map +1 -0
- package/dist/server/server.d.ts +7 -3
- package/dist/server/server.js +553 -112
- package/dist/server/server.js.map +1 -0
- package/dist/types/component-route.d.ts +8 -4
- package/dist/types/component-route.js +1 -1
- package/dist/types/component-route.js.map +1 -0
- package/dist/types/index.d.ts +5 -5
- package/dist/types/index.js +21 -4
- package/dist/types/index.js.map +1 -0
- package/dist/types/route.d.ts +13 -10
- package/dist/types/route.js +10 -9
- package/dist/types/route.js.map +1 -0
- package/dist/types/schema.d.ts +11 -7
- package/dist/types/schema.js +1 -1
- package/dist/types/schema.js.map +1 -0
- package/dist/types/types.d.ts +11 -9
- package/dist/types/types.js +1 -1
- package/dist/types/types.js.map +1 -0
- package/dist/utils/base64url.d.ts +4 -2
- package/dist/utils/base64url.js +12 -9
- package/dist/utils/base64url.js.map +1 -0
- package/dist/utils/create-handler.d.ts +11 -7
- package/dist/utils/create-handler.js +393 -217
- package/dist/utils/create-handler.js.map +1 -0
- package/dist/utils/dependency-manager.d.ts +3 -1
- package/dist/utils/dependency-manager.js +67 -69
- package/dist/utils/dependency-manager.js.map +1 -0
- package/dist/utils/go-await.d.ts +3 -1
- package/dist/utils/go-await.js +8 -22
- package/dist/utils/go-await.js.map +1 -0
- package/dist/utils/handle.d.ts +6 -4
- package/dist/utils/handle.js +44 -25
- package/dist/utils/handle.js.map +1 -0
- package/dist/utils/html-renderer.d.ts +3 -1
- package/dist/utils/html-renderer.js +25 -24
- package/dist/utils/html-renderer.js.map +1 -0
- package/dist/utils/index.d.ts +13 -13
- package/dist/utils/index.js +832 -21
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/parsers.d.ts +15 -13
- package/dist/utils/parsers.js +138 -188
- package/dist/utils/parsers.js.map +1 -0
- package/dist/utils/path-matcher.d.ts +3 -1
- package/dist/utils/path-matcher.js +68 -78
- package/dist/utils/path-matcher.js.map +1 -0
- package/dist/utils/request-validator.d.ts +13 -10
- package/dist/utils/request-validator.js +234 -84
- package/dist/utils/request-validator.js.map +1 -0
- package/dist/utils/response.d.ts +9 -7
- package/dist/utils/response.js +93 -102
- package/dist/utils/response.js.map +1 -0
- package/dist/utils/validators/schema-validator.d.ts +13 -9
- package/dist/utils/validators/schema-validator.js +228 -209
- package/dist/utils/validators/schema-validator.js.map +1 -0
- package/dist/utils/validators/schema-validators-ultra.d.ts +15 -12
- package/dist/utils/validators/schema-validators-ultra.js +233 -256
- package/dist/utils/validators/schema-validators-ultra.js.map +1 -0
- package/dist/utils/validators/validators.d.ts +15 -12
- package/dist/utils/validators/validators.js +81 -122
- package/dist/utils/validators/validators.js.map +1 -0
- package/package.json +5 -4
|
@@ -1,27 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
pathname: new URL(req.url).pathname,
|
|
22
|
-
});
|
|
23
|
-
const html = await renderToString(app);
|
|
24
|
-
return new Response(`
|
|
1
|
+
// src/middleware/component-renderer.ts
|
|
2
|
+
var renderVueSSR = async (componentImport, req, preloadedDeps) => {
|
|
3
|
+
try {
|
|
4
|
+
const { createSSRApp, renderToString } = preloadedDeps || await Promise.all([import("vue"), import("@vue/server-renderer")]).then(
|
|
5
|
+
([vue, renderer]) => ({
|
|
6
|
+
createSSRApp: vue.createSSRApp,
|
|
7
|
+
renderToString: renderer.renderToString
|
|
8
|
+
})
|
|
9
|
+
);
|
|
10
|
+
const componentModule = await componentImport();
|
|
11
|
+
const component = componentModule.default || componentModule;
|
|
12
|
+
const app = createSSRApp(component);
|
|
13
|
+
app.provide("routeInfo", {
|
|
14
|
+
params: req.params || {},
|
|
15
|
+
query: Object.fromEntries(new URL(req.url).searchParams),
|
|
16
|
+
pathname: new URL(req.url).pathname
|
|
17
|
+
});
|
|
18
|
+
const html = await renderToString(app);
|
|
19
|
+
return new Response(
|
|
20
|
+
`
|
|
25
21
|
<!doctype html>
|
|
26
22
|
<html>
|
|
27
23
|
<head>
|
|
@@ -40,42 +36,46 @@ const renderVueSSR = async (componentImport, req, preloadedDeps) => {
|
|
|
40
36
|
<script type="module" src="/client.js"></script>
|
|
41
37
|
</body>
|
|
42
38
|
</html>
|
|
43
|
-
`,
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
39
|
+
`,
|
|
40
|
+
{
|
|
41
|
+
headers: { "Content-Type": "text/html; charset=utf-8" }
|
|
42
|
+
}
|
|
43
|
+
);
|
|
44
|
+
} catch (error) {
|
|
45
|
+
console.error("Vue SSR \u6E32\u67D3\u5931\u8D25:", error);
|
|
46
|
+
return new Response(
|
|
47
|
+
`
|
|
50
48
|
<!doctype html>
|
|
51
49
|
<html>
|
|
52
|
-
<head><title
|
|
50
|
+
<head><title>\u6E32\u67D3\u9519\u8BEF</title></head>
|
|
53
51
|
<body>
|
|
54
|
-
<h1>Vue SSR
|
|
55
|
-
<p
|
|
52
|
+
<h1>Vue SSR \u6E32\u67D3\u5931\u8D25</h1>
|
|
53
|
+
<p>\u9519\u8BEF\u4FE1\u606F: ${error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF"}</p>
|
|
56
54
|
</body>
|
|
57
55
|
</html>
|
|
58
|
-
`,
|
|
59
|
-
|
|
56
|
+
`,
|
|
57
|
+
{ status: 500 }
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
60
|
};
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
61
|
+
var renderReactSSR = async (componentImport, req, preloadedDeps) => {
|
|
62
|
+
try {
|
|
63
|
+
const { createElement, renderToString } = preloadedDeps || await Promise.all([import("react"), import("react-dom/server")]).then(
|
|
64
|
+
([react, renderer]) => ({
|
|
65
|
+
createElement: react.createElement,
|
|
66
|
+
renderToString: renderer.renderToString
|
|
67
|
+
})
|
|
68
|
+
);
|
|
69
|
+
const componentModule = await componentImport();
|
|
70
|
+
const Component = componentModule.default || componentModule;
|
|
71
|
+
const content = createElement(Component, {
|
|
72
|
+
req,
|
|
73
|
+
params: req.params || {},
|
|
74
|
+
query: Object.fromEntries(new URL(req.url).searchParams)
|
|
75
|
+
});
|
|
76
|
+
const html = renderToString(content);
|
|
77
|
+
return new Response(
|
|
78
|
+
`
|
|
79
79
|
<!doctype html>
|
|
80
80
|
<html>
|
|
81
81
|
<head>
|
|
@@ -94,39 +94,46 @@ const renderReactSSR = async (componentImport, req, preloadedDeps) => {
|
|
|
94
94
|
<script type="module" src="/client.js"></script>
|
|
95
95
|
</body>
|
|
96
96
|
</html>
|
|
97
|
-
`,
|
|
98
|
-
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
97
|
+
`,
|
|
98
|
+
{
|
|
99
|
+
headers: { "Content-Type": "text/html; charset=utf-8" }
|
|
100
|
+
}
|
|
101
|
+
);
|
|
102
|
+
} catch (error) {
|
|
103
|
+
console.error("React SSR \u6E32\u67D3\u5931\u8D25:", error);
|
|
104
|
+
return new Response(
|
|
105
|
+
`
|
|
104
106
|
<!doctype html>
|
|
105
107
|
<html>
|
|
106
|
-
<head><title
|
|
108
|
+
<head><title>\u6E32\u67D3\u9519\u8BEF</title></head>
|
|
107
109
|
<body>
|
|
108
|
-
<h1>React SSR
|
|
109
|
-
<p
|
|
110
|
+
<h1>React SSR \u6E32\u67D3\u5931\u8D25</h1>
|
|
111
|
+
<p>\u9519\u8BEF\u4FE1\u606F: ${error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF"}</p>
|
|
110
112
|
</body>
|
|
111
113
|
</html>
|
|
112
|
-
`,
|
|
113
|
-
|
|
114
|
+
`,
|
|
115
|
+
{ status: 500 }
|
|
116
|
+
);
|
|
117
|
+
}
|
|
114
118
|
};
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
return await renderVueSSR(componentImport, req, preloadedDeps);
|
|
120
|
-
};
|
|
121
|
-
return next();
|
|
119
|
+
var vueRenderer = (preloadedDeps) => {
|
|
120
|
+
return async (req, next) => {
|
|
121
|
+
req.renderVue = async (componentImport) => {
|
|
122
|
+
return await renderVueSSR(componentImport, req, preloadedDeps);
|
|
122
123
|
};
|
|
124
|
+
return next();
|
|
125
|
+
};
|
|
123
126
|
};
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
return await renderReactSSR(componentImport, req, preloadedDeps);
|
|
129
|
-
};
|
|
130
|
-
return next();
|
|
127
|
+
var reactRenderer = (preloadedDeps) => {
|
|
128
|
+
return async (req, next) => {
|
|
129
|
+
req.renderReact = async (componentImport) => {
|
|
130
|
+
return await renderReactSSR(componentImport, req, preloadedDeps);
|
|
131
131
|
};
|
|
132
|
+
return next();
|
|
133
|
+
};
|
|
132
134
|
};
|
|
135
|
+
export {
|
|
136
|
+
reactRenderer,
|
|
137
|
+
vueRenderer
|
|
138
|
+
};
|
|
139
|
+
//# sourceMappingURL=component-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/middleware/component-renderer.ts"],"sourcesContent":["/**\n * 组件渲染中间件 - 专注 SSR\n * 支持 Vue 和 React 的服务端渲染\n */\n\n// Vue SSR 渲染\nconst renderVueSSR = async (\n componentImport: () => Promise<any>,\n req: Request,\n preloadedDeps?: any,\n) => {\n try {\n // 使用预加载的依赖或动态导入\n const { createSSRApp, renderToString } =\n preloadedDeps ||\n (await Promise.all([import(\"vue\"), import(\"@vue/server-renderer\")]).then(\n ([vue, renderer]) => ({\n createSSRApp: vue.createSSRApp,\n renderToString: renderer.renderToString,\n }),\n ));\n\n const componentModule = await componentImport();\n const component = componentModule.default || componentModule;\n\n const app = createSSRApp(component);\n\n // 提供路由信息\n app.provide(\"routeInfo\", {\n params: (req as any).params || {},\n query: Object.fromEntries(new URL(req.url).searchParams),\n pathname: new URL(req.url).pathname,\n });\n\n const html = await renderToString(app);\n\n return new Response(\n `\n <!doctype html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <title>Vue SSR App</title>\n </head>\n <body>\n <div id=\"app\">${html}</div>\n <script>\n window.__ROUTE_INFO__ = {\n params: ${JSON.stringify((req as any).params || {})},\n query: ${JSON.stringify(Object.fromEntries(new URL(req.url).searchParams))},\n pathname: '${new URL(req.url).pathname}'\n };\n </script>\n <script type=\"module\" src=\"/client.js\"></script>\n </body>\n </html>\n `,\n {\n headers: { \"Content-Type\": \"text/html; charset=utf-8\" },\n },\n );\n } catch (error) {\n console.error(\"Vue SSR 渲染失败:\", error);\n return new Response(\n `\n <!doctype html>\n <html>\n <head><title>渲染错误</title></head>\n <body>\n <h1>Vue SSR 渲染失败</h1>\n <p>错误信息: ${error instanceof Error ? error.message : \"未知错误\"}</p>\n </body>\n </html>\n `,\n { status: 500 },\n );\n }\n};\n\n// React SSR 渲染\nconst renderReactSSR = async (\n componentImport: () => Promise<any>,\n req: Request,\n preloadedDeps?: any,\n) => {\n try {\n // 使用预加载的依赖或动态导入\n const { createElement, renderToString } =\n preloadedDeps ||\n (await Promise.all([import(\"react\"), import(\"react-dom/server\")]).then(\n ([react, renderer]) => ({\n createElement: react.createElement,\n renderToString: renderer.renderToString,\n }),\n ));\n\n const componentModule = await componentImport();\n const Component = componentModule.default || componentModule;\n\n const content = createElement(Component, {\n req,\n params: (req as any).params || {},\n query: Object.fromEntries(new URL(req.url).searchParams),\n });\n\n const html = renderToString(content);\n\n return new Response(\n `\n <!doctype html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <title>React SSR App</title>\n </head>\n <body>\n <div id=\"root\">${html}</div>\n <script>\n window.__ROUTE_INFO__ = {\n params: ${JSON.stringify((req as any).params || {})},\n query: ${JSON.stringify(Object.fromEntries(new URL(req.url).searchParams))},\n pathname: '${new URL(req.url).pathname}'\n };\n </script>\n <script type=\"module\" src=\"/client.js\"></script>\n </body>\n </html>\n `,\n {\n headers: { \"Content-Type\": \"text/html; charset=utf-8\" },\n },\n );\n } catch (error) {\n console.error(\"React SSR 渲染失败:\", error);\n return new Response(\n `\n <!doctype html>\n <html>\n <head><title>渲染错误</title></head>\n <body>\n <h1>React SSR 渲染失败</h1>\n <p>错误信息: ${error instanceof Error ? error.message : \"未知错误\"}</p>\n </body>\n </html>\n `,\n { status: 500 },\n );\n }\n};\n\n// Vue 组件渲染器 - 专注 SSR\nexport const vueRenderer = (preloadedDeps?: any) => {\n return async (req: Request, next: () => Promise<Response>) => {\n (req as any).renderVue = async (componentImport: () => Promise<any>) => {\n return await renderVueSSR(componentImport, req, preloadedDeps);\n };\n return next();\n };\n};\n\n// React 组件渲染器 - 专注 SSR\nexport const reactRenderer = (preloadedDeps?: any) => {\n return async (req: Request, next: () => Promise<Response>) => {\n (req as any).renderReact = async (componentImport: () => Promise<any>) => {\n return await renderReactSSR(componentImport, req, preloadedDeps);\n };\n return next();\n };\n};\n"],"mappings":"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","names":[]}
|
|
@@ -1,10 +1,15 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { ComponentRoute, NestedComponentRoute, FlattenedComponentRoute } from '../types/component-route.js';
|
|
2
|
+
import '../types/route.js';
|
|
3
|
+
import '../types/types.js';
|
|
4
|
+
|
|
2
5
|
/**
|
|
3
6
|
* 扁平化嵌套组件路由
|
|
4
7
|
*/
|
|
5
|
-
|
|
8
|
+
declare function flattenComponentRoutes(routes: (ComponentRoute | NestedComponentRoute)[]): FlattenedComponentRoute[];
|
|
6
9
|
/**
|
|
7
10
|
* 组件路由处理器中间件
|
|
8
11
|
* 自动检测组件类型并应用相应的渲染器
|
|
9
12
|
*/
|
|
10
|
-
|
|
13
|
+
declare const componentRouter: () => (req: Request, next: () => Promise<Response>) => Promise<Response>;
|
|
14
|
+
|
|
15
|
+
export { componentRouter, flattenComponentRoutes };
|
|
@@ -1,42 +1,36 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
else if ("children" in route && route.children) {
|
|
21
|
-
// 这是一个嵌套路由
|
|
22
|
-
for (const child of route.children) {
|
|
23
|
-
processRoute(child, currentPath, currentMiddleware);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
1
|
+
// src/middleware/component-router.ts
|
|
2
|
+
function flattenComponentRoutes(routes) {
|
|
3
|
+
const flattened = [];
|
|
4
|
+
function processRoute(route, parentPath = "", parentMiddleware = []) {
|
|
5
|
+
const currentPath = parentPath + route.path;
|
|
6
|
+
const currentMiddleware = [
|
|
7
|
+
...parentMiddleware,
|
|
8
|
+
...route.middleware || []
|
|
9
|
+
];
|
|
10
|
+
if ("component" in route) {
|
|
11
|
+
flattened.push({
|
|
12
|
+
...route,
|
|
13
|
+
fullPath: currentPath,
|
|
14
|
+
middlewareChain: currentMiddleware
|
|
15
|
+
});
|
|
16
|
+
} else if ("children" in route && route.children) {
|
|
17
|
+
for (const child of route.children) {
|
|
18
|
+
processRoute(child, currentPath, currentMiddleware);
|
|
19
|
+
}
|
|
26
20
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
21
|
+
}
|
|
22
|
+
for (const route of routes) {
|
|
23
|
+
processRoute(route);
|
|
24
|
+
}
|
|
25
|
+
return flattened;
|
|
31
26
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
return next();
|
|
41
|
-
};
|
|
27
|
+
var componentRouter = () => {
|
|
28
|
+
return async (req, next) => {
|
|
29
|
+
return next();
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
export {
|
|
33
|
+
componentRouter,
|
|
34
|
+
flattenComponentRoutes
|
|
42
35
|
};
|
|
36
|
+
//# sourceMappingURL=component-router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/middleware/component-router.ts"],"sourcesContent":["import type {\n ComponentRoute,\n NestedComponentRoute,\n FlattenedComponentRoute,\n} from \"../types/component-route\";\nimport { vueRenderer, reactRenderer } from \"./component-renderer\";\n\n/**\n * 扁平化嵌套组件路由\n */\nexport function flattenComponentRoutes(\n routes: (ComponentRoute | NestedComponentRoute)[],\n): FlattenedComponentRoute[] {\n const flattened: FlattenedComponentRoute[] = [];\n\n function processRoute(\n route: ComponentRoute | NestedComponentRoute,\n parentPath: string = \"\",\n parentMiddleware: any[] = [],\n ) {\n const currentPath = parentPath + route.path;\n const currentMiddleware = [\n ...parentMiddleware,\n ...(route.middleware || []),\n ];\n\n if (\"component\" in route) {\n // 这是一个组件路由\n flattened.push({\n ...route,\n fullPath: currentPath,\n middlewareChain: currentMiddleware,\n });\n } else if (\"children\" in route && route.children) {\n // 这是一个嵌套路由\n for (const child of route.children) {\n processRoute(child, currentPath, currentMiddleware);\n }\n }\n }\n\n for (const route of routes) {\n processRoute(route);\n }\n\n return flattened;\n}\n\n/**\n * 组件路由处理器中间件\n * 自动检测组件类型并应用相应的渲染器\n */\nexport const componentRouter = () => {\n return async (req: Request, next: () => Promise<Response>) => {\n // 这里可以添加组件路由的自动处理逻辑\n // 比如自动检测组件类型,应用相应的渲染器\n return next();\n };\n};\n"],"mappings":";AAUO,SAAS,uBACd,QAC2B;AAC3B,QAAM,YAAuC,CAAC;AAE9C,WAAS,aACP,OACA,aAAqB,IACrB,mBAA0B,CAAC,GAC3B;AACA,UAAM,cAAc,aAAa,MAAM;AACvC,UAAM,oBAAoB;AAAA,MACxB,GAAG;AAAA,MACH,GAAI,MAAM,cAAc,CAAC;AAAA,IAC3B;AAEA,QAAI,eAAe,OAAO;AAExB,gBAAU,KAAK;AAAA,QACb,GAAG;AAAA,QACH,UAAU;AAAA,QACV,iBAAiB;AAAA,MACnB,CAAC;AAAA,IACH,WAAW,cAAc,SAAS,MAAM,UAAU;AAEhD,iBAAW,SAAS,MAAM,UAAU;AAClC,qBAAa,OAAO,aAAa,iBAAiB;AAAA,MACpD;AAAA,IACF;AAAA,EACF;AAEA,aAAW,SAAS,QAAQ;AAC1B,iBAAa,KAAK;AAAA,EACpB;AAEA,SAAO;AACT;AAMO,IAAM,kBAAkB,MAAM;AACnC,SAAO,OAAO,KAAc,SAAkC;AAG5D,WAAO,KAAK;AAAA,EACd;AACF;","names":[]}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
1
|
+
import { Middleware } from '../types/types.js';
|
|
2
|
+
|
|
3
|
+
interface CORSOptions {
|
|
3
4
|
origin?: string[] | "*";
|
|
4
5
|
methods?: string[];
|
|
5
6
|
headers?: string[];
|
|
6
7
|
credentials?: boolean;
|
|
7
8
|
maxAge?: number;
|
|
8
9
|
}
|
|
9
|
-
|
|
10
|
+
declare function createCORS(options?: CORSOptions): Middleware;
|
|
11
|
+
|
|
12
|
+
export { type CORSOptions, createCORS };
|
package/dist/middleware/cors.js
CHANGED
|
@@ -1,30 +1,43 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
1
|
+
// src/middleware/cors.ts
|
|
2
|
+
function createCORS(options = {}) {
|
|
3
|
+
const {
|
|
4
|
+
origin = [],
|
|
5
|
+
methods = ["GET", "POST", "PUT", "DELETE", "OPTIONS"],
|
|
6
|
+
headers = [],
|
|
7
|
+
credentials = false,
|
|
8
|
+
maxAge
|
|
9
|
+
} = options;
|
|
10
|
+
return async (req, next) => {
|
|
11
|
+
const reqOrigin = req.headers.get("Origin") || "";
|
|
12
|
+
const isAllowedOrigin = origin === "*" || origin.includes(reqOrigin);
|
|
13
|
+
if (req.method === "OPTIONS") {
|
|
14
|
+
const resHeaders = new Headers();
|
|
15
|
+
if (isAllowedOrigin) {
|
|
16
|
+
resHeaders.set(
|
|
17
|
+
"Access-Control-Allow-Origin",
|
|
18
|
+
origin === "*" ? "*" : reqOrigin
|
|
19
|
+
);
|
|
20
|
+
resHeaders.set("Access-Control-Allow-Methods", methods.join(","));
|
|
21
|
+
resHeaders.set("Access-Control-Allow-Headers", headers.join(","));
|
|
22
|
+
if (credentials)
|
|
23
|
+
resHeaders.set("Access-Control-Allow-Credentials", "true");
|
|
24
|
+
if (maxAge) resHeaders.set("Access-Control-Max-Age", maxAge.toString());
|
|
25
|
+
}
|
|
26
|
+
return new Response(null, { status: 204, headers: resHeaders });
|
|
27
|
+
}
|
|
28
|
+
const res = await next();
|
|
29
|
+
if (isAllowedOrigin) {
|
|
30
|
+
res.headers.set(
|
|
31
|
+
"Access-Control-Allow-Origin",
|
|
32
|
+
origin === "*" ? "*" : reqOrigin
|
|
33
|
+
);
|
|
34
|
+
if (credentials)
|
|
35
|
+
res.headers.set("Access-Control-Allow-Credentials", "true");
|
|
36
|
+
}
|
|
37
|
+
return res;
|
|
38
|
+
};
|
|
30
39
|
}
|
|
40
|
+
export {
|
|
41
|
+
createCORS
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=cors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/middleware/cors.ts"],"sourcesContent":["import type { Middleware } from \"../types\";\n\nexport interface CORSOptions {\n origin?: string[] | \"*\";\n methods?: string[];\n headers?: string[];\n credentials?: boolean;\n maxAge?: number;\n}\n\nexport function createCORS(options: CORSOptions = {}): Middleware {\n const {\n origin = [],\n methods = [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"OPTIONS\"],\n headers = [],\n credentials = false,\n maxAge,\n } = options;\n\n return async (req, next) => {\n const reqOrigin = req.headers.get(\"Origin\") || \"\";\n\n // 判断:是否为允许的 Origin?\n const isAllowedOrigin = origin === \"*\" || origin.includes(reqOrigin);\n\n // 预检 (OPTIONS) 请求处理\n if (req.method === \"OPTIONS\") {\n const resHeaders = new Headers();\n\n if (isAllowedOrigin) {\n resHeaders.set(\n \"Access-Control-Allow-Origin\",\n origin === \"*\" ? \"*\" : reqOrigin,\n );\n resHeaders.set(\"Access-Control-Allow-Methods\", methods.join(\",\"));\n resHeaders.set(\"Access-Control-Allow-Headers\", headers.join(\",\"));\n if (credentials)\n resHeaders.set(\"Access-Control-Allow-Credentials\", \"true\");\n if (maxAge) resHeaders.set(\"Access-Control-Max-Age\", maxAge.toString());\n }\n\n return new Response(null, { status: 204, headers: resHeaders });\n }\n\n // 正常请求:在 next 后添加头部\n const res = await next();\n\n if (isAllowedOrigin) {\n res.headers.set(\n \"Access-Control-Allow-Origin\",\n origin === \"*\" ? \"*\" : reqOrigin,\n );\n if (credentials)\n res.headers.set(\"Access-Control-Allow-Credentials\", \"true\");\n }\n\n return res;\n };\n}\n"],"mappings":";AAUO,SAAS,WAAW,UAAuB,CAAC,GAAe;AAChE,QAAM;AAAA,IACJ,SAAS,CAAC;AAAA,IACV,UAAU,CAAC,OAAO,QAAQ,OAAO,UAAU,SAAS;AAAA,IACpD,UAAU,CAAC;AAAA,IACX,cAAc;AAAA,IACd;AAAA,EACF,IAAI;AAEJ,SAAO,OAAO,KAAK,SAAS;AAC1B,UAAM,YAAY,IAAI,QAAQ,IAAI,QAAQ,KAAK;AAG/C,UAAM,kBAAkB,WAAW,OAAO,OAAO,SAAS,SAAS;AAGnE,QAAI,IAAI,WAAW,WAAW;AAC5B,YAAM,aAAa,IAAI,QAAQ;AAE/B,UAAI,iBAAiB;AACnB,mBAAW;AAAA,UACT;AAAA,UACA,WAAW,MAAM,MAAM;AAAA,QACzB;AACA,mBAAW,IAAI,gCAAgC,QAAQ,KAAK,GAAG,CAAC;AAChE,mBAAW,IAAI,gCAAgC,QAAQ,KAAK,GAAG,CAAC;AAChE,YAAI;AACF,qBAAW,IAAI,oCAAoC,MAAM;AAC3D,YAAI,OAAQ,YAAW,IAAI,0BAA0B,OAAO,SAAS,CAAC;AAAA,MACxE;AAEA,aAAO,IAAI,SAAS,MAAM,EAAE,QAAQ,KAAK,SAAS,WAAW,CAAC;AAAA,IAChE;AAGA,UAAM,MAAM,MAAM,KAAK;AAEvB,QAAI,iBAAiB;AACnB,UAAI,QAAQ;AAAA,QACV;AAAA,QACA,WAAW,MAAM,MAAM;AAAA,MACzB;AACA,UAAI;AACF,YAAI,QAAQ,IAAI,oCAAoC,MAAM;AAAA,IAC9D;AAEA,WAAO;AAAA,EACT;AACF;","names":[]}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Middleware } from '../types/types.js';
|
|
2
|
+
|
|
2
3
|
interface RateLimitOptions {
|
|
3
4
|
windowMs?: number;
|
|
4
5
|
max?: number;
|
|
5
6
|
keyFn?: (req: Request) => string;
|
|
6
7
|
}
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
declare function rateLimit(options?: RateLimitOptions): Middleware;
|
|
9
|
+
|
|
10
|
+
export { rateLimit };
|
|
@@ -1,33 +1,49 @@
|
|
|
1
|
+
// src/middleware.ts
|
|
2
|
+
var VafastError = class extends Error {
|
|
3
|
+
status;
|
|
4
|
+
type;
|
|
5
|
+
expose;
|
|
6
|
+
constructor(message, options = {}) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.name = "VafastError";
|
|
9
|
+
this.status = options.status ?? 500;
|
|
10
|
+
this.type = options.type ?? "internal_error";
|
|
11
|
+
this.expose = options.expose ?? false;
|
|
12
|
+
if (options.cause) this.cause = options.cause;
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
|
|
1
16
|
// src/middleware/rateLimit.ts
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
return next();
|
|
26
|
-
};
|
|
17
|
+
var store = /* @__PURE__ */ new Map();
|
|
18
|
+
function rateLimit(options = {}) {
|
|
19
|
+
const windowMs = options.windowMs ?? 6e4;
|
|
20
|
+
const max = options.max ?? 30;
|
|
21
|
+
const keyFn = options.keyFn ?? getIP;
|
|
22
|
+
return async (req, next) => {
|
|
23
|
+
const key = keyFn(req);
|
|
24
|
+
const now = Date.now();
|
|
25
|
+
const entry = store.get(key);
|
|
26
|
+
if (entry && entry.expires > now) {
|
|
27
|
+
if (entry.count >= max) {
|
|
28
|
+
throw new VafastError("Too many requests", {
|
|
29
|
+
status: 429,
|
|
30
|
+
type: "rate_limit",
|
|
31
|
+
expose: true
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
entry.count += 1;
|
|
35
|
+
} else {
|
|
36
|
+
store.set(key, { count: 1, expires: now + windowMs });
|
|
37
|
+
}
|
|
38
|
+
return next();
|
|
39
|
+
};
|
|
27
40
|
}
|
|
28
|
-
// Edge 安全的 IP 获取
|
|
29
41
|
function getIP(req) {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
42
|
+
return req.headers.get("cf-connecting-ip") || // Cloudflare
|
|
43
|
+
req.headers.get("x-forwarded-for")?.split(",")[0]?.trim() || // Vercel
|
|
44
|
+
"unknown";
|
|
33
45
|
}
|
|
46
|
+
export {
|
|
47
|
+
rateLimit
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=rateLimit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/middleware.ts","../../src/middleware/rateLimit.ts"],"sourcesContent":["// src/middleware.ts\n\nimport { json, mapResponse } from \"./utils/response\";\n\nimport type { Handler, Middleware } from \"./types\";\n/** 中间件类型:使用 next() 传递给下一个处理 */\n\n/** Vafast 自定义错误类型 */\nexport class VafastError extends Error {\n status: number;\n type: string;\n expose: boolean;\n\n constructor(\n message: string,\n options: {\n status?: number;\n type?: string;\n expose?: boolean;\n cause?: unknown;\n } = {},\n ) {\n super(message);\n this.name = \"VafastError\";\n this.status = options.status ?? 500;\n this.type = options.type ?? \"internal_error\";\n this.expose = options.expose ?? false;\n if (options.cause) (this as any).cause = options.cause;\n }\n}\n\n/**\n * 组合类型: 自动注入错误处理器进行中间件组合\n */\nexport function composeMiddleware(\n middleware: Middleware[],\n finalHandler: Handler,\n): (req: Request) => Promise<Response> {\n const all = [errorHandler, ...middleware];\n\n return function composedHandler(req: Request): Promise<Response> {\n let i = -1;\n\n const dispatch = (index: number): Promise<Response> => {\n if (index <= i)\n return Promise.reject(new Error(\"next() called multiple times\"));\n i = index;\n\n // 中间件阶段\n if (index < all.length) {\n const mw = all[index];\n return Promise.resolve(mw(req, () => dispatch(index + 1)));\n }\n\n // 最终 handler - 使用 mapResponse 转换返回值\n return Promise.resolve(finalHandler(req)).then(mapResponse);\n };\n\n return dispatch(0);\n };\n}\n\n/** 默认包含的全局错误处理器 */\nconst errorHandler: Middleware = async (req, next) => {\n try {\n return await next();\n } catch (err) {\n console.error(\"未处理的错误:\", err);\n\n if (err instanceof VafastError) {\n return json(\n {\n error: err.type,\n message: err.expose ? err.message : \"发生了一个错误\",\n },\n err.status,\n );\n }\n\n return json({ error: \"internal_error\", message: \"出现了一些问题\" }, 500);\n }\n};\n","// src/middleware/rateLimit.ts\n\nimport type { Middleware } from \"../types\";\nimport { VafastError } from \"../middleware\";\n\ninterface RateLimitOptions {\n windowMs?: number; // 限制窗口(毫秒)\n max?: number; // 最大请求数\n keyFn?: (req: Request) => string;\n}\n\ntype Entry = {\n count: number;\n expires: number;\n};\n\nconst store = new Map<string, Entry>();\n\nexport function rateLimit(options: RateLimitOptions = {}): Middleware {\n const windowMs = options.windowMs ?? 60_000; // 默认: 1分钟\n const max = options.max ?? 30;\n const keyFn = options.keyFn ?? getIP;\n\n return async (req, next) => {\n const key = keyFn(req);\n const now = Date.now();\n\n const entry = store.get(key);\n if (entry && entry.expires > now) {\n if (entry.count >= max) {\n throw new VafastError(\"Too many requests\", {\n status: 429,\n type: \"rate_limit\",\n expose: true,\n });\n }\n entry.count += 1;\n } else {\n store.set(key, { count: 1, expires: now + windowMs });\n }\n\n return next();\n };\n}\n\n// Edge 安全的 IP 获取\nfunction getIP(req: Request): string {\n return (\n req.headers.get(\"cf-connecting-ip\") || // Cloudflare\n req.headers.get(\"x-forwarded-for\")?.split(\",\")[0]?.trim() || // Vercel\n \"unknown\"\n );\n}\n"],"mappings":";AAQO,IAAM,cAAN,cAA0B,MAAM;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YACE,SACA,UAKI,CAAC,GACL;AACA,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS,QAAQ,UAAU;AAChC,SAAK,OAAO,QAAQ,QAAQ;AAC5B,SAAK,SAAS,QAAQ,UAAU;AAChC,QAAI,QAAQ,MAAO,CAAC,KAAa,QAAQ,QAAQ;AAAA,EACnD;AACF;;;ACbA,IAAM,QAAQ,oBAAI,IAAmB;AAE9B,SAAS,UAAU,UAA4B,CAAC,GAAe;AACpE,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,MAAM,QAAQ,OAAO;AAC3B,QAAM,QAAQ,QAAQ,SAAS;AAE/B,SAAO,OAAO,KAAK,SAAS;AAC1B,UAAM,MAAM,MAAM,GAAG;AACrB,UAAM,MAAM,KAAK,IAAI;AAErB,UAAM,QAAQ,MAAM,IAAI,GAAG;AAC3B,QAAI,SAAS,MAAM,UAAU,KAAK;AAChC,UAAI,MAAM,SAAS,KAAK;AACtB,cAAM,IAAI,YAAY,qBAAqB;AAAA,UACzC,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AACA,YAAM,SAAS;AAAA,IACjB,OAAO;AACL,YAAM,IAAI,KAAK,EAAE,OAAO,GAAG,SAAS,MAAM,SAAS,CAAC;AAAA,IACtD;AAEA,WAAO,KAAK;AAAA,EACd;AACF;AAGA,SAAS,MAAM,KAAsB;AACnC,SACE,IAAI,QAAQ,IAAI,kBAAkB;AAAA,EAClC,IAAI,QAAQ,IAAI,iBAAiB,GAAG,MAAM,GAAG,EAAE,CAAC,GAAG,KAAK;AAAA,EACxD;AAEJ;","names":[]}
|
package/dist/middleware.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Middleware, Handler } from './types/types.js';
|
|
2
|
+
|
|
2
3
|
/** 中间件类型:使用 next() 传递给下一个处理 */
|
|
3
4
|
/** Vafast 自定义错误类型 */
|
|
4
|
-
|
|
5
|
+
declare class VafastError extends Error {
|
|
5
6
|
status: number;
|
|
6
7
|
type: string;
|
|
7
8
|
expose: boolean;
|
|
@@ -15,4 +16,6 @@ export declare class VafastError extends Error {
|
|
|
15
16
|
/**
|
|
16
17
|
* 组合类型: 自动注入错误处理器进行中间件组合
|
|
17
18
|
*/
|
|
18
|
-
|
|
19
|
+
declare function composeMiddleware(middleware: Middleware[], finalHandler: Handler): (req: Request) => Promise<Response>;
|
|
20
|
+
|
|
21
|
+
export { VafastError, composeMiddleware };
|