@weifuwujs/weifuwu 0.9.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 (122) hide show
  1. package/README.md +605 -0
  2. package/dist/app.d.ts +122 -0
  3. package/dist/app.d.ts.map +1 -0
  4. package/dist/app.js +484 -0
  5. package/dist/app.js.map +1 -0
  6. package/dist/cli.d.ts +3 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +506 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/compose.d.ts +12 -0
  11. package/dist/compose.d.ts.map +1 -0
  12. package/dist/compose.js +29 -0
  13. package/dist/compose.js.map +1 -0
  14. package/dist/env.d.ts +12 -0
  15. package/dist/env.d.ts.map +1 -0
  16. package/dist/env.js +46 -0
  17. package/dist/env.js.map +1 -0
  18. package/dist/group.d.ts +32 -0
  19. package/dist/group.d.ts.map +1 -0
  20. package/dist/group.js +66 -0
  21. package/dist/group.js.map +1 -0
  22. package/dist/helpers.d.ts +37 -0
  23. package/dist/helpers.d.ts.map +1 -0
  24. package/dist/helpers.js +101 -0
  25. package/dist/helpers.js.map +1 -0
  26. package/dist/index.d.ts +15 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +9 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/ioredis.d.ts +16 -0
  31. package/dist/ioredis.d.ts.map +1 -0
  32. package/dist/ioredis.js +42 -0
  33. package/dist/ioredis.js.map +1 -0
  34. package/dist/methods.d.ts +3 -0
  35. package/dist/methods.d.ts.map +1 -0
  36. package/dist/methods.js +10 -0
  37. package/dist/methods.js.map +1 -0
  38. package/dist/middleware/cors.d.ts +24 -0
  39. package/dist/middleware/cors.d.ts.map +1 -0
  40. package/dist/middleware/cors.js +77 -0
  41. package/dist/middleware/cors.js.map +1 -0
  42. package/dist/middleware/index.d.ts +7 -0
  43. package/dist/middleware/index.d.ts.map +1 -0
  44. package/dist/middleware/index.js +4 -0
  45. package/dist/middleware/index.js.map +1 -0
  46. package/dist/middleware/logger.d.ts +27 -0
  47. package/dist/middleware/logger.d.ts.map +1 -0
  48. package/dist/middleware/logger.js +48 -0
  49. package/dist/middleware/logger.js.map +1 -0
  50. package/dist/middleware/static.d.ts +27 -0
  51. package/dist/middleware/static.d.ts.map +1 -0
  52. package/dist/middleware/static.js +150 -0
  53. package/dist/middleware/static.js.map +1 -0
  54. package/dist/node.d.ts +27 -0
  55. package/dist/node.d.ts.map +1 -0
  56. package/dist/node.js +193 -0
  57. package/dist/node.js.map +1 -0
  58. package/dist/path.d.ts +9 -0
  59. package/dist/path.d.ts.map +1 -0
  60. package/dist/path.js +31 -0
  61. package/dist/path.js.map +1 -0
  62. package/dist/postgres.d.ts +19 -0
  63. package/dist/postgres.d.ts.map +1 -0
  64. package/dist/postgres.js +27 -0
  65. package/dist/postgres.js.map +1 -0
  66. package/dist/react-router.d.ts +31 -0
  67. package/dist/react-router.d.ts.map +1 -0
  68. package/dist/react-router.js +25 -0
  69. package/dist/react-router.js.map +1 -0
  70. package/dist/resources.d.ts +35 -0
  71. package/dist/resources.d.ts.map +1 -0
  72. package/dist/resources.js +54 -0
  73. package/dist/resources.js.map +1 -0
  74. package/dist/router.d.ts +30 -0
  75. package/dist/router.d.ts.map +1 -0
  76. package/dist/router.js +122 -0
  77. package/dist/router.js.map +1 -0
  78. package/dist/types.d.ts +124 -0
  79. package/dist/types.d.ts.map +1 -0
  80. package/dist/types.js +2 -0
  81. package/dist/types.js.map +1 -0
  82. package/dist/vite.d.ts +21 -0
  83. package/dist/vite.d.ts.map +1 -0
  84. package/dist/vite.js +101 -0
  85. package/dist/vite.js.map +1 -0
  86. package/dist/websocket/accept.d.ts +22 -0
  87. package/dist/websocket/accept.d.ts.map +1 -0
  88. package/dist/websocket/accept.js +104 -0
  89. package/dist/websocket/accept.js.map +1 -0
  90. package/dist/websocket/close-code.d.ts +22 -0
  91. package/dist/websocket/close-code.d.ts.map +1 -0
  92. package/dist/websocket/close-code.js +35 -0
  93. package/dist/websocket/close-code.js.map +1 -0
  94. package/dist/websocket/connection.d.ts +71 -0
  95. package/dist/websocket/connection.d.ts.map +1 -0
  96. package/dist/websocket/connection.js +287 -0
  97. package/dist/websocket/connection.js.map +1 -0
  98. package/dist/websocket/index.d.ts +7 -0
  99. package/dist/websocket/index.d.ts.map +1 -0
  100. package/dist/websocket/index.js +4 -0
  101. package/dist/websocket/index.js.map +1 -0
  102. package/dist/websocket/types.d.ts +66 -0
  103. package/dist/websocket/types.d.ts.map +1 -0
  104. package/dist/websocket/types.js +2 -0
  105. package/dist/websocket/types.js.map +1 -0
  106. package/docs/ai.md +175 -0
  107. package/docs/data.md +81 -0
  108. package/docs/migrating.md +116 -0
  109. package/docs/react-router.md +187 -0
  110. package/docs/styling.md +69 -0
  111. package/package.json +144 -0
  112. package/templates/react-router/_gitignore +3 -0
  113. package/templates/react-router/app/app.css +1 -0
  114. package/templates/react-router/app/context.ts +4 -0
  115. package/templates/react-router/app/root.tsx +50 -0
  116. package/templates/react-router/app/routes/home.tsx +17 -0
  117. package/templates/react-router/app/routes.ts +3 -0
  118. package/templates/react-router/app/server.ts +29 -0
  119. package/templates/react-router/package.json +29 -0
  120. package/templates/react-router/react-router.config.ts +5 -0
  121. package/templates/react-router/tsconfig.json +19 -0
  122. package/templates/react-router/vite.config.ts +6 -0
package/package.json ADDED
@@ -0,0 +1,144 @@
1
+ {
2
+ "name": "@weifuwujs/weifuwu",
3
+ "version": "0.9.0",
4
+ "description": "A minimal, type-safe fetch full-stack kernel for Node.js: routing, middleware, WebSocket, resources, React Router SSR and CLI.",
5
+ "type": "module",
6
+ "workspaces": [
7
+ "packages/*"
8
+ ],
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js",
15
+ "default": "./dist/index.js"
16
+ },
17
+ "./node": {
18
+ "types": "./dist/node.d.ts",
19
+ "import": "./dist/node.js",
20
+ "default": "./dist/node.js"
21
+ },
22
+ "./middleware": {
23
+ "types": "./dist/middleware/index.d.ts",
24
+ "import": "./dist/middleware/index.js",
25
+ "default": "./dist/middleware/index.js"
26
+ },
27
+ "./react-router": {
28
+ "types": "./dist/react-router.d.ts",
29
+ "import": "./dist/react-router.js",
30
+ "default": "./dist/react-router.js"
31
+ },
32
+ "./postgres": {
33
+ "types": "./dist/postgres.d.ts",
34
+ "import": "./dist/postgres.js",
35
+ "default": "./dist/postgres.js"
36
+ },
37
+ "./ioredis": {
38
+ "types": "./dist/ioredis.d.ts",
39
+ "import": "./dist/ioredis.js",
40
+ "default": "./dist/ioredis.js"
41
+ },
42
+ "./vite": {
43
+ "types": "./dist/vite.d.ts",
44
+ "import": "./dist/vite.js",
45
+ "default": "./dist/vite.js"
46
+ },
47
+ "./package.json": "./package.json"
48
+ },
49
+ "bin": {
50
+ "weifuwu": "./dist/cli.js"
51
+ },
52
+ "files": [
53
+ "dist",
54
+ "templates",
55
+ "docs",
56
+ "README.md"
57
+ ],
58
+ "engines": {
59
+ "node": ">=24.0.0"
60
+ },
61
+ "scripts": {
62
+ "clean": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"",
63
+ "build": "npm run clean && tsc -p tsconfig.build.json && node -e \"require('node:fs').chmodSync('dist/cli.js', 0o755)\"",
64
+ "build:packages": "npm run build --workspaces --if-present",
65
+ "typecheck": "tsc -p tsconfig.json",
66
+ "typecheck:packages": "npm run typecheck --workspaces --if-present",
67
+ "test": "npm run build && npm run test:core && npm run test:fullstack",
68
+ "test:core": "node --test --test-force-exit \"test/core/**/*.test.ts\"",
69
+ "test:fullstack": "node --test --test-force-exit \"test/fullstack/**/*.test.ts\"",
70
+ "test:batteries": "node --test --test-force-exit \"test/batteries/**/*.test.ts\"",
71
+ "test:packages": "npm run build:packages && npm run test --workspaces --if-present",
72
+ "test:all": "npm run build && npm run test:core && npm run test:fullstack && npm run test:batteries && npm run test:packages",
73
+ "test:watch": "node --test --watch \"test/**/*.test.ts\"",
74
+ "prepublishOnly": "npm run typecheck && npm run build && npm test",
75
+ "bench": "npm run build && node scripts/bench.mjs"
76
+ },
77
+ "repository": {
78
+ "type": "git",
79
+ "url": "git+https://github.com/weifuwujs/weifuwu.git"
80
+ },
81
+ "keywords": [
82
+ "fetch",
83
+ "kernel",
84
+ "web-framework",
85
+ "node",
86
+ "typescript",
87
+ "fullstack",
88
+ "ssr",
89
+ "react-router",
90
+ "middleware",
91
+ "router",
92
+ "websocket"
93
+ ],
94
+ "author": "",
95
+ "license": "ISC",
96
+ "bugs": {
97
+ "url": "https://github.com/weifuwujs/weifuwu/issues"
98
+ },
99
+ "homepage": "https://github.com/weifuwujs/weifuwu#readme",
100
+ "dependencies": {
101
+ "@react-router/dev": "^8.4.0",
102
+ "@react-router/node": "^8.4.0",
103
+ "isbot": "^5.1.40",
104
+ "vite": "^8.0.0",
105
+ "ws": "^8.22.0"
106
+ },
107
+ "peerDependencies": {
108
+ "ioredis": ">=5.0.0",
109
+ "postgres": ">=3.4.0",
110
+ "react": ">=19.2.7",
111
+ "react-dom": ">=19.2.7",
112
+ "react-router": "^8.4.0"
113
+ },
114
+ "peerDependenciesMeta": {
115
+ "ioredis": {
116
+ "optional": true
117
+ },
118
+ "postgres": {
119
+ "optional": true
120
+ }
121
+ },
122
+ "devDependencies": {
123
+ "@ai-sdk/openai": "^4.0.82",
124
+ "@ai-sdk/react": "^4.0.126",
125
+ "@tailwindcss/vite": "^4.3.3",
126
+ "@types/node": "^24.0.0",
127
+ "@types/react": "^19.2.0",
128
+ "@types/react-dom": "^19.2.0",
129
+ "@types/ws": "^8.18.2",
130
+ "ai": "^7.0.123",
131
+ "class-variance-authority": "^0.7.1",
132
+ "clsx": "^2.1.1",
133
+ "graphql": "^17.0.2",
134
+ "ioredis": "^6.0.0",
135
+ "postgres": "^3.4.9",
136
+ "react": "^19.2.7",
137
+ "react-dom": "^19.2.7",
138
+ "react-router": "^8.4.0",
139
+ "tailwind-merge": "^3.7.0",
140
+ "tailwindcss": "^4.3.3",
141
+ "typescript": "^5.9.0",
142
+ "zod": "^4.6.5"
143
+ }
144
+ }
@@ -0,0 +1,3 @@
1
+ node_modules/
2
+ build/
3
+ .react-router/
@@ -0,0 +1 @@
1
+ @import 'tailwindcss';
@@ -0,0 +1,4 @@
1
+ import { createContext } from 'react-router'
2
+
3
+ /** 由 weifuwu 中间件注入、在 RR loader 中读取的上下文 */
4
+ export const greetingContext = createContext<string>()
@@ -0,0 +1,50 @@
1
+ import type { ReactNode } from 'react'
2
+ import {
3
+ isRouteErrorResponse,
4
+ Links,
5
+ Meta,
6
+ Outlet,
7
+ Scripts,
8
+ ScrollRestoration,
9
+ } from 'react-router'
10
+ import type { Route } from './+types/root'
11
+ import './app.css'
12
+
13
+ export function Layout({ children }: { children: ReactNode }) {
14
+ return (
15
+ <html lang="zh-CN">
16
+ <head>
17
+ <meta charSet="utf-8" />
18
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
19
+ <Meta />
20
+ <Links />
21
+ </head>
22
+ <body>
23
+ {children}
24
+ <ScrollRestoration />
25
+ <Scripts />
26
+ </body>
27
+ </html>
28
+ )
29
+ }
30
+
31
+ export default function App() {
32
+ return <Outlet />
33
+ }
34
+
35
+ export function ErrorBoundary({ error }: Route.ErrorBoundaryProps) {
36
+ const status = isRouteErrorResponse(error) ? error.status : 500
37
+ const message = isRouteErrorResponse(error)
38
+ ? error.status === 404
39
+ ? 'Not Found'
40
+ : error.statusText
41
+ : error instanceof Error
42
+ ? error.message
43
+ : 'Unknown error'
44
+ return (
45
+ <main>
46
+ <h1>{status}</h1>
47
+ <p>{message}</p>
48
+ </main>
49
+ )
50
+ }
@@ -0,0 +1,17 @@
1
+ import type { Route } from './+types/home'
2
+ import { greetingContext } from '~/context.ts'
3
+
4
+ export function loader({ context }: Route.LoaderArgs) {
5
+ return { greeting: context.get(greetingContext) ?? 'missing-context' }
6
+ }
7
+
8
+ export default function Home({ loaderData }: Route.ComponentProps) {
9
+ return (
10
+ <main className="mx-auto max-w-xl p-8">
11
+ <h1 className="text-3xl font-bold text-blue-600">
12
+ Hello from React Router
13
+ </h1>
14
+ <p className="mt-2 text-gray-600">{loaderData.greeting}</p>
15
+ </main>
16
+ )
17
+ }
@@ -0,0 +1,3 @@
1
+ import { index, type RouteConfig } from '@react-router/dev/routes'
2
+
3
+ export default [index('routes/home.tsx')] satisfies RouteConfig
@@ -0,0 +1,29 @@
1
+ import { createApp, json } from '@weifuwujs/weifuwu'
2
+ import { reactRouter } from '@weifuwujs/weifuwu/react-router'
3
+ import type { Context, Middleware } from '@weifuwujs/weifuwu'
4
+ import { RouterContextProvider } from 'react-router'
5
+ import { greetingContext } from './context.ts'
6
+
7
+ type AppContext = Context & { greeting: string }
8
+
9
+ const withGreeting: Middleware<Context, AppContext> = async (
10
+ request,
11
+ context,
12
+ next,
13
+ ) => next(request, { ...context, greeting: 'hello-from-weifuwu' })
14
+
15
+ export default createApp()
16
+ .use(withGreeting)
17
+ .get('/api/health', () => json({ ok: true }))
18
+ .get('/api/echo', (request) =>
19
+ json({ url: request.url, env: process.env.ECHO_VALUE ?? null }),
20
+ )
21
+ .notFound(
22
+ reactRouter<AppContext>({
23
+ getLoadContext(_request, context) {
24
+ const loadContext = new RouterContextProvider()
25
+ loadContext.set(greetingContext, context.greeting)
26
+ return loadContext
27
+ },
28
+ }),
29
+ )
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "{{name}}",
3
+ "private": true,
4
+ "type": "module",
5
+ "scripts": {
6
+ "dev": "weifuwu dev",
7
+ "build": "weifuwu build",
8
+ "start": "weifuwu start",
9
+ "typegen": "weifuwu typegen",
10
+ "typecheck": "weifuwu typegen && tsc -p tsconfig.json"
11
+ },
12
+ "dependencies": {
13
+ "@weifuwujs/weifuwu": "{{weifuwuVersion}}",
14
+ "isbot": "^5.1.40",
15
+ "react": "^19.2.7",
16
+ "react-dom": "^19.2.7",
17
+ "react-router": "^8.4.0"
18
+ },
19
+ "devDependencies": {
20
+ "@react-router/dev": "^8.4.0",
21
+ "@tailwindcss/vite": "^4.3.3",
22
+ "@types/node": "^24.0.0",
23
+ "@types/react": "^19.2.0",
24
+ "@types/react-dom": "^19.2.0",
25
+ "tailwindcss": "^4.3.3",
26
+ "typescript": "^5.9.0",
27
+ "vite": "^8.0.0"
28
+ }
29
+ }
@@ -0,0 +1,5 @@
1
+ import type { Config } from '@react-router/dev/config'
2
+
3
+ export default {
4
+ ssr: true,
5
+ } satisfies Config
@@ -0,0 +1,19 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "lib": ["DOM", "DOM.Iterable", "ES2022"],
5
+ "module": "ES2022",
6
+ "moduleResolution": "bundler",
7
+ "allowImportingTsExtensions": true,
8
+ "jsx": "react-jsx",
9
+ "strict": true,
10
+ "noEmit": true,
11
+ "skipLibCheck": true,
12
+ "esModuleInterop": true,
13
+ "verbatimModuleSyntax": true,
14
+ "rootDirs": [".", "./.react-router/types"],
15
+ "types": ["node", "vite/client"],
16
+ "paths": { "~/*": ["./app/*"] }
17
+ },
18
+ "include": ["app/**/*", ".react-router/types/**/*"]
19
+ }
@@ -0,0 +1,6 @@
1
+ import { defineConfig } from '@weifuwujs/weifuwu/vite'
2
+ import tailwindcss from '@tailwindcss/vite'
3
+
4
+ export default defineConfig({
5
+ plugins: [tailwindcss()],
6
+ })