weifuwu 0.87.0 → 0.89.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 (392) hide show
  1. package/README.md +111 -135
  2. package/dist/client/components/ActionSheet/ActionSheet.d.ts +1 -1
  3. package/dist/client/components/AiChat/AiChat.d.ts +3 -4
  4. package/dist/client/components/ChatInput/ChatInput.d.ts +5 -0
  5. package/dist/client/components/CitationCard/CitationCard.d.ts +1 -1
  6. package/dist/client/components/Command/Command.d.ts +1 -1
  7. package/dist/client/components/ContextMenu/ContextMenu.d.ts +1 -1
  8. package/dist/client/components/DatePicker/DatePicker.d.ts +1 -1
  9. package/dist/client/components/Dropdown/Dropdown.d.ts +1 -1
  10. package/dist/client/components/Editor/model/html.d.ts +10 -0
  11. package/dist/client/components/ImageCropper/ImageCropper.d.ts +6 -2
  12. package/dist/client/components/Menu/Menu.d.ts +1 -1
  13. package/dist/client/components/NavMenu/NavMenu.d.ts +1 -1
  14. package/dist/client/components/Popconfirm/Popconfirm.d.ts +1 -1
  15. package/dist/client/components/SlideCanvas/SlideCanvas.d.ts +1 -1
  16. package/dist/client/components/Tour/Tour.d.ts +1 -1
  17. package/dist/client/components/TreeSelect/TreeSelect.d.ts +1 -1
  18. package/dist/client/components/index.js +41 -41
  19. package/dist/client/components/style.css +298 -644
  20. package/dist/client/layout/weifuwu-layout.css +286 -640
  21. package/dist/client/vdom/browser/Browser.d.ts +2 -0
  22. package/dist/client/vdom/commands.d.ts +4 -1
  23. package/dist/client/vdom/context/UIContext.d.ts +8 -0
  24. package/dist/client/vdom/core/diff/attrs.d.ts +10 -2
  25. package/dist/client/vdom/core/field/attributes.d.ts +12 -0
  26. package/dist/client/vdom/core/field/events.d.ts +8 -0
  27. package/dist/client/vdom/core/field/input-sync.d.ts +14 -0
  28. package/dist/client/vdom/core/field/key.d.ts +3 -0
  29. package/dist/client/vdom/core/field/props.d.ts +13 -1
  30. package/dist/client/vdom/core/field/ref.d.ts +6 -0
  31. package/dist/client/vdom/core/field/style.d.ts +7 -1
  32. package/dist/client/vdom/core/node/component.d.ts +3 -4
  33. package/dist/client/vdom/core/node/native.d.ts +6 -1
  34. package/dist/client/vdom/core/patch/index.d.ts +24 -1
  35. package/dist/client/vdom/core/patch/processors.d.ts +8 -1
  36. package/dist/client/vdom/core/protocol.d.ts +45 -0
  37. package/dist/client/vdom/core/router.d.ts +7 -0
  38. package/dist/client/vdom/core/ssr/absorb.d.ts +31 -4
  39. package/dist/client/vdom/core/transform/index.d.ts +6 -6
  40. package/dist/client/vdom/core/v2/cycle.d.ts +54 -0
  41. package/dist/client/vdom/core/v2/diff.d.ts +80 -0
  42. package/dist/client/vdom/core/v2/integrate.d.ts +24 -0
  43. package/dist/client/vdom/core/v2/render.d.ts +28 -0
  44. package/dist/client/vdom/core/v2/schedule.d.ts +33 -0
  45. package/dist/client/vdom/core/v2/serve.d.ts +4 -0
  46. package/dist/client/vdom/core/v2/spy.d.ts +21 -0
  47. package/dist/client/vdom/core/v2/ssr.d.ts +14 -0
  48. package/dist/client/vdom/core/vnode.d.ts +9 -6
  49. package/dist/client/vdom/dev/error-counter.d.ts +27 -0
  50. package/dist/client/vdom/dev/render-health.d.ts +60 -0
  51. package/dist/client/vdom/hooks/chat.d.ts +32 -5
  52. package/dist/client/vdom/hooks/drag-media.d.ts +3 -1
  53. package/dist/client/vdom/hooks/env.d.ts +32 -0
  54. package/dist/client/vdom/hooks/popup-manager.d.ts +21 -0
  55. package/dist/client/vdom/hooks/popup.d.ts +4 -1
  56. package/dist/client/vdom/hooks/stable.d.ts +4 -0
  57. package/dist/client/vdom/hooks/use-observable.d.ts +13 -0
  58. package/dist/client/vdom/index.d.ts +14 -6
  59. package/dist/client/vdom/index.js +4 -7
  60. package/dist/client/vdom/jsx-runtime.js +1 -1
  61. package/dist/client/vdom/middlewares/api.d.ts +8 -0
  62. package/dist/client/vdom/middlewares/auth-i18n.d.ts +7 -0
  63. package/dist/client/vdom/middlewares/ws.d.ts +41 -1
  64. package/dist/client/vdom/observable/index.d.ts +13 -0
  65. package/dist/client/vdom/observable/observable.d.ts +26 -0
  66. package/dist/client/vdom/observable/operators.d.ts +76 -0
  67. package/dist/client/vdom/observable/sources.d.ts +54 -0
  68. package/dist/client/vdom/observable/types.d.ts +45 -0
  69. package/dist/client/vdom/store.d.ts +17 -2
  70. package/dist/client/vdom/testing.js +2 -2
  71. package/dist/server/ai/agent.d.ts +18 -0
  72. package/dist/server/ai/client.d.ts +14 -2
  73. package/dist/server/ai/contracts.d.ts +2 -2
  74. package/dist/server/ai/sse.d.ts +6 -0
  75. package/dist/server/core/collect.d.ts +31 -0
  76. package/dist/server/core/error-counter.d.ts +11 -0
  77. package/dist/server/core/hub.d.ts +2 -0
  78. package/dist/server/core/router.d.ts +12 -9
  79. package/dist/server/db/contracts.d.ts +24 -0
  80. package/dist/server/db/memory-redis.d.ts +3 -4
  81. package/dist/server/db/memory-sql.d.ts +20 -4
  82. package/dist/server/db/postgres-server.d.ts +2 -0
  83. package/dist/server/db/query.d.ts +21 -0
  84. package/dist/server/db/redis-server.d.ts +4 -2
  85. package/dist/server/db/sql-parser.d.ts +2 -1
  86. package/dist/server/email/index.d.ts +2 -0
  87. package/dist/server/index.d.ts +4 -1
  88. package/dist/server/index.js +3927 -1982
  89. package/dist/server/messager/index.d.ts +21 -2
  90. package/dist/server/middleware/compress.d.ts +25 -0
  91. package/dist/server/ui/index.d.ts +8 -1
  92. package/dist/server/user/index.d.ts +4 -0
  93. package/dist/shared/router/chain.d.ts +9 -0
  94. package/dist/shared/router/context.d.ts +35 -0
  95. package/dist/shared/router/ctx-fields.d.ts +20 -0
  96. package/dist/shared/router/pipeline.d.ts +70 -0
  97. package/dist/shared/router/trie.d.ts +11 -3
  98. package/dist/shared/router/types.d.ts +23 -0
  99. package/docs/style-guide.md +44 -41
  100. package/package.json +13 -10
  101. package/content/apps/admin.md +0 -55
  102. package/content/apps/agent-platform.md +0 -35
  103. package/content/apps/auth.md +0 -49
  104. package/content/apps/multi.md +0 -44
  105. package/content/apps/todo.md +0 -51
  106. package/content/backend/ai.md +0 -28
  107. package/content/backend/auth.md +0 -20
  108. package/content/backend/email.md +0 -23
  109. package/content/backend/graphql.md +0 -23
  110. package/content/backend/http.md +0 -23
  111. package/content/backend/limit.md +0 -23
  112. package/content/backend/middleware.md +0 -17
  113. package/content/backend/queue.md +0 -23
  114. package/content/backend/redis.md +0 -26
  115. package/content/backend/router.md +0 -23
  116. package/content/backend/schedule.md +0 -23
  117. package/content/backend/sql.md +0 -27
  118. package/content/backend/sse.md +0 -26
  119. package/content/backend/ws.md +0 -26
  120. package/content/capabilities/app-node.md +0 -21
  121. package/content/capabilities/data.md +0 -21
  122. package/content/capabilities/events.md +0 -21
  123. package/content/capabilities/hooks.md +0 -22
  124. package/content/capabilities/i18n.md +0 -21
  125. package/content/capabilities/popup.md +0 -21
  126. package/content/capabilities/render-only.md +0 -23
  127. package/content/capabilities/router.md +0 -22
  128. package/content/capabilities/self-id.md +0 -21
  129. package/content/capabilities/store.md +0 -21
  130. package/content/capabilities/theme.md +0 -21
  131. package/content/capabilities/two-phase.md +0 -21
  132. package/content/components/accordion.md +0 -50
  133. package/content/components/actionsheet.md +0 -46
  134. package/content/components/affix.md +0 -51
  135. package/content/components/aichat.md +0 -57
  136. package/content/components/alert.md +0 -52
  137. package/content/components/alertgroup.md +0 -45
  138. package/content/components/anchor.md +0 -52
  139. package/content/components/app.md +0 -37
  140. package/content/components/approvalcard.md +0 -56
  141. package/content/components/appshell.md +0 -50
  142. package/content/components/aspectratio.md +0 -47
  143. package/content/components/authpage.md +0 -61
  144. package/content/components/autocomplete-v2.md +0 -40
  145. package/content/components/autocomplete.md +0 -56
  146. package/content/components/avatar.md +0 -51
  147. package/content/components/avatargroup.md +0 -47
  148. package/content/components/backtop.md +0 -53
  149. package/content/components/badge.md +0 -55
  150. package/content/components/breadcrumb.md +0 -49
  151. package/content/components/button.md +0 -63
  152. package/content/components/calendar-v2.md +0 -40
  153. package/content/components/calendar.md +0 -50
  154. package/content/components/card.md +0 -58
  155. package/content/components/carousel.md +0 -52
  156. package/content/components/cascader-v2.md +0 -39
  157. package/content/components/cascader.md +0 -54
  158. package/content/components/chart.md +0 -53
  159. package/content/components/chatinput.md +0 -63
  160. package/content/components/checkbox.md +0 -51
  161. package/content/components/checkboxgroup.md +0 -52
  162. package/content/components/citationcard.md +0 -48
  163. package/content/components/codeblock.md +0 -48
  164. package/content/components/codeeditor.md +0 -47
  165. package/content/components/collapse.md +0 -49
  166. package/content/components/colorpicker.md +0 -50
  167. package/content/components/command.md +0 -50
  168. package/content/components/confirm.md +0 -57
  169. package/content/components/contextmenu.md +0 -48
  170. package/content/components/copybutton.md +0 -51
  171. package/content/components/datepicker.md +0 -52
  172. package/content/components/descriptions-v2.md +0 -39
  173. package/content/components/descriptions.md +0 -52
  174. package/content/components/diffview-v2.md +0 -39
  175. package/content/components/diffview.md +0 -50
  176. package/content/components/divider.md +0 -48
  177. package/content/components/drawer.md +0 -55
  178. package/content/components/dropdown.md +0 -53
  179. package/content/components/editor.md +0 -49
  180. package/content/components/emptystate.md +0 -51
  181. package/content/components/exportcsv.md +0 -38
  182. package/content/components/field.md +0 -54
  183. package/content/components/filepreview-office.md +0 -37
  184. package/content/components/filepreview.md +0 -49
  185. package/content/components/filetree.md +0 -56
  186. package/content/components/fileupload-v2.md +0 -39
  187. package/content/components/fileupload.md +0 -57
  188. package/content/components/floatbutton.md +0 -52
  189. package/content/components/form-v2.md +0 -41
  190. package/content/components/form.md +0 -60
  191. package/content/components/grid.md +0 -51
  192. package/content/components/highlight-v2.md +0 -39
  193. package/content/components/highlight.md +0 -46
  194. package/content/components/hovercard.md +0 -51
  195. package/content/components/icon.md +0 -50
  196. package/content/components/imagecropper.md +0 -45
  197. package/content/components/img.md +0 -56
  198. package/content/components/infinitescroll-v2.md +0 -40
  199. package/content/components/infinitescroll.md +0 -54
  200. package/content/components/input.md +0 -65
  201. package/content/components/inputnumber.md +0 -58
  202. package/content/components/inview.md +0 -56
  203. package/content/components/jsonschemaform.md +0 -53
  204. package/content/components/jsonviewer-v2.md +0 -39
  205. package/content/components/jsonviewer.md +0 -49
  206. package/content/components/kanban.md +0 -46
  207. package/content/components/label.md +0 -48
  208. package/content/components/layout.md +0 -54
  209. package/content/components/layoutcontent.md +0 -43
  210. package/content/components/layoutheader.md +0 -43
  211. package/content/components/layoutsider.md +0 -43
  212. package/content/components/link.md +0 -52
  213. package/content/components/list.md +0 -44
  214. package/content/components/loading.md +0 -45
  215. package/content/components/logviewer-v2.md +0 -39
  216. package/content/components/logviewer.md +0 -53
  217. package/content/components/markdown.md +0 -51
  218. package/content/components/markdowneditor.md +0 -47
  219. package/content/components/math.md +0 -42
  220. package/content/components/mentions-v2.md +0 -39
  221. package/content/components/mentions.md +0 -52
  222. package/content/components/menu.md +0 -56
  223. package/content/components/menubar.md +0 -44
  224. package/content/components/messagebubble.md +0 -50
  225. package/content/components/modal.md +0 -59
  226. package/content/components/navmenu.md +0 -47
  227. package/content/components/notification.md +0 -51
  228. package/content/components/pageheader.md +0 -53
  229. package/content/components/pagination.md +0 -49
  230. package/content/components/paragraph.md +0 -45
  231. package/content/components/passwordinput.md +0 -57
  232. package/content/components/pininput-v2.md +0 -39
  233. package/content/components/pininput.md +0 -50
  234. package/content/components/pipeline.md +0 -49
  235. package/content/components/popconfirm.md +0 -58
  236. package/content/components/popover.md +0 -61
  237. package/content/components/progressbar.md +0 -50
  238. package/content/components/prompttemplate.md +0 -49
  239. package/content/components/qrcode.md +0 -50
  240. package/content/components/radiogroup.md +0 -53
  241. package/content/components/rate.md +0 -53
  242. package/content/components/reasoningblock.md +0 -47
  243. package/content/components/relationgraph.md +0 -52
  244. package/content/components/resizable.md +0 -53
  245. package/content/components/result.md +0 -49
  246. package/content/components/scrollbar.md +0 -49
  247. package/content/components/searchinput.md +0 -51
  248. package/content/components/segmentedcontrol.md +0 -59
  249. package/content/components/select-searchable.md +0 -47
  250. package/content/components/select.md +0 -66
  251. package/content/components/sessionlist.md +0 -52
  252. package/content/components/sheetgrid.md +0 -44
  253. package/content/components/skeleton.md +0 -55
  254. package/content/components/slidecanvas.md +0 -44
  255. package/content/components/slider.md +0 -62
  256. package/content/components/sortablelist.md +0 -39
  257. package/content/components/space.md +0 -52
  258. package/content/components/sparkline.md +0 -52
  259. package/content/components/statcard-countdown.md +0 -39
  260. package/content/components/statcard.md +0 -56
  261. package/content/components/steps.md +0 -48
  262. package/content/components/switch.md +0 -50
  263. package/content/components/tabbar.md +0 -45
  264. package/content/components/table-v2.md +0 -40
  265. package/content/components/table.md +0 -66
  266. package/content/components/tabs.md +0 -56
  267. package/content/components/tag.md +0 -51
  268. package/content/components/tagsinput-v2.md +0 -39
  269. package/content/components/tagsinput.md +0 -54
  270. package/content/components/text.md +0 -45
  271. package/content/components/textarea.md +0 -57
  272. package/content/components/themeswitch.md +0 -69
  273. package/content/components/timeline.md +0 -50
  274. package/content/components/title.md +0 -45
  275. package/content/components/toast.md +0 -52
  276. package/content/components/toggle-togglegroup.md +0 -52
  277. package/content/components/togglegroup.md +0 -47
  278. package/content/components/toolcallcard.md +0 -51
  279. package/content/components/tooltip.md +0 -50
  280. package/content/components/tour.md +0 -50
  281. package/content/components/transfer.md +0 -52
  282. package/content/components/tree-v2.md +0 -39
  283. package/content/components/tree.md +0 -59
  284. package/content/components/treeselect.md +0 -54
  285. package/content/components/typography.md +0 -51
  286. package/content/components/videoplayer.md +0 -52
  287. package/content/components/virtuallist.md +0 -52
  288. package/content/components/virtualtable-v2.md +0 -39
  289. package/content/components/virtualtable.md +0 -55
  290. package/content/components/watermark.md +0 -53
  291. package/content/components/wave.md +0 -43
  292. package/content/guides/ai-chat-family.md +0 -24
  293. package/content/guides/choose.md +0 -67
  294. package/content/guides/component-model.md +0 -32
  295. package/content/guides/component-standards.md +0 -123
  296. package/content/guides/components-guide.md +0 -813
  297. package/content/guides/custom-component.md +0 -321
  298. package/content/guides/data-guide.md +0 -281
  299. package/content/guides/file-preview-family.md +0 -18
  300. package/content/guides/frontend.md +0 -968
  301. package/content/guides/layout-choice.md +0 -64
  302. package/content/guides/layout-guide.md +0 -241
  303. package/content/guides/middleware.md +0 -459
  304. package/content/guides/mobile-guide.md +0 -105
  305. package/content/guides/page-building.md +0 -98
  306. package/content/guides/production.md +0 -37
  307. package/content/guides/quality.md +0 -60
  308. package/content/guides/realtime-guide.md +0 -296
  309. package/content/guides/render-only.md +0 -44
  310. package/content/guides/saas-guide.md +0 -253
  311. package/content/guides/server-guide.md +0 -359
  312. package/content/guides/start.md +0 -41
  313. package/content/guides/styling.md +0 -154
  314. package/content/guides/ui-dom-guide.md +0 -157
  315. package/content/index.json +0 -4344
  316. package/content/index.md +0 -181
  317. package/content/layout/align.md +0 -20
  318. package/content/layout/anchor.md +0 -19
  319. package/content/layout/app-shell.md +0 -23
  320. package/content/layout/border.md +0 -20
  321. package/content/layout/center.md +0 -19
  322. package/content/layout/cluster.md +0 -19
  323. package/content/layout/container.md +0 -19
  324. package/content/layout/fill.md +0 -19
  325. package/content/layout/grid.md +0 -19
  326. package/content/layout/hidden.md +0 -22
  327. package/content/layout/layer.md +0 -19
  328. package/content/layout/position.md +0 -22
  329. package/content/layout/row.md +0 -23
  330. package/content/layout/safe-area.md +0 -20
  331. package/content/layout/scroll.md +0 -21
  332. package/content/layout/spacing.md +0 -22
  333. package/content/layout/split.md +0 -19
  334. package/content/layout/stack.md +0 -19
  335. package/content/layout/surface.md +0 -23
  336. package/content/layout/text.md +0 -22
  337. package/content/patterns/app-shell.md +0 -34
  338. package/content/patterns/dashboard.md +0 -36
  339. package/content/patterns/data-screen.md +0 -30
  340. package/content/patterns/detail-page.md +0 -31
  341. package/content/patterns/docs.md +0 -34
  342. package/content/patterns/focus-task.md +0 -34
  343. package/content/patterns/landing.md +0 -35
  344. package/content/patterns/list-page.md +0 -32
  345. package/content/patterns/mobile.md +0 -31
  346. package/content/patterns/settings-page.md +0 -33
  347. package/content/patterns/workspace.md +0 -32
  348. package/dist/cli/content-sync.test.d.ts +0 -1
  349. package/dist/cli/docs-cli.test.d.ts +0 -1
  350. package/dist/cli/docs.d.ts +0 -2
  351. package/dist/cli/docs.mjs +0 -10961
  352. package/dist/client/vdom/core/build.d.ts +0 -36
  353. package/dist/client/vdom/core/diff/children.d.ts +0 -29
  354. package/dist/client/vdom/core/diff/index.d.ts +0 -22
  355. package/dist/client/vdom/core/diff/output.d.ts +0 -30
  356. package/dist/client/vdom/core/diff/same.d.ts +0 -22
  357. package/dist/client/vdom/core/serve.d.ts +0 -75
  358. package/dist/client/vdom/core/ssr/index.d.ts +0 -25
  359. package/examples/apps/admin/README.md +0 -23
  360. package/examples/apps/admin/api.ts +0 -27
  361. package/examples/apps/admin/app.tsx +0 -144
  362. package/examples/apps/admin/main.tsx +0 -8
  363. package/examples/apps/admin/server.ts +0 -37
  364. package/examples/apps/auth/README.md +0 -23
  365. package/examples/apps/auth/api.ts +0 -49
  366. package/examples/apps/auth/app.tsx +0 -137
  367. package/examples/apps/auth/main.tsx +0 -8
  368. package/examples/apps/auth/server.ts +0 -37
  369. package/examples/apps/multi/README.md +0 -23
  370. package/examples/apps/multi/app.tsx +0 -83
  371. package/examples/apps/multi/main.tsx +0 -8
  372. package/examples/apps/multi/server.ts +0 -33
  373. package/examples/apps/todo/README.md +0 -23
  374. package/examples/apps/todo/api.ts +0 -26
  375. package/examples/apps/todo/app.tsx +0 -128
  376. package/examples/apps/todo/main.tsx +0 -9
  377. package/examples/apps/todo/server.ts +0 -39
  378. package/examples/hello-world/README.md +0 -9
  379. package/examples/hello-world/client.ts +0 -14
  380. package/examples/hello-world/routes.tsx +0 -26
  381. package/examples/hello-world/server.ts +0 -46
  382. package/examples/patterns/AppShell.tsx +0 -224
  383. package/examples/patterns/Dashboard.tsx +0 -153
  384. package/examples/patterns/DataScreen.tsx +0 -104
  385. package/examples/patterns/DetailPage.tsx +0 -79
  386. package/examples/patterns/Docs.tsx +0 -105
  387. package/examples/patterns/FocusTask.tsx +0 -67
  388. package/examples/patterns/Landing.tsx +0 -90
  389. package/examples/patterns/ListPage.tsx +0 -77
  390. package/examples/patterns/Mobile.tsx +0 -154
  391. package/examples/patterns/SettingsPage.tsx +0 -98
  392. package/examples/patterns/SplitWorkspace.tsx +0 -113
@@ -53,9 +53,19 @@ export type CreateConversationInput = {
53
53
  };
54
54
  /** 实时事件(业务事件对象,如 { type: 'new_message', ... }) */
55
55
  export type MsgEvent = Record<string, unknown>;
56
+ /** handler 可选鉴权注入(M15——2027-XX) */
57
+ export interface MessagerHandlerOptions {
58
+ /** WS 握手 token 验证(query ?token=)——返回 { sub } 或 null(null = 拒绝) */
59
+ verifyToken?: (token: string) => Promise<{
60
+ sub: string;
61
+ } | null>;
62
+ /** 订阅授权(已验证 userId + room)——false 拒绝订阅(发 error 事件);不传 = 全允许 */
63
+ authorizeRoom?: (userId: string, room: string) => boolean | Promise<boolean>;
64
+ }
56
65
  export interface MessagerClient {
57
- /** 标准 WS 协议 handler(connected/subscribe/unsubscribe/ping/pong),供 app.ws(path, ...) */
58
- handler: () => WebSocketHandler;
66
+ /** 标准 WS 协议 handler(connected/subscribe/unsubscribe/ping/pong),供 app.ws(path, ...)
67
+ * opts.verifyToken/authorizeRoom 注入鉴权(M15——原升级不跑中间件——任意客户端可订阅任意房间) */
68
+ handler: (opts?: MessagerHandlerOptions) => WebSocketHandler;
59
69
  /** 房间广播(本地 + Redis 跨进程;room 约定 `conv:{id}` / `user:{id}`) */
60
70
  broadcast: (room: string, event: MsgEvent) => void;
61
71
  /** 用户维度点对点(内部 room `user:{id}`) */
@@ -96,6 +106,15 @@ export interface MessagerSystem extends Middleware<Context, Context & MessagerIn
96
106
  }
97
107
  export interface MessagerOptions {
98
108
  sql: SqlClient;
109
+ /**
110
+ * 连接级事务(传 `pg.transaction` / `pool.begin`)——提供时会话创建原子。
111
+ * 不传 → 裸执行(回退面:成员 insert 失败时孤儿会话——低影响;并发唯一性由
112
+ * M9 direct_key 唯一约束兜底)。
113
+ * M10(2027-XX):原实现 sql.unsafe('BEGIN'/'COMMIT') 在连接池下断裂——
114
+ * pool.query 每条 acquire/release 任意连接(BEGIN 在 A、INSERT 在 B、COMMIT 在 C)
115
+ * ——`pool.begin` 才是连接亲和的正途。
116
+ */
117
+ transaction?: <T>(fn: (sql: SqlClient) => Promise<T>) => Promise<T>;
99
118
  /** Redis(可选:多进程广播/实时推送需要;不传则仅本进程内广播)——
100
119
  * 传 `redis().redis`(中间件)或 `new RedisPool()`/`RedisPool.create()` */
101
120
  redis?: Redis;
@@ -0,0 +1,25 @@
1
+ /**
2
+ * weifuwu/compress — 响应压缩中间件(SERVER-PERF-PLAN S7——波次 3)
3
+ *
4
+ * br 优先 → gzip 兜底(Accept-Encoding 协商);阈值默认 1KB(小响应压缩得不偿失);
5
+ * content-type 白名单(文本类);SSE(text/event-stream)跳过——流式逐 token 推送
6
+ * 不被缓冲化。流式压缩:response.body 管道经 zlib 转换流——不在内存攒全量(与
7
+ * sendResponse 背压机制衔接——SERVER-PERF-PLAN S1)。
8
+ *
9
+ * 诚实裁剪:❌ zstd(node 内置支持面未稳)、❌ 动态字典、❌ 静态压缩
10
+ * (serveStatic 预压缩探测覆盖——S8)。
11
+ *
12
+ * ```ts
13
+ * import { compress } from 'weifuwu'
14
+ * app.use(compress()) // 默认阈值 1KB
15
+ * app.use(compress({ threshold: 0 })) // 全部压缩
16
+ * ```
17
+ */
18
+ import type { Context, Middleware } from '../types.ts';
19
+ export interface CompressOptions {
20
+ /** 最小压缩字节数(Content-Length 判定;未知长度按需压缩)。默认 1024。 */
21
+ threshold?: number;
22
+ /** 压缩级别(gzip level / brotli quality)。默认 zlib 默认值。 */
23
+ level?: number;
24
+ }
25
+ export declare function compress(options?: CompressOptions): Middleware<Context, Context>;
@@ -53,5 +53,12 @@ interface UiHtmlTag {
53
53
  (strings: TemplateStringsArray, ...values: unknown[]): Response;
54
54
  unsafe: (s: string) => string;
55
55
  }
56
- export declare function ui(): Middleware;
56
+ export interface UiOptions {
57
+ /**
58
+ * 编译产物缓存。默认 true。
59
+ * false = 每请求重新编译(旧行为等价——永远新鲜,a29efec3 语义保留逃生舱)。
60
+ */
61
+ cache?: boolean;
62
+ }
63
+ export declare function ui(options?: UiOptions): Middleware;
57
64
  export {};
@@ -64,6 +64,10 @@ export interface RegisterInput {
64
64
  email: string;
65
65
  password: string;
66
66
  name?: string;
67
+ /**
68
+ * @deprecated B5.2(2027-XX):自助注册忽略自赋 role(入库恒 null)——
69
+ * 授权一律走应用成员表 role(防假 admin);平台 profile role 由应用层管理。
70
+ */
67
71
  role?: string;
68
72
  /** 兼容旧单层模型:注册即绑定应用(新三层模型请用 createApp/registerInApp) */
69
73
  tenant?: string;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * 中间件链执行(SHARED-TRIE-EXCELLENCE B0——2027-10 自 server/core/chain.ts
3
+ * 移入 shared——**前端获得 middleware 能力**(机制就位——路由内核
4
+ * dispatchRouter 的 resolveHandler 钩子消费))
5
+ *
6
+ * next() 重复调用守卫在案(called 标志——server 路由测试锁定 500 语义)。
7
+ */
8
+ import type { SharedHandler, SharedMiddleware } from './types.ts';
9
+ export declare function runChain<TCtx>(mws: SharedMiddleware<TCtx>[], finalHandler: SharedHandler<TCtx>, req: Request, ctx: TCtx): Promise<Response>;
@@ -0,0 +1,35 @@
1
+ /**
2
+ * 请求目标解析 + ctx 注入纯函数(SHARED-TRIE-EXCELLENCE B1——2027-10)
3
+ *
4
+ * **双端重复面收敛**(盘点实证:URL→segments 三处重复、query 注入
5
+ * 双端同式、params fresh 语义等价实现分散)——单一实现源:
6
+ * - server:handler() / serve.ts createRequest
7
+ * - client:UIRouter.resolve / has
8
+ *
9
+ * **URIError 防御双端统一**:param 段 decodeURIComponent 对非法编码
10
+ * (%zz)抛 URIError——非法编码 URL 是客户端错误 → 400 信号
11
+ * (server C3 修复迁移至此——client 同享——双端 400 语义一致)。
12
+ */
13
+ /** 解析结果——ok=false 时 reason 分类(400 响应由调用方构造) */
14
+ export type RequestTarget = {
15
+ ok: true;
16
+ segments: string[];
17
+ pathname: string;
18
+ query: Record<string, string>;
19
+ } | {
20
+ ok: false;
21
+ reason: 'malformed-encoding' | 'invalid-url';
22
+ };
23
+ /**
24
+ * Request → 匹配输入(segments/pathname/query 一次拿全——零二次解析)。
25
+ * URIError(非法 percent-encoding)→ { ok: false, reason: 'malformed-encoding' }
26
+ * ——**不抛出**(调用方按 400 分类——双端统一语义)。
27
+ */
28
+ export declare function parseRequestTarget(req: Request): RequestTarget;
29
+ /** fresh params(match.params 克隆——**不残留旧路由键**——client 契约
30
+ * 语义(params 每次渲染替换)单一实现源) */
31
+ export declare function freshParams(match?: {
32
+ params: Record<string, string>;
33
+ } | null): Record<string, string>;
34
+ /** query 提取(Object.fromEntries(searchParams)——双端同一实现源) */
35
+ export declare function parseQuery(url: URL): Record<string, string>;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * ctx 字段注册表(SHARED-TRIE-EXCELLENCE B0'——2027-10)
3
+ *
4
+ * **ctx 扩展机制双端统一**(用户论证:「前后端都是通过扩展 ctx.xxx
5
+ * 提供新能力,只是扩展的能力不一样」)——middleware 声明 injects(注入
6
+ * 字段)/depends(依赖字段)——依赖未注册抛错(含注册引导文案)。
7
+ *
8
+ * - server:Router._checkMiddlewareMeta 迁移消费(行为零变化——
9
+ * global/route/mount 三位置检查语义保留)
10
+ * - client:获得同一机制(UIContext declare module 类型增强的运行时
11
+ * 对应——未来前端中间件声明 injects 同样受检)——类型/运行时双层对齐
12
+ */
13
+ export interface CtxFieldRegistry {
14
+ /** 登记注入字段(injects——provider 中间件先行注册) */
15
+ register(injects: string[]): void;
16
+ /** 依赖检查(depends——未注册抛错,含 app.use(xxx()) 引导) */
17
+ check(depends: string[], location: string): void;
18
+ has(field: string): boolean;
19
+ }
20
+ export declare function createCtxFieldRegistry(): CtxFieldRegistry;
@@ -0,0 +1,70 @@
1
+ /**
2
+ * 路由内核——流程骨架 + 差异钩子(SHARED-TRIE-EXCELLENCE B0——2027-10)
3
+ *
4
+ * **机制公用、实现不一样**(用户论证采纳——handler 签名双端同构 +
5
+ * 流程 6 步中 3 步完全同构、3 步是差异点而非不同流程):
6
+ *
7
+ * ```
8
+ * dispatchRouter 流程骨架(单一实现源——改一处双端生效):
9
+ * 1. parseRequestTarget(URIError → 400 信号——双端统一防御)
10
+ * 2. trieMatch(shared Trie——静态/param/通配——回溯语义在案)
11
+ * 3. enrichCtx(ctx 扩展——机制一致能力不同)
12
+ * 4. resolveHandler(verb 差异点:server method 表 / client 直调)
13
+ * 5. run → onRouteSuccess(恢复清出)| catch → onError
14
+ * 6. 404/405 兜底(形态差异钩子化)
15
+ * ```
16
+ *
17
+ * **双端类 API 零变化**:Router.handler() / UIRouter.resolve() 内部
18
+ * 换 dispatchRouter——405/Allow/去重收敛 serverPipeline;route 注入/
19
+ * 前端 404 收敛 clientPipeline;serve(Request/Response 编解码边界)
20
+ * 留双端——pipeline 不关心。
21
+ */
22
+ import { type TrieNode } from './trie.ts';
23
+ /** 匹配结果(trieMatch 返回 + verb 分类的输入载荷) */
24
+ export interface RouteMatch<TValue> {
25
+ value: TValue;
26
+ params: Record<string, string>;
27
+ wildcard: boolean;
28
+ }
29
+ export interface RouterPipeline<TValue, TCtx> {
30
+ /**
31
+ * **verb 差异点**(负载 → 实际执行闭包):
32
+ * - server:value 是 method 表——method 查找 + HEAD fallback(mw 联动)
33
+ * + 405 分类 + runChain 链组装(globalMws + routeMws)
34
+ * - client:value 是 PageHandler——直调闭包
35
+ */
36
+ resolveHandler(m: RouteMatch<TValue>, req: Request, ctx: TCtx): {
37
+ kind: 'route';
38
+ run: () => Response | Promise<Response>;
39
+ }
40
+ /** method 表分类(405 Allow 头)——server 独有 */
41
+ | {
42
+ kind: 'not-allowed';
43
+ methods: string[];
44
+ }
45
+ /** 通配命中但 method 落空 → 404(通配不产生 405——探针实证锁死) */
46
+ | {
47
+ kind: 'not-found';
48
+ };
49
+ /** 404 兜底(server: JSON + globalMws 链;client: notFound ?? null body) */
50
+ onNotFound(req: Request, ctx: TCtx, path: string): Response | Promise<Response>;
51
+ /** 405 兜底(server 实现——globalMws 链 + Allow 头;client 不实现) */
52
+ onMethodNotAllowed?(methods: string[], req: Request, ctx: TCtx, path: string): Response | Promise<Response>;
53
+ /** 错误语义(server: onError 优先/HttpError/去重计数;client 可缺省直抛) */
54
+ onError?(e: unknown, req: Request, ctx: TCtx, path: string): Response | Promise<Response>;
55
+ /** 路由成功完成(server: 恢复清出错误状态——再错再报;client 可缺省) */
56
+ onRouteSuccess?(req: Request, ctx: TCtx, path: string): void;
57
+ /**
58
+ * **ctx 扩展钩子**(机制一致能力不同):
59
+ * - server:params merge 进既有 ctx.params(Object.assign 语义)
60
+ * - client:params fresh + query + ctx.route 三面注入
61
+ * - 404(m null)时也执行——client notFound handler 收到空 params +
62
+ * query + route(原语义精确保留)
63
+ */
64
+ enrichCtx?(ctx: TCtx, m: RouteMatch<TValue> | null, pathname: string, query: Record<string, string>): void;
65
+ }
66
+ /**
67
+ * **路由分发流程骨架**——双端 Router 的内核(机制公用、实现不一样)。
68
+ * 差异全部在 pipeline 钩子——骨架只编排顺序与错误边界。
69
+ */
70
+ export declare function dispatchRouter<TValue, TCtx>(root: TrieNode<TValue>, pipeline: RouterPipeline<TValue, TCtx>, req: Request, ctx: TCtx): Promise<Response>;
@@ -47,11 +47,19 @@ export declare function trieFind<T>(root: TrieNode<T>, path: string): TrieNode<T
47
47
  * '/'(空段)→ value 绑 root;'*' 结尾 → wildcardValue(独立槽);
48
48
  * 其余逐段 getOrCreateChild——终点绑 value。返回终点节点(冲突检查)。
49
49
  */
50
- export declare function trieRegister<T>(root: TrieNode<T>, path: string, value: T, isWildcardValue?: boolean): TrieNode<T>;
50
+ /**
51
+ * 注册(path → value)——分段插入:
52
+ * '/'(空段)→ value 绑 root;'*' 结尾 → wildcardValue(独立槽——
53
+ * **path 自描述**——SHARED-TRIE D1 收紧:原 isWildcardValue 参数与
54
+ * 内部 path.includes('*') 判定重复(恒真验证:生产调用面 isWildcard =
55
+ * path.includes('*')——第三态零消费——参数删除));
56
+ * 其余逐段 getOrCreateChild——终点绑 value。返回终点节点(冲突检查)。
57
+ */
58
+ export declare function trieRegister<T>(root: TrieNode<T>, path: string, value: T): TrieNode<T>;
51
59
  /**
52
60
  * 匹配(segments → { value, params, wildcard } | null):
53
- * 精确优先(静态 → :param 逐段)——段失败或终端无 value → 通配兜底
54
- * (从 root 沿路径检查任意前缀深度的通配注册——params['*'] = 剩余段);
61
+ * 精确优先(DFS——静态 → :param 回溯——见 exactDfs)——精确未命中 → 通配
62
+ * 兜底(从 root 沿路径检查任意前缀深度的通配注册——params['*'] = 剩余段);
55
63
  * 精确命中且节点有通配槽('/' + '/*' 并存)→ params['*'] = ''(精确优先标记)。
56
64
  */
57
65
  export declare function trieMatch<T>(root: TrieNode<T>, segments: string[]): {
@@ -0,0 +1,23 @@
1
+ /**
2
+ * shared router 类型(SHARED-TRIE-EXCELLENCE B0——2027-10)
3
+ *
4
+ * **双端同构的机制形状**(server/types.ts 与 client PageHandler 字面同构——
5
+ * handler 签名 `(req: Request, ctx) => Response`、middleware洋葱
6
+ * `(req, ctx, next) => Response`——单一实现源)。server/types.ts 可
7
+ * re-export(D 波次收紧时统一)——当前结构类型兼容并存。
8
+ */
9
+ /** 路由 handler——双端签名同构(req 标准 Request 零扩展;Response 原生) */
10
+ export type SharedHandler<TCtx = unknown> = (req: Request, ctx: TCtx) => Response | Promise<Response>;
11
+ /** 中间件——洋葱模型(next 调用透传——可短路可改写响应) */
12
+ export type SharedMiddleware<TCtx = unknown> = (req: Request, ctx: TCtx, next: SharedHandler<TCtx>) => Response | Promise<Response>;
13
+ /** middleware 元信息(ctx 扩展声明——depends 必须先注册/injects 登记字段) */
14
+ export interface MiddlewareMeta {
15
+ /** Fields this middleware injects into ctx. */
16
+ injects: string[];
17
+ /** Fields this middleware depends on (must be injected earlier). */
18
+ depends: string[];
19
+ }
20
+ /** 带 meta 的 middleware(__meta 可选——ctx-fields 注册表检查依据) */
21
+ export type MetaMiddleware<TCtx = unknown> = SharedMiddleware<TCtx> & {
22
+ __meta?: MiddlewareMeta;
23
+ };
@@ -15,28 +15,31 @@ weifuwu 的设计语言与框架哲学同源(确定性、诚实裁剪、render
15
15
  | 4 | **专业** Instrumental | 面向 AI 应用/管理后台/数据工具:键盘可达、数据密度、三态完整 | 键盘焦点全局;compact 预设;加载/空/错误三态规范 |
16
16
  | 5 | **中文原生** CJK-Native | 字阶/行高/断行针对中文;表头不做 uppercase;数字防抖 | `--wf-heading-case: none`;`wf-nums`(tabular-nums) |
17
17
 
18
- 主题配置三档(详见 [content/guides/styling.md](styling.md)):**① 改 `--wf-brand-seed` 一个值换肤**(色阶 color-mix 自动派生,暗色自动跟随)→ **② `<html data-preset="minimal|compact|rounded">` 预设**(与 data-theme 正交)→ **③ 深度定制**(组件钩子 + @layer 覆盖)。
18
+ 主题配置三档:**① 改 `--wf-brand-seed` 一个值换肤**(色阶 color-mix 自动派生,暗色自动跟随)→ **② `<html data-preset="minimal|compact|rounded">` 预设**(与 data-theme 正交)→ **③ 深度定制**(组件钩子 + @layer 覆盖)。
19
19
 
20
- ## 统一语法:`wf-<域>-<名字>`
20
+ ## 统一命名规则:三类词根 + 三后缀(design/layout-naming.md)
21
21
 
22
- 所有类遵循一个规则:`wf-` + **域** + 名字。
22
+ 类名零猜词——单属性工具直接用 **CSS 属性名**(会 CSS 即会写),
23
+ 组合原语用**意图词汇**(表达要什么)。命名只有一种推导路径:
23
24
 
24
- | 域 | 例子 | 说明 |
25
+ | 词根类 | 判定 | 例 |
25
26
  |---|---|---|
26
- | `layout`(布局原语) | `wf-layout-stack` `wf-layout-split` `wf-layout-grid` | 元素之间的空间关系 |
27
- | `p/m/gap/w/h`(间距尺寸) | `wf-p-md` `wf-mt-lg` `wf-gap-sm` `wf-w-full` | padding/margin/gap/width/height |
28
- | `border/rounded`(边框圆角) | `wf-border-b` `wf-rounded-md` `wf-pill` | |
29
- | `bg/text/weight/leading/align/tracking`(视觉) | `wf-bg-primary` `wf-text-secondary` `wf-weight-semibold` `wf-leading-base` | |
30
- | `btn/card/modal/…`(组件域) | `wf-btn--primary` `wf-card--hover` | 组件由 props 渲染,一般不需手写 |
27
+ | 概念原语 | 复合语义(≠单属性) | `wf-stack` `wf-row` `wf-grid` `wf-split` `wf-center` `wf-surface` |
28
+ | 属性根 | 单一 CSS 属性 → 属性全名 | `wf-padding-md` `wf-margin-top-sm` `wf-radius-md` `wf-justify-between` `wf-overflow-auto` |
29
+ | 裸值词 | 单值状态/行为 | `wf-bold` `wf-uppercase` `wf-truncate` `wf-dim` `wf-pill` `wf-hidden` |
31
30
 
32
- **修饰符号**:
31
+ **后缀语法(三种,各管一事)**:
33
32
  ```
34
- wf-card--active -- = 变体/状态(选中/激活/hover)
35
- wf-modal-header - = 子元素(组件内部结构,不手写)
36
- wf-layout-stack@md @ = 断点变体(≥768px 时横向)
33
+ wf-padding-md - 值/子名(刻度:none|xs|sm|md|lg|xl;方向:全词 top/bottom/left/right/x/y)
34
+ wf-bubble--own -- 变体/状态(选中/激活)
35
+ wf-flex@lg @ 断点变体(≥1024px)
37
36
  ```
38
37
 
39
- **值类(裸词)**:单值工具没有属性域——`wf-uppercase` `wf-truncate` `wf-pre-wrap` `wf-dim` `wf-pill`。
38
+ **值词汇封闭表**:标尺 `none~xl`(none = 零/取消唯一形态)·对齐用 CSS 值词
39
+ `start/center/end/stretch/between`(物理方向词禁入对齐域)·颜色语义随 token。
40
+
41
+ 域前缀分域(无过载):`wf-font-*` 字号 · `wf-text-*` 文字颜色/对齐 ·
42
+ `wf-bg-*` 背景 · `wf-medium/semibold/bold` 字重裸词 · `btn/card/modal/…` 组件域(由 props 渲染,一般不需手写)。
40
43
 
41
44
  ## 三档学习路径
42
45
 
@@ -50,24 +53,24 @@ wf-layout-stack@md @ = 断点变体(≥768px 时横向)
50
53
  <Card hover><StatCard value="1,234" label="总用户" /></Card>
51
54
  ```
52
55
 
53
- ### 第二档:10 个核心原语(半小时,覆盖 90% 页面)
56
+ ### 第二档:10 个核心原语(半小时,覆盖 90% 页面——消费审计实证热集)
54
57
 
55
58
  ```
56
- wf-layout-stack 垂直堆叠 + gap
57
- wf-layout-row 水平排列 + wrap
58
- wf-layout-split 两端分布
59
- wf-layout-fill flex: 1 撑满
60
- wf-gap-md 设置间距(配合上面)
61
- wf-p-md 内边距
62
- wf-text-secondary 次级文字
63
- wf-bg-primary 品牌浅底
64
- wf-border-b 下边框
65
- wf-rounded-md 圆角
59
+ wf-stack 垂直堆叠 + gap(第一原语)
60
+ wf-row 水平排列 + wrap + gap
61
+ wf-gap-sm 设置间距(配合上面)
62
+ wf-fill flex:1 撑满(配 wf-min-width-0 防溢出)
63
+ wf-padding-md 内边距
64
+ wf-font-sm 字号(小字)
65
+ wf-text-secondary 次级文字色(第二档唯一需要记的颜色词)
66
+ wf-justify-between 两端分布
67
+ wf-border-bottom 下边框
68
+ wf-radius-md 圆角
66
69
  ```
67
70
 
68
71
  ```tsx
69
- <div class="wf-layout-split">
70
- <div class="wf-layout-row wf-gap-md">
72
+ <div class="wf-justify-between">
73
+ <div class="wf-row wf-gap-md">
71
74
  <Card>…</Card>
72
75
  </div>
73
76
  <Button variant="primary">提交</Button>
@@ -76,24 +79,25 @@ wf-rounded-md 圆角
76
79
 
77
80
  ### 第三档:完整速查(按需查 IDE 补全)
78
81
 
79
- 输入 `wf-layout-` / `wf-text-` / `wf-bg-` 弹出全部候选。完整清单见 README「布局系统」。
82
+ 输入 `wf-` 后按词根补全(`wf-padding-` / `wf-text-` / `wf-bg-`)。完整清单见 README「布局系统」。
80
83
 
81
84
  ## 场景速查("我要做什么")
82
85
 
83
86
  | 需求 | 写法 |
84
87
  |---|---|
85
- | 两个元素两端分布 | `wf-layout-split` |
86
- | 一列堆叠带间距 | `wf-layout-stack wf-gap-md` |
87
- | 一行换行居中对齐 | `wf-layout-row wf-gap-md wf-layout-cluster` |
88
- | 卡片网格 | `<div class="wf-layout-grid">` |
88
+ | 两个元素两端分布 | `wf-justify-between` |
89
+ | 一列堆叠带间距 | `wf-stack wf-gap-md` |
90
+ | 一行换行居中对齐 | `wf-cluster wf-gap-md` |
91
+ | 卡片网格 | `<div class="wf-grid">` |
89
92
  | 状态色文字/背景 | `wf-text-success` / `wf-bg-error` |
90
93
  | 卡片 hover 抬升 | `<Card hover>` 或 `wf-elevate` |
91
94
  | 聊天气泡 | `wf-bubble` / `wf-bubble--own` |
92
- | 文章正文排版 | `<article class="wf-prose">` |
93
- | 隐藏元素(桌面显示/移动隐藏) | `wf-layout-hidden@sm` |
95
+ | 隐藏元素(窄隐宽显) | `wf-hidden wf-flex@lg`(响应式显隐唯一模式) |
96
+ | 角标/覆盖层 | 父 `wf-relative` + 子 `wf-absolute`(CSS 零学习配对) |
97
+ | 可滚动区 | `wf-overflow-auto`(横滚 `wf-overflow-x`) |
94
98
  | 按钮变胶囊 | `:root { --wf-btn-radius: 999px }` |
95
99
  | 数字防抖(统计/表格数值) | `wf-nums`(StatCard 已默认套用) |
96
- | 顶级页面大标题 | `<PageHeader display>` 或 `wf-text-display` |
100
+ | 顶级页面大标题 | `<PageHeader display>` |
97
101
  | 状态/计数徽章 | `<Badge variant>`(不可交互,含 dot) |
98
102
  | 可关闭标签 | `<Tag closable>`(可交互,有关闭钮) |
99
103
  | 图标 | `<Icon name="close" />`(禁止裸 emoji/字形) |
@@ -103,11 +107,10 @@ wf-rounded-md 圆角
103
107
  | 用途 | 写法 | Token |
104
108
  |------|------|-------|
105
109
  | 顶级页面标题 | `<PageHeader display>` | `--wf-font-size-display` (30px, 负字距) |
106
- | 页面标题 | `wf-text-3xl/4xl` | 24/30px |
107
- | 卡片标题 | `wf-text-xl/2xl` | 16/21px |
108
- | 正文 | `wf-text-base`(默认) | 14px · 行高 1.5(CJK 实测可读,与主流框架同档) |
109
- | 次级/辅助 | `wf-text-sm` / `wf-text-xs` | 13/12px · 配 `wf-text-secondary` |
110
- | 长文正文(文章) | `wf-prose` | 行高 1.75(relaxed)——长文更宽松 |
110
+ | 页面标题 | `wf-font-3xl/4xl` | 24/30px |
111
+ | 卡片标题 | `wf-font-xl/2xl` | 16/21px |
112
+ | 正文 | `wf-font-base`(默认) | 14px · 行高 1.5(CJK 实测可读,与主流框架同档) |
113
+ | 次级/辅助 | `wf-font-sm` / `wf-font-xs` | 13/12px · 配 `wf-text-secondary` |
111
114
  | 数字/统计 | `wf-nums`(StatCard/Table 数值) | tabular-nums 防宽度抖动 |
112
115
  | 标题字距/变换 | 全局 | `--wf-heading-case`(CJK 默认 none,英文可 uppercase) |
113
116
 
@@ -189,7 +192,7 @@ wf-rounded-md 圆角
189
192
  用户 @layer utilities 可精准盖过 weifuwu 的 utilities
190
193
  ```
191
194
 
192
- ## 主题 Token(182 个,双层)
195
+ ## 主题 Token(183 个,双层)
193
196
 
194
197
  - **原始层**(`--wf-brand-*` `--wf-slate-*` `--wf-dark-*`):色值只定义一次,品牌/暗色调校改这里
195
198
  - **语义层**(`--wf-color-*` `--wf-space-*` `--wf-radius-*` …):组件消费,主题切换覆盖这里
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "weifuwu",
3
3
  "type": "module",
4
- "version": "0.87.0",
4
+ "version": "0.89.0",
5
5
  "description": "AI SaaS full-stack framework — backend HTTP + frontend VDOM + 129 components + CSS design system + SaaS foundation (auth/queue/AI). Zero-build, zero-dependency.",
6
6
  "exports": {
7
7
  ".": {
@@ -32,13 +32,8 @@
32
32
  "files": [
33
33
  "dist/",
34
34
  "README.md",
35
- "docs/",
36
- "content/",
37
- "examples/"
35
+ "docs/"
38
36
  ],
39
- "bin": {
40
- "weifuwu": "./dist/cli/docs.mjs"
41
- },
42
37
  "scripts": {
43
38
  "build": "node scripts/build.mjs",
44
39
  "prepublishOnly": "npm run build && tsc --emitDeclarationOnly --outdir dist",
@@ -47,14 +42,21 @@
47
42
  "release": "node scripts/release.mjs",
48
43
  "release:dry": "node scripts/release.mjs --dry-run",
49
44
  "test:client": "node --env-file=.env --test --test-concurrency=4 'src/test/contract/**/*.test.ts'",
50
- "test:server": "node --env-file=.env --test --test-concurrency=8 'src/server/**/*.test.ts'",
45
+ "test:server": "node --env-file=.env --test --experimental-test-module-mocks --test-concurrency=8 'src/server/**/*.test.ts'",
51
46
  "test:showcase": "node --env-file=.env --test --test-timeout=8000 apps/showcase/test/comp-*.test.ts",
52
47
  "test:scenario": "node --env-file=.env --test --test-timeout=8000 --test-concurrency=14 'src/test/scenario/e2e*.test.ts'",
53
48
  "test:components": "node --env-file=.env --test --test-timeout=8000 --test-concurrency=2 src/test/scenario/e2e-6.test.ts",
54
49
  "audit:semantics": "node scripts/audit-core-semantics.mjs",
55
50
  "audit:showcase": "node scripts/audit-showcase-dev.mjs",
56
- "audit:all": "npm run audit:semantics && npm run audit:showcase",
57
- "test:contract-components": "node --env-file=.env --test 'src/client/components/**/*.test.ts'"
51
+ "audit:all": "npm run audit:semantics && npm run audit:interactivity && npm run audit:vdom && npm run audit:theme && npm run audit:api && npm run audit:bundle && npm run audit:showcase",
52
+ "bench:server": "node bench/server-bench.ts",
53
+ "bench:db": "node bench/db-bench.ts",
54
+ "test:contract-components": "node --env-file=.env --test 'src/client/components/**/*.test.ts'",
55
+ "audit:interactivity": "node scripts/audit-interactivity.mjs",
56
+ "audit:theme": "node scripts/audit-theme.mjs",
57
+ "audit:api": "node scripts/audit-api.mjs",
58
+ "audit:bundle": "node scripts/audit-bundle.mjs",
59
+ "audit:vdom": "node scripts/audit-vdom.mjs"
58
60
  },
59
61
  "dependencies": {
60
62
  "esbuild": "^0.28.1",
@@ -86,6 +88,7 @@
86
88
  "playwright": "^1.62.1",
87
89
  "postcss": "^8.5.19",
88
90
  "postgres": "^3.4.9",
91
+ "puppeteer-core": "^25.9.0",
89
92
  "tailwindcss": "^4.3.3"
90
93
  },
91
94
  "keywords": [
@@ -1,55 +0,0 @@
1
- # 管理后台 · apps
2
-
3
- ## 概述
4
-
5
- AppShell + Dashboard/Table/Form 多页——layout 包裹复用 + 主题。后端:rateLimit + 查询端点。源于 agent-platform 架构提炼。
6
-
7
-
8
- ## 用到的页面模式
9
- - [app-shell](../patterns/app-shell.md)
10
-
11
- ## 用到的组件
12
- - [Layout](../components/layout.md)
13
- - [Menu](../components/menu.md)
14
- - [NavMenu](../components/navmenu.md)
15
- - [Table](../components/table.md)
16
- - [Form](../components/form.md)
17
- - [ThemeSwitch](../components/themeswitch.md)
18
- - [StatCard](../components/statcard.md)
19
- - [Chart](../components/chart.md)
20
- - [Badge](../components/badge.md)
21
- - [Avatar](../components/avatar.md)
22
- - [Tag](../components/tag.md)
23
-
24
- ## 源码
25
-
26
- > `examples/apps/admin/` ——完整可运行(随 npm 包发布)
27
-
28
- ## 目录结构
29
-
30
- | 文件 | 职责 |
31
- |------|------|
32
- | `app.tsx` | 前端:AppShell(Layout 骨架 + Menu)+ DashboardPage/OrdersPage + 路由 layout 包裹 |
33
- | `api.ts` | 后端:registerAdminApi——订单查询 + 种子数据 |
34
- | `server.ts` | 独立入口(:3302) |
35
- | `main.tsx` | 独立前端入口 |
36
-
37
- ## 改造指南(新手从跑起来到改成自己的)
38
-
39
- - 1. 换业务数据:api.ts 的 admin_orders 表 + 种子数据 → 自己的业务表(或接真实 postgres)
40
- - 2. 加页面:app.tsx 路由表加 { path, render, layout: AppShell }——侧栏 Menu items 同步加
41
- - 3. 改菜单/品牌:AppShell 里 Menu items + 标题文案
42
- - 4. 表格交互:Table 组件文档(sortable/rowSelection——受控 props 配回调)
43
- - 5. 参考生产级:apps/agent-platform/(多租户/权限/商业化真实架构)
44
-
45
- ## 质量标准
46
-
47
- - [x] 键盘可达
48
- - [x] 侧栏折叠
49
- - [x] 表格排序
50
- - [x] 亮暗主题
51
- - [x] loading/empty 态
52
-
53
- ## 验证
54
-
55
- > agent-browser 走查:打开 showcase `/apps/admin`(活体嵌入)——列表/新建/保存/删除全流程 + 控制台零错误
@@ -1,35 +0,0 @@
1
- # agent-platform(生产级) · apps(生产级)
2
-
3
- ## 概述
4
-
5
- 多租户 AI Agent 平台——weifuwu 中间件全量消费方(认证/AI/沙箱/工具链/商业化/私有化)。实战驱动框架开发的生产级参考。
6
-
7
- > **生产级参考**:目录独立于 showcase(apps/agent-platform/),此处为展示层纳入——架构文档 + 源码索引 + 启动方式。
8
- ## 用到的页面模式
9
- - (无)
10
-
11
- ## 用到的组件
12
- - [AiChat](../components/aichat.md)
13
- - [AuthPage](../components/authpage.md)
14
- - [Table](../components/table.md)
15
- - [Form](../components/form.md)
16
- - [Modal](../components/modal.md)
17
- - [Drawer](../components/drawer.md)
18
- - [Menu](../components/menu.md)
19
- - [StatCard](../components/statcard.md)
20
- - [ThemeSwitch](../components/themeswitch.md)
21
-
22
- ## 源码
23
-
24
- > 源码见 `apps/agent-platform/`(独立仓库结构——不随包)
25
-
26
- ## 质量标准
27
-
28
- - [x] 真实产品
29
- - [x] 多租户
30
- - [x] 私有化部署
31
- - [x] 商业化闭环
32
-
33
- ## 验证
34
-
35
- > 独立部署验证(docker + 真实库)——见 apps/agent-platform/README.md
@@ -1,49 +0,0 @@
1
- # 登录注册 · apps
2
-
3
- ## 概述
4
-
5
- 登录/注册 → 受保护页 → 登出:应用级状态(user store)+ 路由守卫 + ctx.data。后端:认证中间件。
6
-
7
-
8
- ## 用到的页面模式
9
- - (无)
10
-
11
- ## 用到的组件
12
- - [Card](../components/card.md)
13
- - [Form](../components/form.md)
14
- - [Input](../components/input.md)
15
- - [PasswordInput](../components/passwordinput.md)
16
- - [Button](../components/button.md)
17
- - [Alert](../components/alert.md)
18
-
19
- ## 源码
20
-
21
- > `examples/apps/auth/` ——完整可运行(随 npm 包发布)
22
-
23
- ## 目录结构
24
-
25
- | 文件 | 职责 |
26
- |------|------|
27
- | `app.tsx` | 前端:AuthFormPage(登录/注册两用)+ 路由守卫 + authStore |
28
- | `api.ts` | 后端:registerAuthApi——内存用户表 + token 会话 |
29
- | `server.ts` | 独立入口(:3301) |
30
- | `main.tsx` | 独立前端入口 |
31
-
32
- ## 改造指南(新手从跑起来到改成自己的)
33
-
34
- - 1. 换用户存储:api.ts 的 auth_users 表 → 接 userSystem 中间件(见 content/backend/auth.md)
35
- - 2. 加受保护页:app.tsx 路由表加页面 + 组件内读 authStore.state.user 做守卫(同 DashboardPage 模式)
36
- - 3. 改会话持久化:app.tsx 的 ctx.browser.storageSet 已处理——key 名 auth:token 可改
37
- - 4. 加角色权限:守卫处加角色判断(user 表加 role 字段)
38
-
39
- ## 质量标准
40
-
41
- - [x] 键盘可达
42
- - [x] 表单校验
43
- - [x] 错误态
44
- - [x] 会话持久化
45
- - [x] 零控制台错误
46
-
47
- ## 验证
48
-
49
- > agent-browser 走查:打开 showcase `/apps/auth`(活体嵌入)——列表/新建/保存/删除全流程 + 控制台零错误