wok-server 0.5.0 → 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 (372) 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 -35
  31. package/dist/log/date.js +21 -21
  32. package/dist/log/file.js +198 -198
  33. package/dist/log/index.js +135 -135
  34. package/dist/log/level.js +33 -33
  35. package/dist/log/log.js +56 -56
  36. package/dist/log/store.js +19 -19
  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 -239
  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 -169
  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 -103
  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/mvc.md +66 -24
  129. package/package.json +3 -1
  130. package/skills/wok-server-api-rules/SKILL.md +350 -0
  131. package/skills/wok-server-cache/SKILL.md +216 -0
  132. package/skills/wok-server-config/SKILL.md +200 -0
  133. package/skills/wok-server-getting-started/SKILL.md +123 -0
  134. package/skills/wok-server-getting-started/references/engineering.md +169 -0
  135. package/skills/wok-server-http-client/SKILL.md +164 -0
  136. package/skills/wok-server-i18n/SKILL.md +214 -0
  137. package/skills/wok-server-lock/SKILL.md +144 -0
  138. package/skills/wok-server-log/SKILL.md +218 -0
  139. package/skills/wok-server-mongodb/SKILL.md +235 -0
  140. package/skills/wok-server-mvc/SKILL.md +251 -0
  141. package/skills/wok-server-mvc/references/respond-html.md +157 -0
  142. package/skills/wok-server-mvc/references/sse.md +121 -0
  143. package/skills/wok-server-mvc/references/static-files.md +47 -0
  144. package/skills/wok-server-mvc/references/upload.md +62 -0
  145. package/skills/wok-server-mvc/references/websocket.md +30 -0
  146. package/skills/wok-server-mysql/SKILL.md +315 -0
  147. package/skills/wok-server-mysql/references/multi-datasource.md +76 -0
  148. package/skills/wok-server-mysql/references/version-control.md +22 -0
  149. package/skills/wok-server-task/SKILL.md +158 -0
  150. package/skills/wok-server-validate/SKILL.md +167 -0
  151. package/src/cache/cache.ts +118 -0
  152. package/src/cache/config.ts +53 -0
  153. package/src/cache/index.ts +27 -0
  154. package/src/cache/purge-task.ts +53 -0
  155. package/src/cache/stat.ts +47 -0
  156. package/src/config/convert.ts +27 -0
  157. package/src/config/exception.ts +8 -0
  158. package/src/config/index.ts +92 -0
  159. package/src/http-client/index.ts +202 -0
  160. package/src/i18n/ar.ts +16 -0
  161. package/src/i18n/de.ts +16 -0
  162. package/src/i18n/en-us.ts +16 -0
  163. package/src/i18n/es.ts +16 -0
  164. package/src/i18n/fr.ts +16 -0
  165. package/src/i18n/i18n.ts +230 -0
  166. package/src/i18n/index.ts +50 -0
  167. package/src/i18n/ja.ts +16 -0
  168. package/src/i18n/ko.ts +16 -0
  169. package/src/i18n/msg.ts +50 -0
  170. package/src/i18n/pt.ts +16 -0
  171. package/src/i18n/ru.ts +16 -0
  172. package/src/i18n/tag.ts +18 -0
  173. package/src/i18n/zh-HK.ts +16 -0
  174. package/src/i18n/zh-TW.ts +16 -0
  175. package/src/i18n/zh-cn.ts +16 -0
  176. package/src/index.ts +11 -0
  177. package/src/lock/index.ts +164 -0
  178. package/src/log/config.ts +71 -0
  179. package/src/log/date.ts +19 -0
  180. package/src/log/file.ts +215 -0
  181. package/src/log/index.ts +136 -0
  182. package/src/log/level.ts +29 -0
  183. package/src/log/log.ts +77 -0
  184. package/src/log/store.ts +31 -0
  185. package/src/mongodb/collection.ts +25 -0
  186. package/src/mongodb/config.ts +69 -0
  187. package/src/mongodb/doc.ts +12 -0
  188. package/src/mongodb/exception.ts +8 -0
  189. package/src/mongodb/index.ts +71 -0
  190. package/src/mongodb/manager/base.ts +674 -0
  191. package/src/mongodb/manager/index.ts +80 -0
  192. package/src/mongodb/manager/tx-strict.ts +153 -0
  193. package/src/mongodb/manager/tx.ts +34 -0
  194. package/src/mongodb/migration.ts +66 -0
  195. package/src/mvc/access-log.ts +33 -0
  196. package/src/mvc/config.ts +70 -0
  197. package/src/mvc/exchange.ts +126 -0
  198. package/src/mvc/handler/index.ts +4 -0
  199. package/src/mvc/handler/json.ts +96 -0
  200. package/src/mvc/handler/restful.ts +39 -0
  201. package/src/mvc/handler/sse.ts +90 -0
  202. package/src/mvc/handler/upload.ts +54 -0
  203. package/src/mvc/index.ts +48 -0
  204. package/src/mvc/interceptor.ts +12 -0
  205. package/src/mvc/query.ts +36 -0
  206. package/src/mvc/render/file.ts +148 -0
  207. package/src/mvc/render/html/html.ts +187 -0
  208. package/src/mvc/render/html/index.ts +16 -0
  209. package/src/mvc/render/html/style.ts +1201 -0
  210. package/src/mvc/render/index.ts +4 -0
  211. package/src/mvc/render/json.ts +24 -0
  212. package/src/mvc/render/text.ts +14 -0
  213. package/src/mvc/router.ts +13 -0
  214. package/src/mvc/server.ts +315 -0
  215. package/src/mvc/static/header.ts +86 -0
  216. package/src/mvc/static/index.ts +3 -0
  217. package/src/mvc/static/mime-type.ts +81 -0
  218. package/src/mvc/static/server-cache-config.ts +92 -0
  219. package/src/mvc/static/server-cache.ts +171 -0
  220. package/src/mvc/static/static-handler.ts +445 -0
  221. package/src/mysql/config.ts +130 -0
  222. package/src/mysql/exception.ts +8 -0
  223. package/src/mysql/index.ts +88 -0
  224. package/src/mysql/manager/base.ts +285 -0
  225. package/src/mysql/manager/index.ts +112 -0
  226. package/src/mysql/manager/ops/count.ts +30 -0
  227. package/src/mysql/manager/ops/criteria.ts +412 -0
  228. package/src/mysql/manager/ops/delete.ts +96 -0
  229. package/src/mysql/manager/ops/exist.ts +41 -0
  230. package/src/mysql/manager/ops/find.ts +226 -0
  231. package/src/mysql/manager/ops/index.ts +11 -0
  232. package/src/mysql/manager/ops/insert.ts +120 -0
  233. package/src/mysql/manager/ops/modify.ts +14 -0
  234. package/src/mysql/manager/ops/paginate.ts +60 -0
  235. package/src/mysql/manager/ops/query.ts +13 -0
  236. package/src/mysql/manager/ops/update.ts +294 -0
  237. package/src/mysql/manager/ops/utils.ts +20 -0
  238. package/src/mysql/manager/tx-strict.ts +138 -0
  239. package/src/mysql/manager/tx.ts +31 -0
  240. package/src/mysql/manager/utils.ts +75 -0
  241. package/src/mysql/migration.ts +149 -0
  242. package/src/mysql/table-info.ts +41 -0
  243. package/src/task/daily.ts +70 -0
  244. package/src/task/fixed-delay.ts +45 -0
  245. package/src/task/fixed-rate.ts +49 -0
  246. package/src/task/index.ts +4 -0
  247. package/src/task/task.ts +70 -0
  248. package/src/validation/exception.ts +27 -0
  249. package/src/validation/index.ts +61 -0
  250. package/src/validation/validator/array.ts +32 -0
  251. package/src/validation/validator/enum.ts +25 -0
  252. package/src/validation/validator/index.ts +11 -0
  253. package/src/validation/validator/length.ts +42 -0
  254. package/src/validation/validator/max-length.ts +33 -0
  255. package/src/validation/validator/max.ts +26 -0
  256. package/src/validation/validator/min-length.ts +31 -0
  257. package/src/validation/validator/min.ts +26 -0
  258. package/src/validation/validator/not-blank.ts +31 -0
  259. package/src/validation/validator/not-null.ts +19 -0
  260. package/src/validation/validator/plain-obj.ts +30 -0
  261. package/src/validation/validator/regexp.ts +32 -0
  262. package/types/cache/cache.d.ts +52 -52
  263. package/types/cache/config.d.ts +32 -32
  264. package/types/cache/index.d.ts +2 -2
  265. package/types/cache/purge-task.d.ts +11 -11
  266. package/types/cache/stat.d.ts +26 -26
  267. package/types/config/convert.d.ts +6 -6
  268. package/types/config/exception.d.ts +7 -7
  269. package/types/config/index.d.ts +25 -25
  270. package/types/http-client/index.d.ts +71 -71
  271. package/types/i18n/ar.d.ts +2 -2
  272. package/types/i18n/de.d.ts +2 -2
  273. package/types/i18n/en-us.d.ts +2 -2
  274. package/types/i18n/es.d.ts +2 -2
  275. package/types/i18n/fr.d.ts +2 -2
  276. package/types/i18n/i18n.d.ts +102 -102
  277. package/types/i18n/index.d.ts +9 -9
  278. package/types/i18n/ja.d.ts +2 -2
  279. package/types/i18n/ko.d.ts +2 -2
  280. package/types/i18n/msg.d.ts +50 -50
  281. package/types/i18n/pt.d.ts +2 -2
  282. package/types/i18n/ru.d.ts +2 -2
  283. package/types/i18n/tag.d.ts +11 -11
  284. package/types/i18n/zh-HK.d.ts +2 -2
  285. package/types/i18n/zh-TW.d.ts +2 -2
  286. package/types/i18n/zh-cn.d.ts +2 -2
  287. package/types/index.d.ts +11 -11
  288. package/types/lock/index.d.ts +64 -64
  289. package/types/log/config.d.ts +35 -35
  290. package/types/log/date.d.ts +2 -2
  291. package/types/log/file.d.ts +13 -13
  292. package/types/log/index.d.ts +53 -53
  293. package/types/log/level.d.ts +14 -14
  294. package/types/log/log.d.ts +40 -40
  295. package/types/log/store.d.ts +19 -19
  296. package/types/mongodb/collection.d.ts +25 -25
  297. package/types/mongodb/config.d.ts +45 -45
  298. package/types/mongodb/doc.d.ts +11 -11
  299. package/types/mongodb/exception.d.ts +7 -7
  300. package/types/mongodb/index.d.ts +29 -29
  301. package/types/mongodb/manager/base.d.ts +188 -188
  302. package/types/mongodb/manager/index.d.ts +38 -38
  303. package/types/mongodb/manager/tx-strict.d.ts +41 -41
  304. package/types/mongodb/manager/tx.d.ts +21 -21
  305. package/types/mongodb/migration.d.ts +12 -12
  306. package/types/mvc/access-log.d.ts +7 -7
  307. package/types/mvc/config.d.ts +42 -42
  308. package/types/mvc/exchange.d.ts +72 -72
  309. package/types/mvc/handler/index.d.ts +4 -3
  310. package/types/mvc/handler/json.d.ts +44 -44
  311. package/types/mvc/handler/restful.d.ts +11 -11
  312. package/types/mvc/handler/sse.d.ts +34 -0
  313. package/types/mvc/handler/upload.d.ts +36 -36
  314. package/types/mvc/index.d.ts +22 -22
  315. package/types/mvc/interceptor.d.ts +11 -11
  316. package/types/mvc/query.d.ts +13 -13
  317. package/types/mvc/render/file.d.ts +10 -10
  318. package/types/mvc/render/html/html.d.ts +98 -98
  319. package/types/mvc/render/html/index.d.ts +11 -11
  320. package/types/mvc/render/html/style.d.ts +1201 -1201
  321. package/types/mvc/render/index.d.ts +4 -4
  322. package/types/mvc/render/json.d.ts +17 -17
  323. package/types/mvc/render/text.d.ts +10 -10
  324. package/types/mvc/router.d.ts +11 -11
  325. package/types/mvc/server.d.ts +90 -90
  326. package/types/mvc/static/header.d.ts +27 -27
  327. package/types/mvc/static/index.d.ts +3 -3
  328. package/types/mvc/static/mime-type.d.ts +2 -2
  329. package/types/mvc/static/server-cache-config.d.ts +30 -30
  330. package/types/mvc/static/server-cache.d.ts +76 -76
  331. package/types/mvc/static/static-handler.d.ts +77 -77
  332. package/types/mysql/config.d.ts +90 -90
  333. package/types/mysql/exception.d.ts +7 -7
  334. package/types/mysql/index.d.ts +16 -16
  335. package/types/mysql/manager/base.d.ts +165 -165
  336. package/types/mysql/manager/index.d.ts +36 -36
  337. package/types/mysql/manager/ops/count.d.ts +13 -13
  338. package/types/mysql/manager/ops/criteria.d.ts +134 -134
  339. package/types/mysql/manager/ops/delete.d.ts +46 -46
  340. package/types/mysql/manager/ops/exist.d.ts +6 -6
  341. package/types/mysql/manager/ops/find.d.ts +86 -86
  342. package/types/mysql/manager/ops/index.d.ts +10 -10
  343. package/types/mysql/manager/ops/insert.d.ts +18 -18
  344. package/types/mysql/manager/ops/modify.d.ts +3 -3
  345. package/types/mysql/manager/ops/paginate.d.ts +36 -36
  346. package/types/mysql/manager/ops/query.d.ts +3 -3
  347. package/types/mysql/manager/ops/update.d.ts +76 -76
  348. package/types/mysql/manager/ops/utils.d.ts +5 -5
  349. package/types/mysql/manager/tx-strict.d.ts +36 -36
  350. package/types/mysql/manager/tx.d.ts +15 -15
  351. package/types/mysql/manager/utils.d.ts +17 -17
  352. package/types/mysql/migration.d.ts +8 -8
  353. package/types/mysql/table-info.d.ts +36 -36
  354. package/types/task/daily.d.ts +16 -16
  355. package/types/task/fixed-delay.d.ts +9 -9
  356. package/types/task/fixed-rate.d.ts +9 -9
  357. package/types/task/index.d.ts +4 -4
  358. package/types/task/task.d.ts +34 -34
  359. package/types/validation/exception.d.ts +38 -38
  360. package/types/validation/index.d.ts +32 -32
  361. package/types/validation/validator/array.d.ts +5 -5
  362. package/types/validation/validator/enum.d.ts +8 -8
  363. package/types/validation/validator/index.d.ts +11 -11
  364. package/types/validation/validator/length.d.ts +10 -10
  365. package/types/validation/validator/max-length.d.ts +8 -8
  366. package/types/validation/validator/max.d.ts +7 -7
  367. package/types/validation/validator/min-length.d.ts +6 -6
  368. package/types/validation/validator/min.d.ts +7 -7
  369. package/types/validation/validator/not-blank.d.ts +7 -7
  370. package/types/validation/validator/not-null.d.ts +6 -6
  371. package/types/validation/validator/plain-obj.d.ts +7 -7
  372. package/types/validation/validator/regexp.d.ts +8 -8
@@ -0,0 +1,552 @@
1
+ # MySQL
2
+
3
+ The MySQL component is built on top of [mysql2](https://www.npmjs.com/package/mysql2), providing convenient single-table operations with support for multiple data sources and version management.
4
+
5
+ Use the enableMysql function to enable MySQL. The configuration name parameter is optional, defaulting to MYSQL.
6
+
7
+ ## Environment Variables
8
+
9
+ Below are all environment variable configurations using the default name MYSQL. If using multiple data sources, replace the MYSQL prefix with a custom name. See initialization section for details.
10
+
11
+ | Environment Variable | Description |
12
+ | :-------------------------------- | :-------------------------------------------------------------------------- |
13
+ | MYSQL_HOST | Hostname |
14
+ | MYSQL_PORT | Port number |
15
+ | MYSQL_USER | Username |
16
+ | MYSQL_PASSWORD | Password |
17
+ | MYSQL_CHARSET | Character set, default utf8mb4 |
18
+ | MYSQL_DATABASE | Database name |
19
+ | MYSQL_VERSION_CONTROL_ENABLED | Enable version control |
20
+ | MYSQL_VERSION_CONTROL_DIR | Version control directory, default db_migration |
21
+ | MYSQL_TIMEZONE | Timezone, default +08:00 |
22
+ | MYSQL_CONNECT_TIMEOUT | Connection timeout in milliseconds, default 10000 |
23
+ | MYSQL_DEBUG | Debug mode. Set to true to output executed SQL |
24
+ | MYSQL_CONNECTION_LIMIT | Maximum connections |
25
+ | MYSQL_MAX_IDLE | Maximum idle connections |
26
+ | MYSQL_IDLE_TIMEOUT | Idle timeout in milliseconds (when a connection becomes idle) |
27
+ | MYSQL_SLOW_SQL_WARN | Slow SQL warning. When enabled, warning logs are output for slow queries |
28
+ | MYSQL_SLOW_SQL_MS | Slow SQL threshold in milliseconds, default 200 |
29
+ | MYSQL_TRANSACTION_TIMEOUT | Transaction timeout in milliseconds, default 5000 |
30
+ | MYSQL_TRANSACTION_STRICT | Transaction strict mode, default true. Set to false to disable |
31
+ | MYSQL_MAX_OPS_IN_STRICT_TX | Maximum operations allowed in strict transaction, default 10 |
32
+
33
+ ## Initialization
34
+
35
+ First use the enableMysql function to enable the MySQL component, then use related features.
36
+
37
+ ```ts
38
+ await enableMysql()
39
+ ```
40
+
41
+ The above call to enableMysql passes no parameters, using the default name "mysql" and searching for environment variables prefixed with `MYSQL_`.
42
+
43
+ If multiple databases need to be connected, call enableMysql multiple times with different names.
44
+
45
+ ```ts
46
+ // Custom configuration name d2
47
+ await enableMysql('d2')
48
+ ```
49
+
50
+ After executing the above, environment variables prefixed with `D2_` will be mapped automatically.
51
+
52
+ Here is an example of environment variables for multiple data sources:
53
+
54
+ ```bash
55
+ # enableMysql() default, prefixed with MYSQL_
56
+ MYSQL_HOST=localhost
57
+ MYSQL_PORT=3306
58
+ MYSQL_USER=test
59
+ MYSQL_PASSWORD=abc123
60
+ MYSQL_DATABASE=test1
61
+ # enableMysql('d2') custom D2, prefixed with D2_
62
+ D2_HOST=localhost
63
+ D2_PORT=3306
64
+ D2_USER=test2
65
+ D2_PASSWORD=abcdefg
66
+ D2_DATABASE=test2
67
+ ```
68
+
69
+ Use the getMysqlManager function to get a MysqlManager for entity operations. It takes one optional parameter, the name configured in the previous step.
70
+
71
+ ```ts
72
+ // Default, name is mysql
73
+ const mysqlManager = getMysqlManager()
74
+ // Specify name d2, corresponds to enableMysql('d2')
75
+ const d2Manager = getMysqlManager('d2')
76
+ ```
77
+
78
+ ### Entity Configuration
79
+
80
+ Entity mapping configuration must be done before operations. Each entity class must have corresponding table information. Here is an example configuration for a user table:
81
+
82
+ ```ts
83
+ /**
84
+ * User, maps to user table. All field names must match column names. Custom field name mapping is not supported.
85
+ */
86
+ export interface User {
87
+ /**
88
+ * id, maps to column id.
89
+ */
90
+ id: string
91
+ nickname: string
92
+ /**
93
+ * Entry date, maps to column entry_date.
94
+ */
95
+ entry_date?: Date
96
+ hobby?: string
97
+ /**
98
+ * Create and update times are managed automatically by the component,
99
+ * so they are defined as optional in the type definition.
100
+ * These fields don't need to be filled when calling component methods.
101
+ */
102
+ createAt?: Date
103
+ updateAt?: Date
104
+ }
105
+
106
+ /**
107
+ * User table configuration, used to automatically generate SQL statements.
108
+ */
109
+ export const tableUser: Table<User> = {
110
+ /**
111
+ * Table name
112
+ */
113
+ tableName: 'user',
114
+ /**
115
+ * Primary key name. Only single-column primary keys are supported, composite keys are not.
116
+ */
117
+ id: 'id',
118
+ /**
119
+ * Column names, excluding automatically managed time columns and primary key.
120
+ */
121
+ columns: ['nickname', 'hobby'],
122
+ /**
123
+ * Creation time. If set, it will be managed automatically during component operations.
124
+ */
125
+ createdDate: {
126
+ /**
127
+ * Column name
128
+ */
129
+ column: 'createAt',
130
+ /**
131
+ * Type, supports date and number
132
+ */
133
+ type: 'date'
134
+ },
135
+ /**
136
+ * Update time. If set, it will be managed automatically during component operations.
137
+ */
138
+ updatedDate: {
139
+ column: 'updateAt',
140
+ type: 'date'
141
+ }
142
+ }
143
+ ```
144
+
145
+ It is recommended that all table configurations start with "table" for better editor autocompletion. When table configuration is needed, just type "table" and the editor will show all table configurations.
146
+
147
+ Entity configuration is not bound to the database configuration initialized earlier, meaning one entity configuration can be used by multiple databases. In read-write separation scenarios, primary and read-only databases can share entities.
148
+
149
+ ### Type Mapping
150
+
151
+ Entity field types and query method return object field types follow a type mapping rule that must be followed: **the database type must match the corresponding JavaScript native type**.
152
+
153
+ The type mapping logic cannot be modified. Here is the mapping table:
154
+
155
+ | JavaScript Type | MySQL Field Type |
156
+ | :---------------- | :------------------------------------------------------------------------ |
157
+ | Boolean | TINYINT |
158
+ | Number | TINYINT, SMALLINT, INT, MEDIUMINT, YEAR, FLOAT, DOUBLE, BIGINT |
159
+ | Date | TIMESTAMP, DATE, DATETIME |
160
+ | Buffer | TINYBLOB, MEDIUMBLOB, LONGBLOB, BLOB, BINARY, VARBINARY, BIT |
161
+ | String | CHAR, VARCHAR, TINYTEXT, MEDIUMTEXT, LONGTEXT, TEXT, ENUM, SET, DECIMAL, TIME |
162
+ | Object or Array | JSON |
163
+
164
+ For nullable fields, define them as nullable in TypeScript:
165
+
166
+ ```ts
167
+ export interface User {
168
+ /**
169
+ * Avatar file key in object storage, nullable
170
+ */
171
+ avatar_oss_key?: string
172
+ }
173
+ ```
174
+
175
+ Enum types can also be mapped, but note that it's value mapping. For example:
176
+
177
+ ```ts
178
+ enum Type {
179
+ COURSE,
180
+ EXAM
181
+ }
182
+ // Entity class
183
+ class Entity {
184
+ type: Type
185
+ }
186
+ ```
187
+
188
+ In the above enum, Type.COURSE maps to 0 and Type.EXAM maps to 1. If you need Type.COURSE to map to the string "COURSE", handle it like this:
189
+
190
+ ```ts
191
+ enum Type {
192
+ COURSE = 'COURSE',
193
+ EXAM = 'EXAM'
194
+ }
195
+ ```
196
+
197
+ For convenience, union types are generally recommended:
198
+
199
+ ```ts
200
+ class Entity {
201
+ type: 'course' | 'exam'
202
+ }
203
+ ```
204
+
205
+ ## CRUD Operations
206
+
207
+ Now you can perform CRUD operations through the MysqlManager instance. All methods take table information as the first parameter.
208
+
209
+ Below are some CRUD operation examples. For more method details, refer to the MysqlManager type definition. All methods and parameters have comments.
210
+
211
+ ```ts
212
+ // Get MysqlManager instance
213
+ const manager = getMysqlManager()
214
+ // Query by id
215
+ const admin = await manager.findById(tableUser, 'admin001')
216
+ // Query multiple records by id list
217
+ const users = await manager.findByIdIn(tableUser, ['admin001', 't001', 't002'])
218
+ // Check if id exists
219
+ const res = await manager.existsById(tableUser, 'admin001')
220
+ // Delete record with id d0001
221
+ await manager.deleteById(tableUser, 'd0001')
222
+ // Query all records in table, dangerous operation, use with caution
223
+ const list = await manager.findAll(tableUser)
224
+ // Insert record
225
+ await manager.insert(tableUser, {
226
+ id: 'in001',
227
+ nickname: '小明',
228
+ balance: 1
229
+ })
230
+ // Batch insert
231
+ await manager.insertMany(tableUser, [
232
+ { id: 'im001', nickname: '张飞', balance: 0 },
233
+ { id: 'im002', nickname: '关羽', balance: 2 },
234
+ { id: 'im003', nickname: '刘备', balance: 5 }
235
+ ])
236
+ // Query first matching record by condition
237
+ const user = await manager.findFirst(tableUser, c =>
238
+ c.like('nickname', 'ff0%').gt('balance', 75).lt('balance', 77)
239
+ )
240
+ // Update record, full update
241
+ await manager.update(tableUser, { id: 'xxxxxxx', nickname: '王五', balance: 44 })
242
+ // Partial update, supports nulling and increment operations
243
+ await manager.partialUpdate(tableUser, { id: 'pu000', balance: ['inc', 22] })
244
+ // Batch update, partial update all matching records
245
+ await manager.updateMany(tableUser, c => c.like('nickname', 'um%').between('balance', 23, 24), {
246
+ balance: ['inc', 2]
247
+ })
248
+ // Find all matching records
249
+ await manager.find({
250
+ table: tableUser,
251
+ criteria: c => c.between('balance', 700, 800).like('id', 'find%'),
252
+ offset: 1,
253
+ limit: 10,
254
+ orderBy: [['balance', 'asc']]
255
+ })
256
+ // Count matching records
257
+ const count = await manager.count(tableUser, c => c.like('id', 'c00%').like('nickname', '李%'))
258
+ // Paginated query
259
+ await manager.paginate({
260
+ table: tableUser,
261
+ criteria: c => c.like('id', 'pg0%'),
262
+ pn: 2,
263
+ pz: 5,
264
+ orderBy: [
265
+ ['balance', 'asc'],
266
+ ['id', 'asc']
267
+ ]
268
+ })
269
+ // Custom query, write SQL manually
270
+ interface QueryResult {
271
+ author: string
272
+ book: string
273
+ }
274
+ const list = await manager.query<QueryResult>(
275
+ 'select u.nickname as author,b.name as book ' +
276
+ ' from ?? u left join ?? b on u.id=b.author_id ' +
277
+ ' where b.id is not null',
278
+ ['user', 'book']
279
+ )
280
+ // Custom modification, write SQL manually
281
+ await manager.modify(`update user set nickname='无名' where nickname='佚名'`)
282
+ ```
283
+
284
+ ### All Operation Methods
285
+
286
+ | Method | Description |
287
+ | :-------------- | :-------------------------------------------------------------------------- |
288
+ | findById | Query by id |
289
+ | findByIdIn | Query multiple records by id list |
290
+ | existsBy | Check if records exist by condition |
291
+ | existsById | Check if id exists |
292
+ | deleteById | Delete by id |
293
+ | deleteMany | Delete by condition. Dangerous operation, recommend setting limit parameter |
294
+ | findAll | Query all records in table. Dangerous operation, only for small tables |
295
+ | findFirst | Query first matching record |
296
+ | insert | Insert record |
297
+ | insertMany | Insert multiple records at once |
298
+ | update | Update record, requires complete information |
299
+ | partialUpdate | Partial update, only provide id and fields to update |
300
+ | updateOne | Update only first matching record, only supports equality conditions |
301
+ | updateMany | Update all matching records. Dangerous operation, restrict conditions |
302
+ | find | Query all matching records. Dangerous operation, recommend limit parameter |
303
+ | findSelect | Conditional query with specified fields. Same as find but with select param |
304
+ | count | Count matching records. Dangerous operation, use strict conditions |
305
+ | paginate | Paginated query. Dangerous operation, based on find and count |
306
+ | query | Custom SQL query, returns record list, supports prepared statements |
307
+ | modify | Execute custom SQL, returns affected rows, supports prepared statements |
308
+
309
+ ### JSON Type
310
+
311
+ Version 0.2.0 adds limited support for JSON types. You can insert and query normally, and filtering conditions partially support MySQL's JSON-related functions.
312
+
313
+ Compared to storing JSON as strings and deserializing in the program, using JSON format is much more convenient and efficient for development. Here is a complete example.
314
+
315
+ Database table creation statement with JSON type field:
316
+
317
+ ```sql
318
+ CREATE TABLE
319
+ question (
320
+ id VARCHAR(32) PRIMARY KEY,
321
+ title VARCHAR(256) NOT NULL COMMENT '标题',
322
+ options json NOT NULL COMMENT '选项列表,json 数组',
323
+ question_setter json NOT NULL COMMENT '出题人信息,json 对象',
324
+ create_at BIGINT UNSIGNED NOT NULL COMMENT '创建时间',
325
+ update_at BIGINT UNSIGNED NOT NULL COMMENT '更新时间'
326
+ ) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '试题';
327
+ ```
328
+
329
+ Table mapping configuration. JSON type fields can be declared as custom types:
330
+
331
+ ```ts
332
+ // Option
333
+ export interface QuesOption {
334
+ title: string
335
+ correct?: boolean
336
+ }
337
+ // Question setter
338
+ export interface QuestionSetter {
339
+ id: string
340
+ name: string
341
+ }
342
+ // Question
343
+ export interface Question {
344
+ id: string
345
+ title: string
346
+ // Options
347
+ options: QuesOption[]
348
+ // Question setter
349
+ question_setter: QuestionSetter
350
+ create_at?: number
351
+ update_at?: number
352
+ }
353
+
354
+ export const tableQuestion: Table<Question> = {
355
+ tableName: 'question',
356
+ id: 'id',
357
+ columns: ['title', 'options', 'question_setter'],
358
+ createdDate: {
359
+ type: 'number',
360
+ column: 'create_at'
361
+ },
362
+ updatedDate: {
363
+ type: 'number',
364
+ column: 'update_at'
365
+ }
366
+ }
367
+ ```
368
+
369
+ Common methods work the same way. JSON data is passed according to the field definition format:
370
+
371
+ ```ts
372
+ await getMysqlManager().insert(tableQuestion, {
373
+ id: '003',
374
+ title: '下面哪个类型是 Mysql 不支持的',
375
+ options: [
376
+ { title: 'TINYINT' },
377
+ { title: 'BOOLEAN', correct: true },
378
+ { title: 'CHAR' },
379
+ { title: 'TEXT' }
380
+ ],
381
+ question_setter: { id: 'x333', name: '小李老师' }
382
+ })
383
+ // Queried data is complete, no further processing needed. JSON fields are typed correctly
384
+ const q1 = await getMysqlManager().findById(tableQuestion, '003')
385
+ q1.question_setter.name // 小李老师
386
+ ```
387
+
388
+ Query conditions support json_extract and json_length, which can be used wherever query conditions are supported. Instead of passing column names, pass a tuple:
389
+
390
+ ```ts
391
+ await manager.findFirst(tableQuestion, c =>
392
+ // Query records where question_setter.id = 'x333'
393
+ c.eq(['json_extract', 'question_setter', '$.id'], 'x333')
394
+ )
395
+ await manager.findFirst(tableQuestion, c =>
396
+ // Query records where options[0].title = '地球'
397
+ c.eq(['json_extract', 'options', '$[0].title'], '地球')
398
+ )
399
+ await manager.find({
400
+ table: tableQuestion,
401
+ // Query records where options array has >= 5 elements
402
+ criteria: c => c.gte(['json_length', 'options'], 5)
403
+ })
404
+ ```
405
+
406
+ Both json_extract and json_length queries require passing a tuple. The first parameter is the query type, the second is the field name, and json_extract has a third parameter for the property path. The property path format is the same as JavaScript property access syntax, using $ to refer to the field's value.
407
+
408
+ ```ts
409
+ // Batch update records where question_setter.id = 'x333'
410
+ await manager.updateMany({
411
+ table: tableQuestion,
412
+ query: c => c.eq(['json_extract', 'question_setter', '$.id'], 'x333'),
413
+ updater: {
414
+ // Update question_setter info
415
+ question_setter: { id: 'x333', name: '李帅' }
416
+ }
417
+ })
418
+ ```
419
+
420
+ Updates do not currently support json_set and other functions. You cannot update only part of a JSON field; you must update the entire field. This type of operation is rarely used and may be considered in future versions.
421
+
422
+ ### Special Modification Operations
423
+
424
+ The partialUpdate and updateMany methods support partial field modifications and special operations like increment and nulling.
425
+
426
+ ```ts
427
+ await manager.updateMany(tableUser, c => c.between('balance', 23, 24), {
428
+ // Increase balance by 2
429
+ balance: ['inc', 2],
430
+ // Set consume_type to null
431
+ consume_type: ['setNull']
432
+ })
433
+ ```
434
+
435
+ Setting a field to null directly also works, but requires TypeScript type support:
436
+
437
+ ```ts
438
+ interface User {
439
+ id: string
440
+ // Include null in role type
441
+ role: string | null
442
+ }
443
+
444
+ await manager.partialUpdate(tableUser, {
445
+ id: '001',
446
+ // Equivalent to role: ['setNull']
447
+ role: null
448
+ })
449
+ ```
450
+
451
+ The special array syntax is used for convenience, avoiding the need to introduce new types. **However, after introducing JSON types, if a JSON field is an array, it may conflict with special modification operations**. For example, setting a JSON field to `['setNull']` would be interpreted as a nulling operation.
452
+
453
+ ```ts
454
+ // Record entity definition
455
+ interface Record {
456
+ id: string
457
+ // extra field is a JSON array
458
+ extra: string[]
459
+ }
460
+ await manager.partialUpdate(tableRecord, {
461
+ id: '001',
462
+ // This would be interpreted as nulling extra
463
+ extra: ['setNull']
464
+ })
465
+ ```
466
+
467
+ The component provides a set operation to resolve conflicts. It's also a special array where the first element is 'set' and the second is the value to set:
468
+
469
+ ```ts
470
+ await manager.partialUpdate(tableRecord, {
471
+ id: '001',
472
+ // This correctly sets extra to ['setNull']
473
+ extra: ['set', ['setNull']]
474
+ })
475
+ ```
476
+
477
+ ### Prepared SQL
478
+
479
+ When using query or modify methods with custom SQL, prepared statements are supported. Use ? (question mark) for parameter values and ?? (double question mark) for table and column names.
480
+
481
+ ```sql
482
+ update ?? set ?? = ? where ?? = ?
483
+ ```
484
+
485
+ Parameters for the above prepared SQL:
486
+
487
+ ```ts
488
+ const values = ['user', 'name', 'tom', 'id', '001']
489
+ ```
490
+
491
+ Final compiled SQL:
492
+
493
+ ```sql
494
+ update `user` set `name` = 'tom' where `id` = '001'
495
+ ```
496
+
497
+ In actual development, table and column names don't necessarily need to be parameterized, as it may reduce code readability. However, for special or dynamic names, prepared statements are recommended for security compared to string concatenation.
498
+
499
+ ## Version Control
500
+
501
+ As introduced in environment variables, MYSQL_VERSION_CONTROL_ENABLED enables version management, and MYSQL_VERSION_CONTROL_DIR sets the version directory. Currently, absolute paths or relative paths from the process working directory are supported.
502
+
503
+ In the version directory, all files follow the format "numeric version number.sql".
504
+
505
+ Example version directory file listing:
506
+
507
+ ```
508
+ 1.sql
509
+ 2.sql
510
+ 3.sql
511
+ ```
512
+
513
+ Version numbers start from 1 and increment sequentially. **For program iterations, new versions must add new files, not modify existing ones.** The component does not have file validation to prevent modification of old files, nor does it support version comments. These need to be handled through project code version control.
514
+
515
+ **Note: Do not execute time-consuming SQL in version management. Each version's SQL should be as short as possible.** This is mainly because version management executes within a transaction. Too long execution times may cause transaction timeout and failure, and program startup time will be very long. For time-consuming operations like creating indexes on large tables, manual database operations are required and cannot be completed through version management.
516
+
517
+ ## Transactions
518
+
519
+ Use the MysqlManager object's tx method to execute transaction operations. The method accepts a function parameter whose parameter is a session object. **All operations in the transaction must call session methods, which are the same as manager methods**.
520
+
521
+ ```ts
522
+ mysqlManager.tx(
523
+ async session => {
524
+ // Update order and account balance in transaction
525
+ // orderId Order ID
526
+ // accountId Account ID
527
+ // amount Order amount
528
+ await session.partialUpdate(tableOrder, { id: orderId, status: 'finished' })
529
+ await session.partialUpdate(tableAccount, { id: accountId, balance: ['inc', -amount] })
530
+ },
531
+ // Set isolation level and timeout, optional
532
+ { isolationLevel: 'READ UNCOMMITTED', timeout: 1000 }
533
+ )
534
+ ```
535
+
536
+ **Note: Don't forget to await asynchronous calls in transactions. They must complete before the transaction commits, otherwise the operations won't participate in the transaction.**
537
+
538
+ ### Strict Mode
539
+
540
+ Transactions have strict mode enabled by default. Many operations are prohibited in strict mode. Set the environment variable MYSQL_TRANSACTION_STRICT (default variable name, use corresponding name for multiple instances) to false to disable it.
541
+
542
+ In strict mode, the following operations are prohibited in transactions:
543
+
544
+ 1. Bulk insert insertMany
545
+ 2. Bulk update updateMany
546
+ 3. Bulk delete deleteMany
547
+ 4. Bulk query and count find, count, paginate
548
+ 5. findByIdIn with more than 100 parameters
549
+ 6. Execute custom SQL with query and modify
550
+ 7. Any operation called via session exceeding 10 times. The MYSQL_MAX_OPS_IN_STRICT_TX variable can modify this limit
551
+
552
+ Long transactions are risky. In production environments, strict transactions are recommended with the shortest possible timeout.
@@ -0,0 +1,45 @@
1
+ # Task Scheduling
2
+
3
+ Task scheduling provides functionality to initiate periodic tasks, meeting basic needs.
4
+
5
+ ## Environment Variables
6
+
7
+ | Function Name | Description |
8
+ | :----------------------- | :-------------------------------------------------------------------------- |
9
+ | scheduleWithFixedRate | Execute task at fixed rate |
10
+ | scheduleWithFixedDelay | Execute task with fixed delay, i.e., wait for specified interval after each task completion |
11
+ | scheduleDailyTask | Execute task at fixed time daily |
12
+
13
+ ## Usage Examples
14
+
15
+ ```ts
16
+ // Start a fixed delay task, first execution after 10 seconds, then every minute
17
+ const controller = scheduleWithFixedDelay(10, 60, {
18
+ name: 'Record online users',
19
+ async run() {
20
+ const count = await countAuth()
21
+ await createPcu({
22
+ count,
23
+ time: new Date()
24
+ })
25
+ }
26
+ })
27
+ // Stop the task when necessary through the returned controller
28
+ controller.stop()
29
+ ```
30
+
31
+ The scheduleWithFixedRate function has the same parameters as scheduleWithFixedDelay. The difference is that scheduleWithFixedRate uses the task start time as the cycle, and the interval between each task's start time is consistent. If the task execution time exceeds the cycle, the next task will execute immediately. scheduleWithFixedDelay waits for the specified interval after each task completes before executing the next one.
32
+
33
+ ```ts
34
+ // Start a task that runs daily at 1:30
35
+ const controller = scheduleDailyTask(1, 30, {
36
+ name: 'Study report',
37
+ async run() {
38
+ // Logic omitted
39
+ }
40
+ })
41
+ ```
42
+
43
+ ## Difference from Built-in Timers
44
+
45
+ If requirements are not high, you can also use Node.js's built-in setTimeout and setInterval for periodic tasks. The task component is more convenient to use, with commonly used functions already encapsulated, and the run method is an async function. It automatically records task start time and exception information, and logs execution time for long-running tasks.
@@ -0,0 +1,56 @@
1
+ # Unit Testing
2
+
3
+ To run the project's unit tests, you need to start the database services first, then run the tests.
4
+
5
+ ## Start Database Services
6
+
7
+ The project source code provides scripts to start local database services for testing. The services need to run in Docker, so you must install docker-desktop locally first. Docker installation is not covered here; you can visit the official website for documentation.
8
+
9
+ First, start the MySQL service. This is simple - run docker-mysql.bat or docker-mysql.sh in the script directory.
10
+
11
+ ```
12
+ ./script/docker-mysql.sh
13
+ ```
14
+
15
+ Then start the MongoDB service for testing. Run docker-mongo.bat or docker-mongo.sh in the script directory.
16
+
17
+ ```
18
+ ./script/docker-mongo.sh
19
+ ```
20
+
21
+ Starting MongoDB alone is not sufficient. The service must be configured as a replica set to support transactions.
22
+
23
+ Run mongosh in the MongoDB container:
24
+
25
+ ```
26
+ docker exec -it mongo_test mongosh
27
+ ```
28
+
29
+ In mongosh, execute the following script to initialize as a replica set:
30
+
31
+ ```js
32
+ rs.initiate({
33
+ _id: 'rs0',
34
+ members: [{ _id: 0, host: '127.0.0.1:27017' }]
35
+ })
36
+ ```
37
+
38
+ Create a test user:
39
+
40
+ ```js
41
+ db.createUser({
42
+ user: 'test',
43
+ pwd: 'abc123',
44
+ roles: [{ role: 'readWrite', db: 'test' }]
45
+ })
46
+ ```
47
+
48
+ After completing the above steps, the MongoDB service is ready for testing.
49
+
50
+ ## Run Tests
51
+
52
+ Run the following script in the project root directory:
53
+
54
+ ```
55
+ npm run test
56
+ ```