wok-server 0.4.13 → 0.6.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 (376) hide show
  1. package/README.en.md +61 -0
  2. package/README.md +44 -29
  3. package/dist/cache/cache.js +98 -98
  4. package/dist/cache/config.js +19 -19
  5. package/dist/cache/index.js +27 -27
  6. package/dist/cache/purge-task.js +46 -46
  7. package/dist/cache/stat.js +47 -47
  8. package/dist/config/convert.js +36 -36
  9. package/dist/config/exception.js +14 -14
  10. package/dist/config/index.js +81 -81
  11. package/dist/http-client/index.js +136 -136
  12. package/dist/i18n/ar.js +17 -17
  13. package/dist/i18n/de.js +17 -17
  14. package/dist/i18n/en-us.js +17 -17
  15. package/dist/i18n/es.js +17 -17
  16. package/dist/i18n/fr.js +17 -17
  17. package/dist/i18n/i18n.js +231 -231
  18. package/dist/i18n/index.js +52 -52
  19. package/dist/i18n/ja.js +17 -17
  20. package/dist/i18n/ko.js +17 -17
  21. package/dist/i18n/msg.js +2 -2
  22. package/dist/i18n/pt.js +17 -17
  23. package/dist/i18n/ru.js +17 -17
  24. package/dist/i18n/tag.js +18 -18
  25. package/dist/i18n/zh-HK.js +17 -17
  26. package/dist/i18n/zh-TW.js +17 -17
  27. package/dist/i18n/zh-cn.js +17 -17
  28. package/dist/index.js +14 -14
  29. package/dist/lock/index.js +114 -114
  30. package/dist/log/config.js +35 -29
  31. package/dist/log/date.js +21 -21
  32. package/dist/log/file.js +198 -72
  33. package/dist/log/index.js +135 -105
  34. package/dist/log/level.js +33 -33
  35. package/dist/log/log.js +56 -0
  36. package/dist/log/store.js +19 -16
  37. package/dist/mongodb/collection.js +2 -2
  38. package/dist/mongodb/config.js +34 -34
  39. package/dist/mongodb/doc.js +2 -2
  40. package/dist/mongodb/exception.js +14 -14
  41. package/dist/mongodb/index.js +58 -58
  42. package/dist/mongodb/manager/base.js +563 -563
  43. package/dist/mongodb/manager/index.js +63 -63
  44. package/dist/mongodb/manager/tx-strict.js +84 -84
  45. package/dist/mongodb/manager/tx.js +30 -30
  46. package/dist/mongodb/migration.js +52 -52
  47. package/dist/mvc/access-log.js +33 -33
  48. package/dist/mvc/config.js +27 -27
  49. package/dist/mvc/exchange.js +113 -113
  50. package/dist/mvc/handler/index.js +7 -6
  51. package/dist/mvc/handler/json.js +65 -65
  52. package/dist/mvc/handler/restful.js +35 -35
  53. package/dist/mvc/handler/sse.js +65 -0
  54. package/dist/mvc/handler/upload.js +31 -31
  55. package/dist/mvc/index.js +50 -50
  56. package/dist/mvc/interceptor.js +2 -2
  57. package/dist/mvc/query.js +43 -43
  58. package/dist/mvc/render/file.js +132 -132
  59. package/dist/mvc/render/html/html.js +90 -90
  60. package/dist/mvc/render/html/index.js +18 -18
  61. package/dist/mvc/render/html/style.js +2 -2
  62. package/dist/mvc/render/index.js +7 -7
  63. package/dist/mvc/render/json.js +26 -26
  64. package/dist/mvc/render/text.js +16 -16
  65. package/dist/mvc/router.js +2 -2
  66. package/dist/mvc/server.js +272 -272
  67. package/dist/mvc/static/header.js +67 -67
  68. package/dist/mvc/static/index.js +6 -6
  69. package/dist/mvc/static/mime-type.js +84 -84
  70. package/dist/mvc/static/server-cache-config.js +66 -66
  71. package/dist/mvc/static/server-cache.js +133 -133
  72. package/dist/mvc/static/static-handler.js +372 -372
  73. package/dist/mysql/config.js +51 -51
  74. package/dist/mysql/exception.js +14 -14
  75. package/dist/mysql/index.js +87 -87
  76. package/dist/mysql/manager/base.js +239 -231
  77. package/dist/mysql/manager/index.js +107 -107
  78. package/dist/mysql/manager/ops/count.js +20 -20
  79. package/dist/mysql/manager/ops/criteria.js +356 -356
  80. package/dist/mysql/manager/ops/delete.js +65 -65
  81. package/dist/mysql/manager/ops/exist.js +26 -26
  82. package/dist/mysql/manager/ops/find.js +169 -130
  83. package/dist/mysql/manager/ops/index.js +14 -14
  84. package/dist/mysql/manager/ops/insert.js +106 -106
  85. package/dist/mysql/manager/ops/modify.js +10 -10
  86. package/dist/mysql/manager/ops/paginate.js +23 -23
  87. package/dist/mysql/manager/ops/query.js +9 -9
  88. package/dist/mysql/manager/ops/update.js +216 -216
  89. package/dist/mysql/manager/ops/utils.js +24 -24
  90. package/dist/mysql/manager/tx-strict.js +103 -100
  91. package/dist/mysql/manager/tx.js +30 -30
  92. package/dist/mysql/manager/utils.js +56 -56
  93. package/dist/mysql/migration.js +136 -136
  94. package/dist/mysql/table-info.js +8 -8
  95. package/dist/task/daily.js +59 -59
  96. package/dist/task/fixed-delay.js +38 -38
  97. package/dist/task/fixed-rate.js +42 -42
  98. package/dist/task/index.js +9 -9
  99. package/dist/task/task.js +56 -56
  100. package/dist/validation/exception.js +36 -36
  101. package/dist/validation/index.js +40 -40
  102. package/dist/validation/validator/array.js +34 -34
  103. package/dist/validation/validator/enum.js +28 -28
  104. package/dist/validation/validator/index.js +14 -14
  105. package/dist/validation/validator/length.js +40 -40
  106. package/dist/validation/validator/max-length.js +35 -35
  107. package/dist/validation/validator/max.js +29 -29
  108. package/dist/validation/validator/min-length.js +33 -33
  109. package/dist/validation/validator/min.js +29 -29
  110. package/dist/validation/validator/not-blank.js +33 -33
  111. package/dist/validation/validator/not-null.js +21 -21
  112. package/dist/validation/validator/plain-obj.js +32 -32
  113. package/dist/validation/validator/regexp.js +34 -34
  114. package/documentation/en/cache.md +56 -0
  115. package/documentation/en/config.md +96 -0
  116. package/documentation/en/engineering.md +256 -0
  117. package/documentation/en/http-client.md +32 -0
  118. package/documentation/en/i18n.md +143 -0
  119. package/documentation/en/index.md +24 -0
  120. package/documentation/en/lock.md +51 -0
  121. package/documentation/en/log.md +109 -0
  122. package/documentation/en/mongodb.md +256 -0
  123. package/documentation/en/mvc.md +688 -0
  124. package/documentation/en/mysql.md +552 -0
  125. package/documentation/en/task.md +45 -0
  126. package/documentation/en/test.md +56 -0
  127. package/documentation/en/validate.md +130 -0
  128. package/documentation/zh-cn/engineering.md +1 -1
  129. package/documentation/zh-cn/log.md +81 -8
  130. package/documentation/zh-cn/mvc.md +66 -24
  131. package/documentation/zh-cn/mysql.md +24 -23
  132. package/documentation/zh-cn/validate.md +2 -2
  133. package/package.json +3 -1
  134. package/skills/wok-server-api-rules/SKILL.md +350 -0
  135. package/skills/wok-server-cache/SKILL.md +216 -0
  136. package/skills/wok-server-config/SKILL.md +200 -0
  137. package/skills/wok-server-getting-started/SKILL.md +123 -0
  138. package/skills/wok-server-getting-started/references/engineering.md +169 -0
  139. package/skills/wok-server-http-client/SKILL.md +164 -0
  140. package/skills/wok-server-i18n/SKILL.md +214 -0
  141. package/skills/wok-server-lock/SKILL.md +144 -0
  142. package/skills/wok-server-log/SKILL.md +218 -0
  143. package/skills/wok-server-mongodb/SKILL.md +235 -0
  144. package/skills/wok-server-mvc/SKILL.md +251 -0
  145. package/skills/wok-server-mvc/references/respond-html.md +157 -0
  146. package/skills/wok-server-mvc/references/sse.md +121 -0
  147. package/skills/wok-server-mvc/references/static-files.md +47 -0
  148. package/skills/wok-server-mvc/references/upload.md +62 -0
  149. package/skills/wok-server-mvc/references/websocket.md +30 -0
  150. package/skills/wok-server-mysql/SKILL.md +315 -0
  151. package/skills/wok-server-mysql/references/multi-datasource.md +76 -0
  152. package/skills/wok-server-mysql/references/version-control.md +22 -0
  153. package/skills/wok-server-task/SKILL.md +158 -0
  154. package/skills/wok-server-validate/SKILL.md +167 -0
  155. package/src/cache/cache.ts +118 -0
  156. package/src/cache/config.ts +53 -0
  157. package/src/cache/index.ts +27 -0
  158. package/src/cache/purge-task.ts +53 -0
  159. package/src/cache/stat.ts +47 -0
  160. package/src/config/convert.ts +27 -0
  161. package/src/config/exception.ts +8 -0
  162. package/src/config/index.ts +92 -0
  163. package/src/http-client/index.ts +202 -0
  164. package/src/i18n/ar.ts +16 -0
  165. package/src/i18n/de.ts +16 -0
  166. package/src/i18n/en-us.ts +16 -0
  167. package/src/i18n/es.ts +16 -0
  168. package/src/i18n/fr.ts +16 -0
  169. package/src/i18n/i18n.ts +230 -0
  170. package/src/i18n/index.ts +50 -0
  171. package/src/i18n/ja.ts +16 -0
  172. package/src/i18n/ko.ts +16 -0
  173. package/src/i18n/msg.ts +50 -0
  174. package/src/i18n/pt.ts +16 -0
  175. package/src/i18n/ru.ts +16 -0
  176. package/src/i18n/tag.ts +18 -0
  177. package/src/i18n/zh-HK.ts +16 -0
  178. package/src/i18n/zh-TW.ts +16 -0
  179. package/src/i18n/zh-cn.ts +16 -0
  180. package/src/index.ts +11 -0
  181. package/src/lock/index.ts +164 -0
  182. package/src/log/config.ts +71 -0
  183. package/src/log/date.ts +19 -0
  184. package/src/log/file.ts +215 -0
  185. package/src/log/index.ts +136 -0
  186. package/src/log/level.ts +29 -0
  187. package/src/log/log.ts +77 -0
  188. package/src/log/store.ts +31 -0
  189. package/src/mongodb/collection.ts +25 -0
  190. package/src/mongodb/config.ts +69 -0
  191. package/src/mongodb/doc.ts +12 -0
  192. package/src/mongodb/exception.ts +8 -0
  193. package/src/mongodb/index.ts +71 -0
  194. package/src/mongodb/manager/base.ts +674 -0
  195. package/src/mongodb/manager/index.ts +80 -0
  196. package/src/mongodb/manager/tx-strict.ts +153 -0
  197. package/src/mongodb/manager/tx.ts +34 -0
  198. package/src/mongodb/migration.ts +66 -0
  199. package/src/mvc/access-log.ts +33 -0
  200. package/src/mvc/config.ts +70 -0
  201. package/src/mvc/exchange.ts +126 -0
  202. package/src/mvc/handler/index.ts +4 -0
  203. package/src/mvc/handler/json.ts +96 -0
  204. package/src/mvc/handler/restful.ts +39 -0
  205. package/src/mvc/handler/sse.ts +90 -0
  206. package/src/mvc/handler/upload.ts +54 -0
  207. package/src/mvc/index.ts +48 -0
  208. package/src/mvc/interceptor.ts +12 -0
  209. package/src/mvc/query.ts +36 -0
  210. package/src/mvc/render/file.ts +148 -0
  211. package/src/mvc/render/html/html.ts +187 -0
  212. package/src/mvc/render/html/index.ts +16 -0
  213. package/src/mvc/render/html/style.ts +1201 -0
  214. package/src/mvc/render/index.ts +4 -0
  215. package/src/mvc/render/json.ts +24 -0
  216. package/src/mvc/render/text.ts +14 -0
  217. package/src/mvc/router.ts +13 -0
  218. package/src/mvc/server.ts +315 -0
  219. package/src/mvc/static/header.ts +86 -0
  220. package/src/mvc/static/index.ts +3 -0
  221. package/src/mvc/static/mime-type.ts +81 -0
  222. package/src/mvc/static/server-cache-config.ts +92 -0
  223. package/src/mvc/static/server-cache.ts +171 -0
  224. package/src/mvc/static/static-handler.ts +445 -0
  225. package/src/mysql/config.ts +130 -0
  226. package/src/mysql/exception.ts +8 -0
  227. package/src/mysql/index.ts +88 -0
  228. package/src/mysql/manager/base.ts +285 -0
  229. package/src/mysql/manager/index.ts +112 -0
  230. package/src/mysql/manager/ops/count.ts +30 -0
  231. package/src/mysql/manager/ops/criteria.ts +412 -0
  232. package/src/mysql/manager/ops/delete.ts +96 -0
  233. package/src/mysql/manager/ops/exist.ts +41 -0
  234. package/src/mysql/manager/ops/find.ts +226 -0
  235. package/src/mysql/manager/ops/index.ts +11 -0
  236. package/src/mysql/manager/ops/insert.ts +120 -0
  237. package/src/mysql/manager/ops/modify.ts +14 -0
  238. package/src/mysql/manager/ops/paginate.ts +60 -0
  239. package/src/mysql/manager/ops/query.ts +13 -0
  240. package/src/mysql/manager/ops/update.ts +294 -0
  241. package/src/mysql/manager/ops/utils.ts +20 -0
  242. package/src/mysql/manager/tx-strict.ts +138 -0
  243. package/src/mysql/manager/tx.ts +31 -0
  244. package/src/mysql/manager/utils.ts +75 -0
  245. package/src/mysql/migration.ts +149 -0
  246. package/src/mysql/table-info.ts +41 -0
  247. package/src/task/daily.ts +70 -0
  248. package/src/task/fixed-delay.ts +45 -0
  249. package/src/task/fixed-rate.ts +49 -0
  250. package/src/task/index.ts +4 -0
  251. package/src/task/task.ts +70 -0
  252. package/src/validation/exception.ts +27 -0
  253. package/src/validation/index.ts +61 -0
  254. package/src/validation/validator/array.ts +32 -0
  255. package/src/validation/validator/enum.ts +25 -0
  256. package/src/validation/validator/index.ts +11 -0
  257. package/src/validation/validator/length.ts +42 -0
  258. package/src/validation/validator/max-length.ts +33 -0
  259. package/src/validation/validator/max.ts +26 -0
  260. package/src/validation/validator/min-length.ts +31 -0
  261. package/src/validation/validator/min.ts +26 -0
  262. package/src/validation/validator/not-blank.ts +31 -0
  263. package/src/validation/validator/not-null.ts +19 -0
  264. package/src/validation/validator/plain-obj.ts +30 -0
  265. package/src/validation/validator/regexp.ts +32 -0
  266. package/types/cache/cache.d.ts +52 -52
  267. package/types/cache/config.d.ts +32 -32
  268. package/types/cache/index.d.ts +2 -2
  269. package/types/cache/purge-task.d.ts +11 -11
  270. package/types/cache/stat.d.ts +26 -26
  271. package/types/config/convert.d.ts +6 -6
  272. package/types/config/exception.d.ts +7 -7
  273. package/types/config/index.d.ts +25 -25
  274. package/types/http-client/index.d.ts +71 -71
  275. package/types/i18n/ar.d.ts +2 -2
  276. package/types/i18n/de.d.ts +2 -2
  277. package/types/i18n/en-us.d.ts +2 -2
  278. package/types/i18n/es.d.ts +2 -2
  279. package/types/i18n/fr.d.ts +2 -2
  280. package/types/i18n/i18n.d.ts +102 -102
  281. package/types/i18n/index.d.ts +9 -9
  282. package/types/i18n/ja.d.ts +2 -2
  283. package/types/i18n/ko.d.ts +2 -2
  284. package/types/i18n/msg.d.ts +50 -50
  285. package/types/i18n/pt.d.ts +2 -2
  286. package/types/i18n/ru.d.ts +2 -2
  287. package/types/i18n/tag.d.ts +11 -11
  288. package/types/i18n/zh-HK.d.ts +2 -2
  289. package/types/i18n/zh-TW.d.ts +2 -2
  290. package/types/i18n/zh-cn.d.ts +2 -2
  291. package/types/index.d.ts +11 -11
  292. package/types/lock/index.d.ts +64 -64
  293. package/types/log/config.d.ts +35 -27
  294. package/types/log/date.d.ts +2 -2
  295. package/types/log/file.d.ts +13 -5
  296. package/types/log/index.d.ts +53 -34
  297. package/types/log/level.d.ts +14 -14
  298. package/types/log/log.d.ts +40 -0
  299. package/types/log/store.d.ts +19 -12
  300. package/types/mongodb/collection.d.ts +25 -25
  301. package/types/mongodb/config.d.ts +45 -45
  302. package/types/mongodb/doc.d.ts +11 -11
  303. package/types/mongodb/exception.d.ts +7 -7
  304. package/types/mongodb/index.d.ts +29 -29
  305. package/types/mongodb/manager/base.d.ts +188 -188
  306. package/types/mongodb/manager/index.d.ts +38 -38
  307. package/types/mongodb/manager/tx-strict.d.ts +41 -41
  308. package/types/mongodb/manager/tx.d.ts +21 -21
  309. package/types/mongodb/migration.d.ts +12 -12
  310. package/types/mvc/access-log.d.ts +7 -7
  311. package/types/mvc/config.d.ts +42 -42
  312. package/types/mvc/exchange.d.ts +72 -72
  313. package/types/mvc/handler/index.d.ts +4 -3
  314. package/types/mvc/handler/json.d.ts +44 -44
  315. package/types/mvc/handler/restful.d.ts +11 -11
  316. package/types/mvc/handler/sse.d.ts +34 -0
  317. package/types/mvc/handler/upload.d.ts +36 -36
  318. package/types/mvc/index.d.ts +22 -22
  319. package/types/mvc/interceptor.d.ts +11 -11
  320. package/types/mvc/query.d.ts +13 -13
  321. package/types/mvc/render/file.d.ts +10 -10
  322. package/types/mvc/render/html/html.d.ts +98 -98
  323. package/types/mvc/render/html/index.d.ts +11 -11
  324. package/types/mvc/render/html/style.d.ts +1201 -1201
  325. package/types/mvc/render/index.d.ts +4 -4
  326. package/types/mvc/render/json.d.ts +17 -17
  327. package/types/mvc/render/text.d.ts +10 -10
  328. package/types/mvc/router.d.ts +11 -11
  329. package/types/mvc/server.d.ts +90 -90
  330. package/types/mvc/static/header.d.ts +27 -27
  331. package/types/mvc/static/index.d.ts +3 -3
  332. package/types/mvc/static/mime-type.d.ts +2 -2
  333. package/types/mvc/static/server-cache-config.d.ts +30 -30
  334. package/types/mvc/static/server-cache.d.ts +76 -76
  335. package/types/mvc/static/static-handler.d.ts +77 -77
  336. package/types/mysql/config.d.ts +90 -90
  337. package/types/mysql/exception.d.ts +7 -7
  338. package/types/mysql/index.d.ts +16 -16
  339. package/types/mysql/manager/base.d.ts +165 -159
  340. package/types/mysql/manager/index.d.ts +36 -36
  341. package/types/mysql/manager/ops/count.d.ts +13 -13
  342. package/types/mysql/manager/ops/criteria.d.ts +134 -134
  343. package/types/mysql/manager/ops/delete.d.ts +46 -46
  344. package/types/mysql/manager/ops/exist.d.ts +6 -6
  345. package/types/mysql/manager/ops/find.d.ts +86 -70
  346. package/types/mysql/manager/ops/index.d.ts +10 -10
  347. package/types/mysql/manager/ops/insert.d.ts +18 -18
  348. package/types/mysql/manager/ops/modify.d.ts +3 -3
  349. package/types/mysql/manager/ops/paginate.d.ts +36 -36
  350. package/types/mysql/manager/ops/query.d.ts +3 -3
  351. package/types/mysql/manager/ops/update.d.ts +76 -76
  352. package/types/mysql/manager/ops/utils.d.ts +5 -5
  353. package/types/mysql/manager/tx-strict.d.ts +36 -35
  354. package/types/mysql/manager/tx.d.ts +15 -15
  355. package/types/mysql/manager/utils.d.ts +17 -17
  356. package/types/mysql/migration.d.ts +8 -8
  357. package/types/mysql/table-info.d.ts +36 -36
  358. package/types/task/daily.d.ts +16 -16
  359. package/types/task/fixed-delay.d.ts +9 -9
  360. package/types/task/fixed-rate.d.ts +9 -9
  361. package/types/task/index.d.ts +4 -4
  362. package/types/task/task.d.ts +34 -34
  363. package/types/validation/exception.d.ts +38 -38
  364. package/types/validation/index.d.ts +32 -32
  365. package/types/validation/validator/array.d.ts +5 -5
  366. package/types/validation/validator/enum.d.ts +8 -8
  367. package/types/validation/validator/index.d.ts +11 -11
  368. package/types/validation/validator/length.d.ts +10 -10
  369. package/types/validation/validator/max-length.d.ts +8 -8
  370. package/types/validation/validator/max.d.ts +7 -7
  371. package/types/validation/validator/min-length.d.ts +6 -6
  372. package/types/validation/validator/min.d.ts +7 -7
  373. package/types/validation/validator/not-blank.d.ts +7 -7
  374. package/types/validation/validator/not-null.d.ts +6 -6
  375. package/types/validation/validator/plain-obj.d.ts +7 -7
  376. package/types/validation/validator/regexp.d.ts +8 -8
@@ -0,0 +1,130 @@
1
+ # Validation
2
+
3
+ The validation component provides a validate function to validate objects with many built-in validation rules. The component supports internationalization, and error messages depend on the current language. See the internationalization section for details.
4
+
5
+ Here is a simple usage example:
6
+
7
+ ```ts
8
+ validate(
9
+ // Object to validate
10
+ { name: 'tom' },
11
+ // Validation rules, multiple rules per property
12
+ {
13
+ name: [notNull(), length({ min: 2, max: 16 })]
14
+ }
15
+ )
16
+ ```
17
+
18
+ Built-in validation rule functions:
19
+
20
+ | Function | Description |
21
+ | :------------ | :----------------------------------------------------------------------- |
22
+ | notNull | Not null validation, cannot be null or undefined |
23
+ | notBlank | Not blank validation, cannot be null, undefined, or blank string |
24
+ | min | Validate minimum number value |
25
+ | max | Validate maximum number value |
26
+ | length | Validate length, applicable to strings and arrays |
27
+ | maxLength | Check maximum length, applicable to strings and arrays |
28
+ | minLength | Check minimum length, applicable to strings and arrays |
29
+ | regexp | Regular expression validation |
30
+ | enumerate | Enumeration validation, value must be one of the specified list |
31
+ | array | Array validation, set element validation rules to validate each element |
32
+ | plainObject | Object validation, validate nested object properties |
33
+
34
+ Here is an example of nested object and array validation:
35
+
36
+ ```ts
37
+ interface Tag {
38
+ id: string
39
+ name: string
40
+ permissinos: { edit?: boolean; read?: boolean }
41
+ }
42
+ interface User {
43
+ profile: {
44
+ theme: string
45
+ }
46
+ tags: Tag[]
47
+ }
48
+ validate<User>(
49
+ {
50
+ profile: {
51
+ theme: 'light'
52
+ },
53
+ tags: [
54
+ { id: '001', name: 'basketball', permissinos: { edit: true, read: true } },
55
+ { id: '002', name: 'soccer', permissinos: { edit: true } }
56
+ ]
57
+ },
58
+ {
59
+ profile: [
60
+ notNull(),
61
+ plainObject({
62
+ theme: [notBlank()]
63
+ })
64
+ ],
65
+ tags: [
66
+ // Maximum 5 tags
67
+ maxLength(5),
68
+ // Tags list cannot be null
69
+ notNull(),
70
+ // Validate tag array elements
71
+ array([
72
+ // Element cannot be null
73
+ notNull(),
74
+ // Element property validation
75
+ plainObject({
76
+ id: [notBlank()],
77
+ name: [notBlank()],
78
+ permissinos: [
79
+ notNull(),
80
+ plainObject({
81
+ edit: [notNull()],
82
+ read: [notNull()]
83
+ })
84
+ ]
85
+ })
86
+ ])
87
+ ]
88
+ }
89
+ )
90
+ ```
91
+
92
+ In actual development, it's recommended to keep validation at most one level deep, without nesting, otherwise the program will be difficult to maintain.
93
+
94
+ ## Custom Validation Rules
95
+
96
+ If the built-in validation rules cannot meet your needs, you can write custom validation rules.
97
+
98
+ ```ts
99
+ /**
100
+ * Custom validation
101
+ * @returns Property validator
102
+ */
103
+ function customValidate(): PropValidator {
104
+ // Validator name for tracking
105
+ const validator = 'custom'
106
+ const message = 'Cannot start with t'
107
+ return val => {
108
+ // Skip null validation
109
+ if (!val) {
110
+ return { ok: true }
111
+ }
112
+ if (typeof val !== 'string') {
113
+ return { ok: false, validator, message: 'Value is not a string' }
114
+ }
115
+ if (val.startsWith('t')) {
116
+ return { ok: false, validator, message }
117
+ }
118
+ return { ok: true }
119
+ }
120
+ }
121
+
122
+ validate(
123
+ { name: 'tim' },
124
+ {
125
+ name: [customValidate()]
126
+ }
127
+ )
128
+ ```
129
+
130
+ Built-in validation rules have internationalization support. If you need internationalization for custom validation rules, you need to handle it yourself. See the internationalization chapter for details.
@@ -204,7 +204,7 @@ user/create-user.ts 示例:
204
204
 
205
205
  ```ts
206
206
  import { createJsonHandler, getMysqlManager, notBlank, length } from 'wok-server'
207
- import { User, tableUser } from './user.ts'
207
+ import { User, tableUser } from './user'
208
208
 
209
209
  /**
210
210
  * 请求发送的表单信息
@@ -4,12 +4,15 @@
4
4
 
5
5
  ## 环境变量
6
6
 
7
- | 环境变量名称 | 默认值 | 说明 |
8
- | :---------------- | :----- | :----------------------------------------------------------------------- |
9
- | LOG_LEVEL | info | 日志级别,低于设定级别的日志将不会输出,取值:DEBUG,INFO,WARN,ERROR |
10
- | LOG_FILE | false | 取值 true 或 false ,表示是否开启文件 |
11
- | LOG_FILE_MAX_DAYS | 30 | 数文件的保留天数 |
12
- | LOG_FILE_DIR | logs | 日志文件存储路径,支持相对路径和绝对路径,相对路径是相对于进程执行目录的 |
7
+ | 环境变量名称 | 默认值 | 说明 |
8
+ | :---------------- | :----- | :-------------------------------------------------------------------------------- |
9
+ | LOG_LEVEL | info | 日志级别,低于设定级别的日志将不会输出,取值:DEBUG,INFO,WARN,ERROR |
10
+ | LOG_FILE | false | 取值 true 或 false ,表示是否开启文件 |
11
+ | LOG_FILE_MAX_DAYS | 30 | 数文件的保留天数 |
12
+ | LOG_FILE_DIR | logs | 日志文件存储路径,支持相对路径和绝对路径,相对路径是相对于进程执行目录的 |
13
+ | LOG_CONSOLE | true | 是否输出日志到控制台,0.5 版本新增加 |
14
+ | LOG_FORMAT | text | 输出日志的格式,可设置为 json 或 text, 0.5 版本新增加,注意控制台是强制输出文本的 |
15
+
13
16
 
14
17
  ## 使用
15
18
 
@@ -24,17 +27,87 @@ const err = new Error('错误信息测试')
24
27
  logger.error('错误日志输出信息', err)
25
28
 
26
29
  if (logger.isDebugEnabled()) {
27
- logger.debug('调试日志输出', JSON.stringify(args))
30
+ logger.debug(`调试日志输出, args: ${JSON.stringify(args)}`)
31
+ }
32
+ ```
33
+
34
+ ## 判定是否支持某个日志级别
35
+
36
+ 日志对象提供了 isDebugEnabled、isInfoEnabled、isWarnEnabled、isErrorEnabled 方法来判定是否支持某个日志级别。
37
+
38
+ ```ts
39
+ if (logger.isDebugEnabled()) {
40
+ logger.debug('调试日志输出')
28
41
  }
29
42
  ```
30
43
 
44
+ 这些方法的作用是判断当前是否支持某个级别,然后再做处理,如果不支持就不构建日志内容。
45
+ 一些情况下,可以避免构建日志信息所带来的不必要的开销。
46
+
47
+ ## 给日志增加前缀
48
+
49
+ 0.5 版本开始,getLogger 函数支持增加前缀,比如:
50
+
51
+ ```ts
52
+ const logger = getLogger('my-module')
53
+ ```
54
+
55
+ 这样输出的日志会增加前缀 `[my-module]`,方便区分不同模块的日志。
56
+
57
+ 例如,默认无前缀的日志是这样的:
58
+
59
+ ```
60
+ [2024/08/19 16:27:18.214][INFO]Mysql migration
61
+ ```
62
+
63
+ 增加前缀后是这样的:
64
+
65
+ ```
66
+ [2024/08/19 16:27:18.214][INFO][my-module]Mysql migration
67
+ ```
68
+
69
+
31
70
  ## 自定义日志存储
32
71
 
33
72
  通过函数 setLogStore 可以自定义日志的存储,一旦设置,将会覆盖掉文件存储,即使设置了开启文件,日志也不会输出到文件中。
34
73
 
74
+ 从 0.5 版本开始,日志做了结构化,存储函数的参数是日志对象和配置信息,而不是一个字符串了。
75
+
76
+
35
77
  ```ts
36
- setLogStore(log => {
78
+ setLogStore((log: Log, config: LogConfig) => {
79
+ // log 的类型是 Log
80
+ // config 的类型是 LogConfig
37
81
  // 可以根据需要将日志内容放入消息队列或独立的文件存储系统中
38
82
  messageQueue.push(log)
39
83
  })
40
84
  ```
85
+
86
+ Log 的定义如下:
87
+
88
+ ```ts
89
+ export interface Log {
90
+ /**
91
+ * 日志的时间
92
+ */
93
+ time: Date
94
+ /**
95
+ * 日志的等级
96
+ */
97
+ level: LogLevel
98
+ /**
99
+ * 日志的内容
100
+ */
101
+ content: string
102
+ /**
103
+ * 异常信息
104
+ */
105
+ error?: any
106
+ /**
107
+ * 前缀信息
108
+ */
109
+ prefix?: string
110
+ }
111
+ ```
112
+
113
+ LogConfig 类型则是包含了前面的环境变量配置信息,用于获取配置信息来决定如何处理日志。
@@ -632,36 +632,78 @@ await startWebServer({
632
632
 
633
633
  ### Server-Sent Events
634
634
 
635
- 组件本身没有直接提供对 SSE(Server-Sent Events) 的支持,可以在路由的处理函数中适当的进行处理来实现。
635
+ 0.6.0 版本开始,MVC 组件内置了 `createSseHandler`,封装了 SSE 协议细节,大幅简化服务端推送实现。
636
636
 
637
637
  ```ts
638
- // 启动服务
638
+ import { createSseHandler } from 'wok-server'
639
+
639
640
  await startWebServer({
640
- // 路由配置
641
641
  routers: {
642
- '/sse': async exchange => {
643
- const { response } = exchange
644
- // 设置消息头
645
- response.setHeader('Content-Type', 'text/event-stream')
646
- response.setHeader('Cache-Control', 'no-cache')
647
- response.setHeader('Connection', 'keep-alive')
648
- // 模拟异步操作更新多条消息
649
- let counter = 0
650
- for (let i = 0; i < 10; i++) {
651
- // 沉睡一秒,模拟异步业务处理
652
- await new Promise<void>((resolve, reject) => {
653
- setTimeout(resolve, 1000)
654
- })
655
- counter++
656
- // 写数据到响应信息中,前端在 EventSource 的 message 事件中处理
657
- response.write(`data: ${JSON.stringify({ message: '实时更新', count: counter })}\n\n`)
658
- if (counter >= 10) {
659
- break
642
+ '/sse': createSseHandler({
643
+ async handle(ctx) {
644
+ let counter = 0
645
+ for (let i = 0; i < 10; i++) {
646
+ await new Promise<void>(resolve => setTimeout(resolve, 1000))
647
+ counter++
648
+ ctx.send({ message: '实时更新', count: counter })
649
+ if (counter >= 10) {
650
+ break
651
+ }
660
652
  }
653
+ ctx.close()
661
654
  }
662
- // 最后结束响应
663
- response.end()
664
- }
655
+ })
656
+ }
657
+ })
658
+ ```
659
+
660
+ `handle` 函数接收一个 `SseContext` 对象,提供以下能力:
661
+
662
+ | 方法/属性 | 说明 |
663
+ | :---------------------------------------- | :----------------------------------------------------------- |
664
+ | `ctx.send(data, event?, id?)` | 发送 SSE 事件,`data` 会被 JSON 序列化。`event` 指定事件名(前端用 `addEventListener` 监听),`id` 设置事件 ID(用于断线重连的 `Last-Event-ID`) |
665
+ | `ctx.close()` | 显式结束 SSE 连接。`handle` 返回或抛异常时连接也会自动关闭 |
666
+ | `ctx.request` | 原始 `IncomingMessage`,可读取请求头等信息 |
667
+ | `ctx.response` | 原始 `ServerResponse`,高级场景下使用 |
668
+
669
+ #### 命名事件
670
+
671
+ 通过 `event` 参数发送命名事件,前端可按事件类型分别处理:
672
+
673
+ ```ts
674
+ createSseHandler({
675
+ async handle(ctx) {
676
+ ctx.send({ title: '新消息' }, 'notification')
677
+ ctx.send({ progress: 50 }, 'progress')
665
678
  }
666
679
  })
667
680
  ```
681
+
682
+ 前端:
683
+
684
+ ```ts
685
+ const es = new EventSource('/sse')
686
+ es.addEventListener('notification', e => {
687
+ const data = JSON.parse(e.data)
688
+ console.log('收到通知:', data.title)
689
+ })
690
+ ```
691
+
692
+ #### 断线重连
693
+
694
+ 通过 `id` 参数设置事件 ID,前端断线重连时浏览器会自动发送 `Last-Event-ID` 请求头:
695
+
696
+ ```ts
697
+ createSseHandler({
698
+ async handle(ctx) {
699
+ const lastId = ctx.request.headers['last-event-id']
700
+ // 根据 lastId 确定从何处恢复推送
701
+ }
702
+ })
703
+ ```
704
+
705
+ #### 连接生命周期
706
+
707
+ - `handle` 开始执行时,SSE 消息头已发送,连接已建立
708
+ - 客户端断开连接时,`ctx.send()` 调用变为空操作(自动忽略)
709
+ - `handle` 返回或抛异常时,连接自动关闭
@@ -29,7 +29,7 @@ mysql 组件基于 [mysql2](https://www.npmjs.com/package/mysql2) 封装,提
29
29
  | MYSQL_SLOW_SQL_MS | 慢 sql 毫秒数,默认 200 |
30
30
  | MYSQL_TRANSACTION_TIMEOUT | 事务超时时间,单位毫秒,默认 5000 |
31
31
  | MYSQL_TRANSACTION_STRICT | 事务严格模式,默认 true,设置为 false 可关闭严格模式 |
32
- | MYSQL_MAX_OPS_IN_STRICT_TX | 严格事务中可以执行的操作次数,默认 10 |
32
+ | MYSQL_MAX_OPS_IN_STRICT_TX | 严格事务中可以执行的操作次数,默认 10 |
33
33
 
34
34
  ## 初始化
35
35
 
@@ -48,7 +48,7 @@ await enableMysql()
48
48
  await enableMysql('d2')
49
49
  ```
50
50
 
51
- 上传的操作要激活 mysql  时,会自动映射以 `D2_` 为前缀的环境变量。
51
+ 执行上面的操作后,会自动映射以 `D2_` 为前缀的环境变量。
52
52
 
53
53
  下面是多数据源的环境变量示例:
54
54
 
@@ -284,27 +284,28 @@ await manager.modify(`update user set nickname='无名' where nickname='佚名'`
284
284
 
285
285
  ### 所有操作方法
286
286
 
287
- | 方法 | 功能说明 |
288
- | :------------ | :-------------------------------------------------------------------------- |
289
- | findById | 按 id 查询 |
290
- | findByIdIn | 按 id 列表查询多条记录 |
291
- | existsBy | 判定指定的条件是否存在记录 |
292
- | existsById | 判定 id 是否存在 |
293
- | deleteById | 按 id 删除 |
294
- | deleteMany | 按指定条件删除,危险操作,建议尽可能设置 limit 参数来限制数量 |
295
- | findAll | 查询表下所有记录,危险操作,建议只对数据量非常小的表使用 |
296
- | findFirst | 查询符合条件的第一条记录 |
297
- | insert | 插入记录 |
298
- | insertMany | 一次性插入多条记录 |
299
- | update | 更新记录,需要完整信息 |
300
- | partialUpdate | 局部更新,只提供 id 和需要更新的字段信息 |
301
- | updateOne | 只更新指定条件的第一条记录,必须是相等条件,不支持范围条件 |
302
- | updateMany | 更新所有符合条件的记录,危险操作,建议对条件严加限制,控制受影响的范围 |
303
- | find | 按条件查询所有符合条件的记录,危险操作,建议尽可能设置 limit 参数来限制数量 |
304
- | count | 统计符合条件的记录数量,危险操作,建议严格限制条件,注意索引的利用 |
305
- | paginate | 分页查询 ,危险操作,基于 find 和 count |
306
- | query | 自定义 sql 查询,返回记录列表,支持预编译 sql |
307
- | modify | 执行自定义 sql,返回操作记录数 ,支持预编译 sql |
287
+ | 方法 | 功能说明 |
288
+ | :------------ | :---------------------------------------------------------------------------------- |
289
+ | findById | 按 id 查询 |
290
+ | findByIdIn | 按 id 列表查询多条记录 |
291
+ | existsBy | 判定指定的条件是否存在记录 |
292
+ | existsById | 判定 id 是否存在 |
293
+ | deleteById | 按 id 删除 |
294
+ | deleteMany | 按指定条件删除,危险操作,建议尽可能设置 limit 参数来限制数量 |
295
+ | findAll | 查询表下所有记录,危险操作,建议只对数据量非常小的表使用 |
296
+ | findFirst | 查询符合条件的第一条记录 |
297
+ | insert | 插入记录 |
298
+ | insertMany | 一次性插入多条记录 |
299
+ | update | 更新记录,需要完整信息 |
300
+ | partialUpdate | 局部更新,只提供 id 和需要更新的字段信息 |
301
+ | updateOne | 只更新指定条件的第一条记录,必须是相等条件,不支持范围条件 |
302
+ | updateMany | 更新所有符合条件的记录,危险操作,建议对条件严加限制,控制受影响的范围 |
303
+ | find | 按条件查询所有符合条件的记录,危险操作,建议尽可能设置 limit 参数来限制数量 |
304
+ | findSelect | 指定字段进行条件查询,与 find 唯一的不同的是多一个参数 select 可以用来指定要返回的列 |
305
+ | count | 统计符合条件的记录数量,危险操作,建议严格限制条件,注意索引的利用 |
306
+ | paginate | 分页查询 ,危险操作,基于 find 和 count |
307
+ | query | 自定义 sql 查询,返回记录列表,支持预编译 sql |
308
+ | modify | 执行自定义 sql,返回操作记录数 ,支持预编译 sql |
308
309
 
309
310
  ### json 类型
310
311
 
@@ -20,8 +20,8 @@ validate(
20
20
 
21
21
  | 函数 | 作用 |
22
22
  | :---------- | :--------------------------------------------------- |
23
- | notNull | 非空校验,不能是 null 或 undefinded |
24
- | notBlank | 字符非空校验,不能是 null 或 undefinded 或空白字符串 |
23
+ | notNull | 非空校验,不能是 null 或 undefined |
24
+ | notBlank | 字符非空校验,不能是 null 或 undefined 或空白字符串 |
25
25
  | min | 校验数字最小值 |
26
26
  | max | 校验数字最大值 |
27
27
  | length | 校验长度,适用于字符串和数组 |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wok-server",
3
- "version": "0.4.13",
3
+ "version": "0.6.0",
4
4
  "packageManager": "pnpm@8.9.0",
5
5
  "description": "一个基于 NodeJs 和 TypeScript 的后端框架,轻量级、克制、简洁。A lightweight, restrained, and concise backend framework based on Node.js and TypeScript.",
6
6
  "scripts": {
@@ -19,6 +19,8 @@
19
19
  "dist/",
20
20
  "docs/",
21
21
  "documentation/",
22
+ "skills/",
23
+ "src/",
22
24
  "README.md"
23
25
  ],
24
26
  "author": "peak",