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
package/README.en.md ADDED
@@ -0,0 +1,61 @@
1
+ [简体中文](./README.md) | English
2
+
3
+ # Wok Server
4
+
5
+ [![npm version](https://img.shields.io/npm/v/wok-server)](https://www.npmjs.com/package/wok-server)
6
+ [![license](https://img.shields.io/npm/l/wok-server)](https://github.com/nicepkg/wok-server/blob/master/LICENSE)
7
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.x-blue)](https://www.typescriptlang.org/)
8
+
9
+ A lightweight, restrained backend framework for Node.js and TypeScript.
10
+
11
+ ## Features
12
+
13
+ - **Infrastructure** — Configuration, Logging, i18n, Caching
14
+ - **Web Layer** — Routing, Validation, MVC
15
+ - **Database** — MySQL, MongoDB
16
+ - **Others** — Scheduled Tasks
17
+
18
+ ## Why Wok Server
19
+
20
+ - Functional-first with minimal OOP, low learning curve
21
+ - Deliberately restrained — no decorators, proxies, or metaprogramming
22
+ - Lightweight wrapper, compatible with the broader HTTP ecosystem
23
+ - Full TypeScript definitions with IDE IntelliSense support
24
+ - Self-documenting code with detailed method and parameter annotations
25
+ - Built-in i18n with extensible language support
26
+
27
+ ## Quick Start
28
+
29
+ ```bash
30
+ npm i wok-server
31
+ ```
32
+
33
+ ```ts
34
+ import { startWebServer } from 'wok-server'
35
+
36
+ startWebServer({
37
+ routers: {
38
+ '/': async exchange => exchange.respondText('Hello world!')
39
+ }
40
+ }).catch(e => {
41
+ console.error('Start server failed', e)
42
+ })
43
+ ```
44
+
45
+ Visit `http://localhost:8080` to see the output.
46
+
47
+ For more configuration via environment variables, see the [full documentation](https://gitee.com/tai/wok-server/blob/master/documentation/zh-cn/index.md).
48
+
49
+ ### Install AI Skills
50
+
51
+ wok-server provides AI skills that help AI coding assistants better understand and use wok-server components.
52
+
53
+ ```bash
54
+ npx skills add peaktai/wok-server --all
55
+ ```
56
+
57
+ If GitHub access is slow, use the Gitee mirror:
58
+
59
+ ```bash
60
+ npx skills add https://gitee.com/tai/wok-server.git --all
61
+ ```
package/README.md CHANGED
@@ -1,57 +1,72 @@
1
+ [English](./README.en.md) | 简体中文
2
+
1
3
  # Wok Server
2
4
 
3
- 一个简洁易用的 Nodejs 后端框架,使用 Typescript 开发,有完整的类型约束和定义,注释详细,文档齐全,支持国际化。
5
+ [![npm version](https://img.shields.io/npm/v/wok-server)](https://www.npmjs.com/package/wok-server)
6
+ [![license](https://img.shields.io/npm/l/wok-server)](https://github.com/nicepkg/wok-server/blob/master/LICENSE)
7
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.x-blue)](https://www.typescriptlang.org/)
4
8
 
5
- 主要功能:配置,日志,国际化,校验,缓存,MVC,mysql,mongodb ,周期任务
9
+ 一个基于 Node.js 和 TypeScript 的后端框架,轻量、克制、简洁。
6
10
 
7
- [查看文档](https://gitee.com/tai/wok-server/blob/master/documentation/zh-cn/index.md)
11
+ ## 功能概览
8
12
 
9
- ## 优点
13
+ - **基础设施** — 配置管理、日志、国际化、缓存
14
+ - **Web 层** — 路由、参数校验、MVC
15
+ - **数据库** — MySQL、MongoDB
16
+ - **其他** — 周期任务
10
17
 
11
- - 学习成本较低,函数式为主,少量面向对象,未使用代理和装饰器等增强技术
12
- - 功能简单,使用方便,保持克制,不引入太多特性
13
- - 轻量封装,最大限度兼容已有生态,支持集成第三方 http 相关的库来处理请求
14
- - 支持国际化,自带多种语言的支持,国际化内容支持扩展
15
- - 有完整的类型约束和定义,结合 IDE 的代码补全功能,开发效率高
16
- - 注释详细,文档就在代码中,方法和参数都有详细说明,可在 IDE 的辅助下方便查看
18
+ ## 为什么选择 Wok Server
17
19
 
18
- ## Hello world
20
+ - 函数式为主,少量面向对象,学习成本低
21
+ - 保持克制,不引入代理、装饰器等增强技术
22
+ - 轻量封装,兼容第三方 HTTP 生态
23
+ - 完整的类型定义,配合 IDE 智能补全,开发效率高
24
+ - 注释即文档,方法及参数均有详细说明
25
+ - 内置国际化支持,可扩展多语言
19
26
 
20
- 安装:
27
+ ## 快速开始
21
28
 
29
+ ```bash
30
+ npm i wok-server
22
31
  ```
23
- npm i wok-server --save
24
- ```
25
-
26
- 入口文件:
27
32
 
28
33
  ```ts
29
34
  import { startWebServer } from 'wok-server'
30
35
 
31
36
  startWebServer({
32
37
  routers: {
33
- '/': async exchange => exchange.respondText('Hello world !')
38
+ '/': async exchange => exchange.respondText('Hello world!')
34
39
  }
35
40
  }).catch(e => {
36
41
  console.error('Start server failed', e)
37
42
  })
38
43
  ```
39
44
 
40
- 上面的代码启动了 web 服务,访问路径 `http://localhost:8080` 将输出文本 “Hello world !”。
45
+ 启动后访问 `http://localhost:8080` 即可看到输出。
46
+
47
+ 更多配置通过环境变量设置,详见[完整文档](https://gitee.com/tai/wok-server/blob/master/documentation/zh-cn/index.md)。
48
+
49
+ ### AI 技能安装
50
+
51
+ wok-server 提供了 AI 技能,安装后可以让 AI 编程助手更好地理解和使用 wok-server 组件。
41
52
 
42
- 相关的设置可以通过环境变量来修改,查看[完整文档](https://gitee.com/tai/wok-server/blob/master/documentation/zh-cn/index.md)了解细节。
43
53
 
44
- ## 一些问题的说明
54
+ ```bash
55
+ npx skills add peaktai/wok-server --all
56
+ ```
57
+
58
+ 国内用户访问 github 速度慢,可以使用 gitee 仓库地址来安装。
59
+
60
+ ```bash
61
+ npx skills add https://gitee.com/tai/wok-server.git --all
62
+ ```
63
+
64
+ ## FAQ
45
65
 
46
- ### 为什么直接集成依赖库
66
+ ### 为什么内置 MySQL 和 MongoDB 驱动?
47
67
 
48
- 项目中对 mysql 客户端和 mongodb 的驱动直接打包集成了,也没有将这两个组件
49
- 单独拆分成一个独立的包以供按需引入。这样做是为了方便,不需要安装那么多包,安装的包多了
50
- 之后,还有可能需要解决依赖冲突问题,找到版本匹配的包,使用和维护都麻烦。对于后端程序来说,
51
- 体积大一些问题也不大。
68
+ mysql2 mongodb 驱动已直接集成,安装一个包即可使用,避免多个包的版本冲突和维护成本。对于后端应用,包体积的增加影响有限。
52
69
 
53
- ### 为什么部分可选功能需要第三方库,而又没有集成
70
+ ### 为什么 WebSocket、文件上传等功能需要自行引入?
54
71
 
55
- 对于 wesocket 和文件上传等功能,框架没有实现,而是需要使用者引入第三方库,框架没有集成这些库。
56
- 这些库是基于 Nodejs 内置的模块 http,不用担心与框架的兼容性问题,框架只要保持支持即可,
57
- 也可以充分利用已有的生态,不需要专门为框架编写扩展。
72
+ 这些功能基于 Node.js 原生 `http` 模块,天然兼容框架,无需专门适配。由用户按需引入第三方库,可以充分利用社区生态,同时减少框架的维护负担。
@@ -1,98 +1,98 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Cache = void 0;
4
- const config_1 = require("./config");
5
- class Cache {
6
- valueMap;
7
- stat;
8
- /**
9
- * promise 表,作用是处理异步并发问题,如果有相同的 key 同时请求,保证异步的 provider 只执行一次
10
- */
11
- promiseMap = new Map();
12
- constructor(valueMap, stat) {
13
- this.valueMap = valueMap;
14
- this.stat = stat;
15
- }
16
- /**
17
- * 放入缓存
18
- * @param key
19
- * @param val
20
- * @param expiresInSeconds
21
- */
22
- put(key, val, expiresInSeconds) {
23
- const finalExpiresInSeconds = typeof expiresInSeconds === 'number' ? expiresInSeconds : config_1.config.defaultExpireInSeconds;
24
- this.valueMap.set(key, {
25
- val,
26
- expireAt: new Date().getTime() + finalExpiresInSeconds * 1000
27
- });
28
- }
29
- /**
30
- * 获取缓存值
31
- * @param key
32
- * @returns
33
- */
34
- get(key) {
35
- const content = this.valueMap.get(key);
36
- if (!content) {
37
- this.stat?.addGet(false);
38
- return undefined;
39
- }
40
- if (content.expireAt < new Date().getTime()) {
41
- this.stat?.addGet(false);
42
- this.valueMap.delete(key);
43
- return undefined;
44
- }
45
- this.stat?.addGet(true);
46
- return content.val;
47
- }
48
- /**
49
- * 清除所有缓存
50
- */
51
- clear() {
52
- this.valueMap.clear();
53
- this.stat?.clear();
54
- }
55
- /**
56
- * 删除.
57
- * @param key
58
- */
59
- remove(key) {
60
- this.valueMap.delete(key);
61
- }
62
- /**
63
- * 在缓存值不存在时计算缓存的值,然后放入并返回.
64
- * @param key
65
- * @param provider
66
- * @param expiresInSeconds
67
- */
68
- async computeIfAbsent(key, provider, expiresInSeconds) {
69
- const content = this.valueMap.get(key);
70
- if (content && content.expireAt >= new Date().getTime()) {
71
- this.stat?.addGet(true);
72
- return content.val;
73
- }
74
- this.stat?.addGet(false);
75
- // 如果已经在处理中,则直接返回 promise
76
- const ep = this.promiseMap.get(key);
77
- if (ep) {
78
- return ep;
79
- }
80
- // 创建新的异步流程
81
- const promise = Promise.resolve().then(async () => {
82
- try {
83
- const finalExpireInSeconds = typeof expiresInSeconds === 'number' ? expiresInSeconds : config_1.config.defaultExpireInSeconds;
84
- // 计算值
85
- const res = provider();
86
- const val = res instanceof Promise ? await res : res;
87
- this.put(key, val, finalExpireInSeconds);
88
- return val;
89
- }
90
- finally {
91
- this.promiseMap.delete(key);
92
- }
93
- });
94
- this.promiseMap.set(key, promise);
95
- return promise;
96
- }
97
- }
98
- exports.Cache = Cache;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Cache = void 0;
4
+ const config_1 = require("./config");
5
+ class Cache {
6
+ valueMap;
7
+ stat;
8
+ /**
9
+ * promise 表,作用是处理异步并发问题,如果有相同的 key 同时请求,保证异步的 provider 只执行一次
10
+ */
11
+ promiseMap = new Map();
12
+ constructor(valueMap, stat) {
13
+ this.valueMap = valueMap;
14
+ this.stat = stat;
15
+ }
16
+ /**
17
+ * 放入缓存
18
+ * @param key
19
+ * @param val
20
+ * @param expiresInSeconds
21
+ */
22
+ put(key, val, expiresInSeconds) {
23
+ const finalExpiresInSeconds = typeof expiresInSeconds === 'number' ? expiresInSeconds : config_1.config.defaultExpireInSeconds;
24
+ this.valueMap.set(key, {
25
+ val,
26
+ expireAt: new Date().getTime() + finalExpiresInSeconds * 1000
27
+ });
28
+ }
29
+ /**
30
+ * 获取缓存值
31
+ * @param key
32
+ * @returns
33
+ */
34
+ get(key) {
35
+ const content = this.valueMap.get(key);
36
+ if (!content) {
37
+ this.stat?.addGet(false);
38
+ return undefined;
39
+ }
40
+ if (content.expireAt < new Date().getTime()) {
41
+ this.stat?.addGet(false);
42
+ this.valueMap.delete(key);
43
+ return undefined;
44
+ }
45
+ this.stat?.addGet(true);
46
+ return content.val;
47
+ }
48
+ /**
49
+ * 清除所有缓存
50
+ */
51
+ clear() {
52
+ this.valueMap.clear();
53
+ this.stat?.clear();
54
+ }
55
+ /**
56
+ * 删除.
57
+ * @param key
58
+ */
59
+ remove(key) {
60
+ this.valueMap.delete(key);
61
+ }
62
+ /**
63
+ * 在缓存值不存在时计算缓存的值,然后放入并返回.
64
+ * @param key
65
+ * @param provider
66
+ * @param expiresInSeconds
67
+ */
68
+ async computeIfAbsent(key, provider, expiresInSeconds) {
69
+ const content = this.valueMap.get(key);
70
+ if (content && content.expireAt >= new Date().getTime()) {
71
+ this.stat?.addGet(true);
72
+ return content.val;
73
+ }
74
+ this.stat?.addGet(false);
75
+ // 如果已经在处理中,则直接返回 promise
76
+ const ep = this.promiseMap.get(key);
77
+ if (ep) {
78
+ return ep;
79
+ }
80
+ // 创建新的异步流程
81
+ const promise = Promise.resolve().then(async () => {
82
+ try {
83
+ const finalExpireInSeconds = typeof expiresInSeconds === 'number' ? expiresInSeconds : config_1.config.defaultExpireInSeconds;
84
+ // 计算值
85
+ const res = provider();
86
+ const val = res instanceof Promise ? await res : res;
87
+ this.put(key, val, finalExpireInSeconds);
88
+ return val;
89
+ }
90
+ finally {
91
+ this.promiseMap.delete(key);
92
+ }
93
+ });
94
+ this.promiseMap.set(key, promise);
95
+ return promise;
96
+ }
97
+ }
98
+ exports.Cache = Cache;
@@ -1,19 +1,19 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.config = void 0;
4
- const config_1 = require("../config");
5
- const validation_1 = require("../validation");
6
- const ENV_PREFIX = 'CACHE';
7
- exports.config = (0, config_1.registerConfig)({
8
- defaultExpireInSeconds: 60,
9
- statTaskEnabled: false,
10
- statInterval: 300,
11
- maxElements: 1024,
12
- cleaningInterval: 60
13
- }, ENV_PREFIX, {
14
- defaultExpireInSeconds: [(0, validation_1.notNull)(), (0, validation_1.min)(1), (0, validation_1.max)(3600)],
15
- statTaskEnabled: [(0, validation_1.notNull)()],
16
- statInterval: [(0, validation_1.notNull)(), (0, validation_1.min)(1), (0, validation_1.max)(3600 * 24)],
17
- maxElements: [(0, validation_1.notNull)(), (0, validation_1.min)(1), (0, validation_1.max)(Number.MAX_VALUE)],
18
- cleaningInterval: [(0, validation_1.notNull)(), (0, validation_1.min)(1), (0, validation_1.max)(3600)]
19
- });
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ const config_1 = require("../config");
5
+ const validation_1 = require("../validation");
6
+ const ENV_PREFIX = 'CACHE';
7
+ exports.config = (0, config_1.registerConfig)({
8
+ defaultExpireInSeconds: 60,
9
+ statTaskEnabled: false,
10
+ statInterval: 300,
11
+ maxElements: 1024,
12
+ cleaningInterval: 60
13
+ }, ENV_PREFIX, {
14
+ defaultExpireInSeconds: [(0, validation_1.notNull)(), (0, validation_1.min)(1), (0, validation_1.max)(3600)],
15
+ statTaskEnabled: [(0, validation_1.notNull)()],
16
+ statInterval: [(0, validation_1.notNull)(), (0, validation_1.min)(1), (0, validation_1.max)(3600 * 24)],
17
+ maxElements: [(0, validation_1.notNull)(), (0, validation_1.min)(1), (0, validation_1.max)(Number.MAX_VALUE)],
18
+ cleaningInterval: [(0, validation_1.notNull)(), (0, validation_1.min)(1), (0, validation_1.max)(3600)]
19
+ });
@@ -1,27 +1,27 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getCache = void 0;
4
- const task_1 = require("../task");
5
- const cache_1 = require("./cache");
6
- const config_1 = require("./config");
7
- const purge_task_1 = require("./purge-task");
8
- const stat_1 = require("./stat");
9
- const valueMap = new Map();
10
- const stat = config_1.config.statTaskEnabled ? new stat_1.CacheStat(valueMap) : undefined;
11
- const cache = new cache_1.Cache(valueMap, stat);
12
- // 清理任务
13
- (0, task_1.scheduleWithFixedDelay)(config_1.config.cleaningInterval, config_1.config.cleaningInterval, new purge_task_1.PurgeTask(valueMap));
14
- // 统计任务
15
- if (config_1.config.statTaskEnabled) {
16
- (0, task_1.scheduleWithFixedDelay)(config_1.config.statInterval, config_1.config.statInterval, {
17
- name: 'Cache statistics',
18
- async run() {
19
- stat?.log();
20
- stat?.clear();
21
- }
22
- });
23
- }
24
- function getCache() {
25
- return cache;
26
- }
27
- exports.getCache = getCache;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getCache = void 0;
4
+ const task_1 = require("../task");
5
+ const cache_1 = require("./cache");
6
+ const config_1 = require("./config");
7
+ const purge_task_1 = require("./purge-task");
8
+ const stat_1 = require("./stat");
9
+ const valueMap = new Map();
10
+ const stat = config_1.config.statTaskEnabled ? new stat_1.CacheStat(valueMap) : undefined;
11
+ const cache = new cache_1.Cache(valueMap, stat);
12
+ // 清理任务
13
+ (0, task_1.scheduleWithFixedDelay)(config_1.config.cleaningInterval, config_1.config.cleaningInterval, new purge_task_1.PurgeTask(valueMap));
14
+ // 统计任务
15
+ if (config_1.config.statTaskEnabled) {
16
+ (0, task_1.scheduleWithFixedDelay)(config_1.config.statInterval, config_1.config.statInterval, {
17
+ name: 'Cache statistics',
18
+ async run() {
19
+ stat?.log();
20
+ stat?.clear();
21
+ }
22
+ });
23
+ }
24
+ function getCache() {
25
+ return cache;
26
+ }
27
+ exports.getCache = getCache;
@@ -1,46 +1,46 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PurgeTask = void 0;
4
- const log_1 = require("../log");
5
- const config_1 = require("./config");
6
- /**
7
- * 缓存清理任务
8
- */
9
- class PurgeTask {
10
- valueMap;
11
- name = 'Cache purge';
12
- constructor(valueMap) {
13
- this.valueMap = valueMap;
14
- }
15
- async run() {
16
- let removeCount = 0;
17
- for (const entry of this.valueMap.entries()) {
18
- const [key, value] = entry;
19
- if (value.expireAt < new Date().getTime()) {
20
- this.valueMap.delete(key);
21
- removeCount++;
22
- }
23
- }
24
- if (removeCount > 0) {
25
- (0, log_1.getLogger)().info(`A total of ${removeCount} expired cache ${removeCount > 1 ? 'records' : 'record'} have been cleared.`);
26
- }
27
- // 如果过期的都清理掉,但是元素总数仍然超出,则删除多余元素,删除是从头开始删除的
28
- // 看上去是按put顺序清理最早的,实际上随机的,重复 set 相同的 key,key 的位置是不会变的,不保证 key 的顺序
29
- // 所以,缓存是随机驱逐的
30
- // 目前没有考虑支持其它的策略,因为需要额外记录信息,清理的逻辑也可能更复杂
31
- // nodejs 是单线程模式的,规模上去后,可能需要执行较长的时间带来阻塞
32
- if (this.valueMap.size > config_1.config.maxElements) {
33
- let diff = this.valueMap.size - config_1.config.maxElements;
34
- let evictedCount = 0;
35
- for (const key of this.valueMap.keys()) {
36
- this.valueMap.delete(key);
37
- evictedCount++;
38
- if (evictedCount >= diff) {
39
- break;
40
- }
41
- }
42
- (0, log_1.getLogger)().info(`A total of ${evictedCount} cache ${evictedCount > 1 ? 'records' : 'record'} have been evicted.`);
43
- }
44
- }
45
- }
46
- exports.PurgeTask = PurgeTask;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PurgeTask = void 0;
4
+ const log_1 = require("../log");
5
+ const config_1 = require("./config");
6
+ /**
7
+ * 缓存清理任务
8
+ */
9
+ class PurgeTask {
10
+ valueMap;
11
+ name = 'Cache purge';
12
+ constructor(valueMap) {
13
+ this.valueMap = valueMap;
14
+ }
15
+ async run() {
16
+ let removeCount = 0;
17
+ for (const entry of this.valueMap.entries()) {
18
+ const [key, value] = entry;
19
+ if (value.expireAt < new Date().getTime()) {
20
+ this.valueMap.delete(key);
21
+ removeCount++;
22
+ }
23
+ }
24
+ if (removeCount > 0) {
25
+ (0, log_1.getLogger)().info(`A total of ${removeCount} expired cache ${removeCount > 1 ? 'records' : 'record'} have been cleared.`);
26
+ }
27
+ // 如果过期的都清理掉,但是元素总数仍然超出,则删除多余元素,删除是从头开始删除的
28
+ // 看上去是按put顺序清理最早的,实际上随机的,重复 set 相同的 key,key 的位置是不会变的,不保证 key 的顺序
29
+ // 所以,缓存是随机驱逐的
30
+ // 目前没有考虑支持其它的策略,因为需要额外记录信息,清理的逻辑也可能更复杂
31
+ // nodejs 是单线程模式的,规模上去后,可能需要执行较长的时间带来阻塞
32
+ if (this.valueMap.size > config_1.config.maxElements) {
33
+ let diff = this.valueMap.size - config_1.config.maxElements;
34
+ let evictedCount = 0;
35
+ for (const key of this.valueMap.keys()) {
36
+ this.valueMap.delete(key);
37
+ evictedCount++;
38
+ if (evictedCount >= diff) {
39
+ break;
40
+ }
41
+ }
42
+ (0, log_1.getLogger)().info(`A total of ${evictedCount} cache ${evictedCount > 1 ? 'records' : 'record'} have been evicted.`);
43
+ }
44
+ }
45
+ }
46
+ exports.PurgeTask = PurgeTask;
@@ -1,47 +1,47 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CacheStat = void 0;
4
- const log_1 = require("../log");
5
- const date_1 = require("../log/date");
6
- const config_1 = require("./config");
7
- /**
8
- * 缓存统计.
9
- */
10
- class CacheStat {
11
- valueMap;
12
- /**
13
- * 开始统计时间
14
- */
15
- start;
16
- totalGet = 0;
17
- totalHit = 0;
18
- constructor(valueMap) {
19
- this.valueMap = valueMap;
20
- this.start = new Date();
21
- }
22
- /**
23
- * 添加 get 次数
24
- * @param hit 是否命中
25
- */
26
- addGet(hit) {
27
- this.totalGet++;
28
- if (hit) {
29
- this.totalHit++;
30
- }
31
- }
32
- /**
33
- * 清空统计信息,重新开始统计.
34
- */
35
- clear() {
36
- this.start = new Date();
37
- this.totalGet = 0;
38
- this.totalHit = 0;
39
- }
40
- /**
41
- * 输出日志
42
- */
43
- log() {
44
- (0, log_1.getLogger)().info(`Cache statistics,time window :${(0, date_1.formatDateTime)(this.start)} - now, hit :${this.totalHit}/${this.totalGet},capacity:${this.valueMap.size}/${config_1.config.maxElements}`);
45
- }
46
- }
47
- exports.CacheStat = CacheStat;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CacheStat = void 0;
4
+ const log_1 = require("../log");
5
+ const date_1 = require("../log/date");
6
+ const config_1 = require("./config");
7
+ /**
8
+ * 缓存统计.
9
+ */
10
+ class CacheStat {
11
+ valueMap;
12
+ /**
13
+ * 开始统计时间
14
+ */
15
+ start;
16
+ totalGet = 0;
17
+ totalHit = 0;
18
+ constructor(valueMap) {
19
+ this.valueMap = valueMap;
20
+ this.start = new Date();
21
+ }
22
+ /**
23
+ * 添加 get 次数
24
+ * @param hit 是否命中
25
+ */
26
+ addGet(hit) {
27
+ this.totalGet++;
28
+ if (hit) {
29
+ this.totalHit++;
30
+ }
31
+ }
32
+ /**
33
+ * 清空统计信息,重新开始统计.
34
+ */
35
+ clear() {
36
+ this.start = new Date();
37
+ this.totalGet = 0;
38
+ this.totalHit = 0;
39
+ }
40
+ /**
41
+ * 输出日志
42
+ */
43
+ log() {
44
+ (0, log_1.getLogger)().info(`Cache statistics,time window :${(0, date_1.formatDateTime)(this.start)} - now, hit :${this.totalHit}/${this.totalGet},capacity:${this.valueMap.size}/${config_1.config.maxElements}`);
45
+ }
46
+ }
47
+ exports.CacheStat = CacheStat;