wok-server 0.5.0 → 0.7.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 (380) 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 +278 -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 +381 -356
  80. package/dist/mysql/manager/ops/delete.js +59 -65
  81. package/dist/mysql/manager/ops/exist.js +26 -26
  82. package/dist/mysql/manager/ops/find.js +149 -169
  83. package/dist/mysql/manager/ops/index.js +16 -14
  84. package/dist/mysql/manager/ops/insert.js +132 -106
  85. package/dist/mysql/manager/ops/modify.js +10 -10
  86. package/dist/mysql/manager/ops/order-by.js +28 -0
  87. package/dist/mysql/manager/ops/paginate.js +48 -23
  88. package/dist/mysql/manager/ops/query.js +9 -9
  89. package/dist/mysql/manager/ops/update.js +222 -216
  90. package/dist/mysql/manager/ops/upsert.js +178 -0
  91. package/dist/mysql/manager/ops/utils.js +28 -24
  92. package/dist/mysql/manager/tx-strict.js +103 -103
  93. package/dist/mysql/manager/tx.js +30 -30
  94. package/dist/mysql/manager/utils.js +56 -56
  95. package/dist/mysql/migration.js +136 -136
  96. package/dist/mysql/table-info.js +8 -8
  97. package/dist/task/daily.js +59 -59
  98. package/dist/task/fixed-delay.js +38 -38
  99. package/dist/task/fixed-rate.js +42 -42
  100. package/dist/task/index.js +9 -9
  101. package/dist/task/task.js +56 -56
  102. package/dist/validation/exception.js +36 -36
  103. package/dist/validation/index.js +40 -40
  104. package/dist/validation/validator/array.js +34 -34
  105. package/dist/validation/validator/enum.js +28 -28
  106. package/dist/validation/validator/index.js +14 -14
  107. package/dist/validation/validator/length.js +40 -40
  108. package/dist/validation/validator/max-length.js +35 -35
  109. package/dist/validation/validator/max.js +29 -29
  110. package/dist/validation/validator/min-length.js +33 -33
  111. package/dist/validation/validator/min.js +29 -29
  112. package/dist/validation/validator/not-blank.js +33 -33
  113. package/dist/validation/validator/not-null.js +21 -21
  114. package/dist/validation/validator/plain-obj.js +32 -32
  115. package/dist/validation/validator/regexp.js +34 -34
  116. package/documentation/en/cache.md +56 -0
  117. package/documentation/en/config.md +96 -0
  118. package/documentation/en/engineering.md +256 -0
  119. package/documentation/en/http-client.md +32 -0
  120. package/documentation/en/i18n.md +143 -0
  121. package/documentation/en/index.md +24 -0
  122. package/documentation/en/lock.md +51 -0
  123. package/documentation/en/log.md +109 -0
  124. package/documentation/en/mongodb.md +256 -0
  125. package/documentation/en/mvc.md +688 -0
  126. package/documentation/en/mysql.md +682 -0
  127. package/documentation/en/task.md +45 -0
  128. package/documentation/en/test.md +56 -0
  129. package/documentation/en/validate.md +130 -0
  130. package/documentation/zh-cn/mvc.md +66 -24
  131. package/documentation/zh-cn/mysql.md +146 -17
  132. package/package.json +4 -1
  133. package/skills/wok-server-api-rules/SKILL.md +350 -0
  134. package/skills/wok-server-cache/SKILL.md +216 -0
  135. package/skills/wok-server-code-navigation/SKILL.md +153 -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 +388 -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 +332 -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 +446 -0
  232. package/src/mysql/manager/ops/delete.ts +91 -0
  233. package/src/mysql/manager/ops/exist.ts +41 -0
  234. package/src/mysql/manager/ops/find.ts +209 -0
  235. package/src/mysql/manager/ops/index.ts +13 -0
  236. package/src/mysql/manager/ops/insert.ts +158 -0
  237. package/src/mysql/manager/ops/modify.ts +14 -0
  238. package/src/mysql/manager/ops/order-by.ts +58 -0
  239. package/src/mysql/manager/ops/paginate.ts +100 -0
  240. package/src/mysql/manager/ops/query.ts +13 -0
  241. package/src/mysql/manager/ops/update.ts +318 -0
  242. package/src/mysql/manager/ops/upsert.ts +224 -0
  243. package/src/mysql/manager/ops/utils.ts +24 -0
  244. package/src/mysql/manager/tx-strict.ts +138 -0
  245. package/src/mysql/manager/tx.ts +31 -0
  246. package/src/mysql/manager/utils.ts +75 -0
  247. package/src/mysql/migration.ts +149 -0
  248. package/src/mysql/table-info.ts +41 -0
  249. package/src/task/daily.ts +70 -0
  250. package/src/task/fixed-delay.ts +45 -0
  251. package/src/task/fixed-rate.ts +49 -0
  252. package/src/task/index.ts +4 -0
  253. package/src/task/task.ts +70 -0
  254. package/src/validation/exception.ts +27 -0
  255. package/src/validation/index.ts +61 -0
  256. package/src/validation/validator/array.ts +32 -0
  257. package/src/validation/validator/enum.ts +25 -0
  258. package/src/validation/validator/index.ts +11 -0
  259. package/src/validation/validator/length.ts +42 -0
  260. package/src/validation/validator/max-length.ts +33 -0
  261. package/src/validation/validator/max.ts +26 -0
  262. package/src/validation/validator/min-length.ts +31 -0
  263. package/src/validation/validator/min.ts +26 -0
  264. package/src/validation/validator/not-blank.ts +31 -0
  265. package/src/validation/validator/not-null.ts +19 -0
  266. package/src/validation/validator/plain-obj.ts +30 -0
  267. package/src/validation/validator/regexp.ts +32 -0
  268. package/types/cache/cache.d.ts +52 -52
  269. package/types/cache/config.d.ts +32 -32
  270. package/types/cache/index.d.ts +2 -2
  271. package/types/cache/purge-task.d.ts +11 -11
  272. package/types/cache/stat.d.ts +26 -26
  273. package/types/config/convert.d.ts +6 -6
  274. package/types/config/exception.d.ts +7 -7
  275. package/types/config/index.d.ts +25 -25
  276. package/types/http-client/index.d.ts +71 -71
  277. package/types/i18n/ar.d.ts +2 -2
  278. package/types/i18n/de.d.ts +2 -2
  279. package/types/i18n/en-us.d.ts +2 -2
  280. package/types/i18n/es.d.ts +2 -2
  281. package/types/i18n/fr.d.ts +2 -2
  282. package/types/i18n/i18n.d.ts +102 -102
  283. package/types/i18n/index.d.ts +9 -9
  284. package/types/i18n/ja.d.ts +2 -2
  285. package/types/i18n/ko.d.ts +2 -2
  286. package/types/i18n/msg.d.ts +50 -50
  287. package/types/i18n/pt.d.ts +2 -2
  288. package/types/i18n/ru.d.ts +2 -2
  289. package/types/i18n/tag.d.ts +11 -11
  290. package/types/i18n/zh-HK.d.ts +2 -2
  291. package/types/i18n/zh-TW.d.ts +2 -2
  292. package/types/i18n/zh-cn.d.ts +2 -2
  293. package/types/index.d.ts +11 -11
  294. package/types/lock/index.d.ts +64 -64
  295. package/types/log/config.d.ts +35 -35
  296. package/types/log/date.d.ts +2 -2
  297. package/types/log/file.d.ts +13 -13
  298. package/types/log/index.d.ts +53 -53
  299. package/types/log/level.d.ts +14 -14
  300. package/types/log/log.d.ts +40 -40
  301. package/types/log/store.d.ts +19 -19
  302. package/types/mongodb/collection.d.ts +25 -25
  303. package/types/mongodb/config.d.ts +45 -45
  304. package/types/mongodb/doc.d.ts +11 -11
  305. package/types/mongodb/exception.d.ts +7 -7
  306. package/types/mongodb/index.d.ts +29 -29
  307. package/types/mongodb/manager/base.d.ts +188 -188
  308. package/types/mongodb/manager/index.d.ts +38 -38
  309. package/types/mongodb/manager/tx-strict.d.ts +41 -41
  310. package/types/mongodb/manager/tx.d.ts +21 -21
  311. package/types/mongodb/migration.d.ts +12 -12
  312. package/types/mvc/access-log.d.ts +7 -7
  313. package/types/mvc/config.d.ts +42 -42
  314. package/types/mvc/exchange.d.ts +72 -72
  315. package/types/mvc/handler/index.d.ts +4 -3
  316. package/types/mvc/handler/json.d.ts +44 -44
  317. package/types/mvc/handler/restful.d.ts +11 -11
  318. package/types/mvc/handler/sse.d.ts +34 -0
  319. package/types/mvc/handler/upload.d.ts +36 -36
  320. package/types/mvc/index.d.ts +22 -22
  321. package/types/mvc/interceptor.d.ts +11 -11
  322. package/types/mvc/query.d.ts +13 -13
  323. package/types/mvc/render/file.d.ts +10 -10
  324. package/types/mvc/render/html/html.d.ts +98 -98
  325. package/types/mvc/render/html/index.d.ts +11 -11
  326. package/types/mvc/render/html/style.d.ts +1201 -1201
  327. package/types/mvc/render/index.d.ts +4 -4
  328. package/types/mvc/render/json.d.ts +17 -17
  329. package/types/mvc/render/text.d.ts +10 -10
  330. package/types/mvc/router.d.ts +11 -11
  331. package/types/mvc/server.d.ts +90 -90
  332. package/types/mvc/static/header.d.ts +27 -27
  333. package/types/mvc/static/index.d.ts +3 -3
  334. package/types/mvc/static/mime-type.d.ts +2 -2
  335. package/types/mvc/static/server-cache-config.d.ts +30 -30
  336. package/types/mvc/static/server-cache.d.ts +76 -76
  337. package/types/mvc/static/static-handler.d.ts +77 -77
  338. package/types/mysql/config.d.ts +90 -90
  339. package/types/mysql/exception.d.ts +7 -7
  340. package/types/mysql/index.d.ts +16 -16
  341. package/types/mysql/manager/base.d.ts +196 -165
  342. package/types/mysql/manager/index.d.ts +36 -36
  343. package/types/mysql/manager/ops/count.d.ts +13 -13
  344. package/types/mysql/manager/ops/criteria.d.ts +144 -134
  345. package/types/mysql/manager/ops/delete.d.ts +47 -46
  346. package/types/mysql/manager/ops/exist.d.ts +6 -6
  347. package/types/mysql/manager/ops/find.d.ts +87 -86
  348. package/types/mysql/manager/ops/index.d.ts +12 -10
  349. package/types/mysql/manager/ops/insert.d.ts +32 -18
  350. package/types/mysql/manager/ops/modify.d.ts +3 -3
  351. package/types/mysql/manager/ops/order-by.d.ts +38 -0
  352. package/types/mysql/manager/ops/paginate.d.ts +53 -36
  353. package/types/mysql/manager/ops/query.d.ts +3 -3
  354. package/types/mysql/manager/ops/update.d.ts +99 -76
  355. package/types/mysql/manager/ops/upsert.d.ts +36 -0
  356. package/types/mysql/manager/ops/utils.d.ts +5 -5
  357. package/types/mysql/manager/tx-strict.d.ts +36 -36
  358. package/types/mysql/manager/tx.d.ts +15 -15
  359. package/types/mysql/manager/utils.d.ts +17 -17
  360. package/types/mysql/migration.d.ts +8 -8
  361. package/types/mysql/table-info.d.ts +36 -36
  362. package/types/task/daily.d.ts +16 -16
  363. package/types/task/fixed-delay.d.ts +9 -9
  364. package/types/task/fixed-rate.d.ts +9 -9
  365. package/types/task/index.d.ts +4 -4
  366. package/types/task/task.d.ts +34 -34
  367. package/types/validation/exception.d.ts +38 -38
  368. package/types/validation/index.d.ts +32 -32
  369. package/types/validation/validator/array.d.ts +5 -5
  370. package/types/validation/validator/enum.d.ts +8 -8
  371. package/types/validation/validator/index.d.ts +11 -11
  372. package/types/validation/validator/length.d.ts +10 -10
  373. package/types/validation/validator/max-length.d.ts +8 -8
  374. package/types/validation/validator/max.d.ts +7 -7
  375. package/types/validation/validator/min-length.d.ts +6 -6
  376. package/types/validation/validator/min.d.ts +7 -7
  377. package/types/validation/validator/not-blank.d.ts +7 -7
  378. package/types/validation/validator/not-null.d.ts +6 -6
  379. package/types/validation/validator/plain-obj.d.ts +7 -7
  380. package/types/validation/validator/regexp.d.ts +8 -8
@@ -0,0 +1,130 @@
1
+ import { max, min, notBlank, notNull, ValidationOpts } from '../validation'
2
+
3
+ /**
4
+ * mysql 配置.
5
+ */
6
+ export interface MysqlConfig {
7
+ /**
8
+ * 主机名.
9
+ */
10
+ host: string
11
+ /**
12
+ * 端口号
13
+ */
14
+ port: number
15
+ /**
16
+ * 用户名
17
+ */
18
+ user: string
19
+ /**
20
+ * 密码
21
+ */
22
+ password: string
23
+ /**
24
+ * 字符集,默认 utf8mb4
25
+ */
26
+ charset: string
27
+ /**
28
+ * 库
29
+ */
30
+ database: string
31
+ /**
32
+ * 版本控制开启.
33
+ */
34
+ versionControlEnabled: boolean
35
+ /**
36
+ * 版本控制的文件目录,默认 db_migration.
37
+ */
38
+ versionControlDir: string
39
+ /**
40
+ * 时区,默认 +08:00
41
+ */
42
+ timezone: string
43
+ /**
44
+ * 超时时间,单位毫秒,默认 10秒
45
+ */
46
+ connectTimeout: number
47
+ /**
48
+ * 调试模式
49
+ */
50
+ debug: boolean
51
+ /**
52
+ * 最大连接数
53
+ */
54
+ connectionLimit: number
55
+ /**
56
+ * 最大闲置数
57
+ */
58
+ maxIdle: number
59
+ /**
60
+ * 闲置的超时时间,当一个数据库连接不再被业务使用、处于闲置状态的时间超过这个阈值,连接池就会自动回收并关闭这个连接,释放资源。
61
+ */
62
+ idleTimeout: number
63
+ /**
64
+ * 慢 sql 警告,启用后如果一个查询过慢,就会输出警告日志。
65
+ */
66
+ slowSqlWarn: boolean
67
+ /**
68
+ * 慢 sql 毫秒数,执行时间超过设定值的 sql 会被认为是慢 sql ,默认 200
69
+ */
70
+ slowSqlMs: number
71
+ /**
72
+ * 事务超时时间,单位毫秒,默认 5000,设置为小于等于 0 的值表示不限制
73
+ */
74
+ transactionTimeout: number
75
+ /**
76
+ * 事务严格模式
77
+ */
78
+ transactionStrict: boolean
79
+ /**
80
+ * 在严格事务中可进行的最大操作次数
81
+ */
82
+ maxOpsInStrictTx: number
83
+ }
84
+ /**
85
+ * 默认配置.
86
+ */
87
+ export const defaultConfig: MysqlConfig = {
88
+ host: 'localhost',
89
+ port: 3306,
90
+ user: 'root',
91
+ password: '123456',
92
+ charset: 'utf8mb4',
93
+ database: 'example',
94
+ versionControlEnabled: false,
95
+ versionControlDir: 'db_migration',
96
+ timezone: '+08:00',
97
+ connectTimeout: 10000,
98
+ debug: false,
99
+ connectionLimit: 10,
100
+ maxIdle: 10,
101
+ idleTimeout: 60000,
102
+ slowSqlWarn: true,
103
+ slowSqlMs: 200,
104
+ transactionTimeout: 5000,
105
+ transactionStrict: true,
106
+ maxOpsInStrictTx: 10
107
+ }
108
+ /**
109
+ * 配置校验规则.
110
+ */
111
+ export const configValidation: ValidationOpts<MysqlConfig> = {
112
+ host: [notBlank()],
113
+ port: [notNull(), min(80), max(65535)],
114
+ user: [notBlank()],
115
+ password: [notBlank()],
116
+ charset: [notBlank()],
117
+ database: [notBlank()],
118
+ versionControlEnabled: [notNull()],
119
+ versionControlDir: [notNull()],
120
+ timezone: [notBlank()],
121
+ connectTimeout: [notNull(), min(1000), max(60000)],
122
+ connectionLimit: [notNull(), min(1), max(999)],
123
+ maxIdle: [notNull(), min(1), max(999)],
124
+ idleTimeout: [notNull(), min(1000), max(60000)],
125
+ slowSqlWarn: [notNull()],
126
+ slowSqlMs: [notNull(), min(0), max(3600000)],
127
+ transactionTimeout: [notNull(), min(0), max(60000)],
128
+ transactionStrict: [notNull()],
129
+ maxOpsInStrictTx: [notNull(), min(1)]
130
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * mysql 异常.
3
+ */
4
+ export class MysqlException extends Error {
5
+ constructor(readonly message: string) {
6
+ super(message)
7
+ }
8
+ }
@@ -0,0 +1,88 @@
1
+ import { Connection, createConnection, createPool } from 'mysql2'
2
+ import { registerConfig } from '../config'
3
+ import { MysqlConfig, configValidation, defaultConfig } from './config'
4
+ import { MysqlException } from './exception'
5
+ import { MysqlManager } from './manager'
6
+ import { MysqlCriteria } from './manager/ops/criteria'
7
+ import { migrate } from './migration'
8
+ import { Table } from './table-info'
9
+
10
+ const managerMap = new Map<string, MysqlManager>()
11
+
12
+ const defaultName = 'mysql'
13
+
14
+ /**
15
+ * 启用mysql
16
+ * @param name 配置名称,同时也是环境变量配置的前缀,英文开头,由英文数字和下划线成.
17
+ */
18
+ export async function enableMysql(name?: string) {
19
+ // 校验名称
20
+ if (name) {
21
+ if (!/^[a-zA-Z][a-zA-Z0-9_]{0,31}$/.test(name)) {
22
+ throw new Error(
23
+ `mysql 配置名称必须是英文开头,由英文数字和下划线成,并且不得超过 32 位:${name}`
24
+ )
25
+ }
26
+ }
27
+ const finalName = name || defaultName
28
+ // 连接池配置
29
+ const mysqlConfig = registerConfig<MysqlConfig>(defaultConfig, finalName, configValidation)
30
+
31
+ // 数据库版本管理
32
+ if (mysqlConfig.versionControlEnabled) {
33
+ // 创建一个支持多语句的连接,专门处理迁移
34
+ const conn = await new Promise<Connection>((resolve, reject) => {
35
+ const conn = createConnection({
36
+ host: mysqlConfig.host,
37
+ port: mysqlConfig.port,
38
+ user: mysqlConfig.user,
39
+ password: mysqlConfig.password,
40
+ charset: mysqlConfig.charset,
41
+ database: mysqlConfig.database,
42
+ connectTimeout: mysqlConfig.connectTimeout,
43
+ multipleStatements: true,
44
+ timezone: mysqlConfig.timezone
45
+ })
46
+ conn.connect(err => (err ? reject(err) : resolve(conn)))
47
+ })
48
+ try {
49
+ await migrate(mysqlConfig, conn)
50
+ } finally {
51
+ await new Promise<void>((resolve, reject) => {
52
+ conn.end(err => (err ? reject(err) : resolve()))
53
+ })
54
+ }
55
+ }
56
+ const pool = createPool({
57
+ host: mysqlConfig.host,
58
+ port: mysqlConfig.port,
59
+ user: mysqlConfig.user,
60
+ password: mysqlConfig.password,
61
+ charset: mysqlConfig.charset,
62
+ database: mysqlConfig.database,
63
+ connectTimeout: mysqlConfig.connectTimeout,
64
+ debug: mysqlConfig.debug,
65
+ connectionLimit: mysqlConfig.connectionLimit,
66
+ maxIdle: mysqlConfig.maxIdle,
67
+ idleTimeout: mysqlConfig.idleTimeout,
68
+ timezone: mysqlConfig.timezone
69
+ })
70
+ process.addListener('beforeExit', () => pool.end())
71
+ managerMap.set(finalName, new MysqlManager(mysqlConfig, pool))
72
+ }
73
+
74
+ /**
75
+ * 获取管理器.
76
+ * @param name 配置名称,如果调用 enableMysql 时填写了,那么这里也要填写并保持一致
77
+ */
78
+ export function getMysqlManager(name?: string) {
79
+ const manager = managerMap.get(name || defaultName)
80
+ if (!manager) {
81
+ throw new Error(`找不到想要的 mysql 配置 ${name ? ': ' + name : ''},请先调用 enableMysql 启用`)
82
+ }
83
+ return manager
84
+ }
85
+
86
+ // 部分需要导出的对象
87
+ export * from './manager'
88
+ export { MysqlCriteria, MysqlException, Table }
@@ -0,0 +1,332 @@
1
+ import { Pool, PoolConnection } from 'mysql2'
2
+ import { MysqlConfig } from '../config'
3
+ import { MysqlException } from '../exception'
4
+ import { Table } from '../table-info'
5
+ import {
6
+ DeleteManyOpts,
7
+ FindOpts,
8
+ MixCriteria,
9
+ MysqlPage,
10
+ MysqlPaginateOpts,
11
+ MysqlPaginateSelectOpts,
12
+ OrderBy,
13
+ UpdateOpts,
14
+ Updater,
15
+ InsertValue,
16
+ count,
17
+ deleteMany,
18
+ deleteById,
19
+ existsBy,
20
+ existsById,
21
+ find,
22
+ findAll,
23
+ findById,
24
+ findByIdIn,
25
+ findFirst,
26
+ insert,
27
+ insertMany,
28
+ modify,
29
+ paginate,
30
+ paginateSelect,
31
+ partialUpdate,
32
+ query,
33
+ update,
34
+ updateMany,
35
+ updateOne,
36
+ FindSelectOpts,
37
+ findSelect,
38
+ upsert,
39
+ upsertMany,
40
+ upsertWithUpdater
41
+ } from './ops'
42
+ import { promiseGetConnection } from './utils'
43
+
44
+ /**
45
+ * mysql 管理器基类,提供基础的操作方法.
46
+ */
47
+ export abstract class BaseMysqlManager {
48
+ /**
49
+ * @param mapping 映射
50
+ */
51
+ constructor(
52
+ /**
53
+ * 选项,连接池和连接必须有一个,连接池优先.
54
+ */
55
+ private readonly opts: { config: MysqlConfig; pool?: Pool; connection?: PoolConnection }
56
+ ) {
57
+ if (!opts.pool && !opts.connection) {
58
+ throw new MysqlException('Pool and Connection cannot be both null.')
59
+ }
60
+ }
61
+
62
+ protected async queryWithConnection<T>(
63
+ queryFn: (conn: PoolConnection) => Promise<T>
64
+ ): Promise<T> {
65
+ let conn: PoolConnection | undefined
66
+ if (this.opts.pool) {
67
+ conn = await promiseGetConnection(this.opts.pool)
68
+ } else if (this.opts.connection) {
69
+ conn = this.opts.connection
70
+ }
71
+ if (!conn) {
72
+ throw new MysqlException('Unable to obtain connection')
73
+ }
74
+ try {
75
+ return queryFn(conn)
76
+ } finally {
77
+ // 如果是连接池来的,每次连接都是新建,必须释放掉
78
+ if (this.opts.pool) {
79
+ this.opts.pool.releaseConnection(conn)
80
+ }
81
+ }
82
+ }
83
+ /**
84
+ * 依据id查找.
85
+ * @param table 表信息
86
+ * @param id id
87
+ * @returns
88
+ */
89
+ findById<T>(table: Table<T>, id: string | number): Promise<T | null> {
90
+ return this.queryWithConnection(conn => findById(this.opts.config, conn, table, id))
91
+ }
92
+ /**
93
+ * 根据id列表查询
94
+ * @param table
95
+ * @param ids
96
+ * @returns
97
+ */
98
+ findByIdIn<T>(table: Table<T>, ids: Array<string | number>): Promise<T[]> {
99
+ return this.queryWithConnection(conn => findByIdIn(this.opts.config, conn, table, ids))
100
+ }
101
+ /**
102
+ * 根据条件判定是否存在记录.
103
+ * @param table
104
+ * @param criteria 条件信息,可以为空,为空的情况下判定整个表是否有记录
105
+ * @returns
106
+ */
107
+ existsBy<T>(table: Table<T>, criteria?: MixCriteria<T>): Promise<boolean> {
108
+ return this.queryWithConnection(conn => existsBy(this.opts.config, conn, table, criteria))
109
+ }
110
+ /**
111
+ * 根据id判定记录是否存在
112
+ * @param table
113
+ * @param id
114
+ * @returns
115
+ */
116
+ existsById<T>(table: Table<T>, id: string | number): Promise<boolean> {
117
+ return this.queryWithConnection(conn => existsById(this.opts.config, conn, table, id))
118
+ }
119
+ /**
120
+ * 按 id 查询
121
+ * @param table 表信息
122
+ * @param id
123
+ */
124
+ deleteById<T>(table: Table<T>, id: string | number): Promise<boolean> {
125
+ return this.queryWithConnection(conn => deleteById(this.opts.config, conn, table, id))
126
+ }
127
+ /**
128
+ * 按条件删除数据。批量删除是危险操作,建议在使用时尽可能设置 limit 参数来限制数量。
129
+ * @param opts
130
+ * @returns
131
+ */
132
+ deleteMany<T>(opts: DeleteManyOpts<T>): Promise<number> {
133
+ return this.queryWithConnection(conn => deleteMany(this.opts.config, conn, opts))
134
+ }
135
+ /**
136
+ * 仅删除符合条件的一条记录,必须是相等条件
137
+ * @param table
138
+ * @param criteria
139
+ * @returns
140
+ */
141
+ async deleteOne<T>(table: Table<T>, criteria: Partial<T>) {
142
+ if (!Object.keys(criteria).length) {
143
+ throw new MysqlException('criteria cannot be empty !')
144
+ }
145
+ const res = await this.queryWithConnection(conn =>
146
+ deleteMany(this.opts.config, conn, {
147
+ table,
148
+ criteria,
149
+ limit: 1
150
+ })
151
+ )
152
+ return res === 1
153
+ }
154
+ /**
155
+ * 查询表中所有数据.
156
+ * @param table 表信息
157
+ * @returns
158
+ */
159
+ findAll<T>(table: Table<T>): Promise<T[]> {
160
+ return this.queryWithConnection(conn => findAll(this.opts.config, conn, table))
161
+ }
162
+ /**
163
+ * 按条件查询第一条记录.
164
+ * @param table 表信息
165
+ * @param criteria 查询条件
166
+ * @param orderBy 排序规则,按先后顺序放入,每个规则是一个元组,第一个元素是字段名称,第二个元素是顺序
167
+ * @returns
168
+ */
169
+ findFirst<T>(
170
+ table: Table<T>,
171
+ criteria?: MixCriteria<T>,
172
+ orderBy?: OrderBy<T>
173
+ ): Promise<T | null> {
174
+ return this.queryWithConnection(conn =>
175
+ findFirst(this.opts.config, conn, table, criteria, orderBy)
176
+ )
177
+ }
178
+
179
+ /**
180
+ * 插入数据. 不支持自增加长id,id必须提前生成,请使用 uuid.
181
+ * @param table 表信息
182
+ * @param data 数据,数据必须是 T 的实例, T 必须是已配置的实体类类型,否则无法完成操作
183
+ * @returns 插入后的数据
184
+ */
185
+ insert<T>(table: Table<T>, data: InsertValue<T>): Promise<T> {
186
+ return this.queryWithConnection(conn => insert(this.opts.config, conn, table, data))
187
+ }
188
+ /**
189
+ * 批量插入
190
+ * @param table 表
191
+ * @param list 要插入的数据列表
192
+ */
193
+ insertMany<T>(table: Table<T>, list: InsertValue<T>[]): Promise<void> {
194
+ return this.queryWithConnection(conn => insertMany(this.opts.config, conn, table, list))
195
+ }
196
+ /**
197
+ * Upsert 单条数据
198
+ * 如果主键冲突则更新,否则插入
199
+ * @param table 表信息
200
+ * @param data 数据
201
+ * @returns
202
+ */
203
+ upsert<T>(table: Table<T>, data: InsertValue<T>): Promise<T> {
204
+ return this.queryWithConnection(conn => upsert(this.opts.config, conn, table, data))
205
+ }
206
+ /**
207
+ * Upsert 多条数据
208
+ * 如果主键冲突则更新,否则插入
209
+ * @param table 表
210
+ * @param list 要插入的数据列表
211
+ * @returns 影响的行数
212
+ */
213
+ upsertMany<T>(table: Table<T>, list: InsertValue<T>[]): Promise<number> {
214
+ return this.queryWithConnection(conn => upsertMany(this.opts.config, conn, table, list))
215
+ }
216
+ /**
217
+ * Upsert 单条数据(支持自定义更新器)
218
+ * 如果主键冲突则按自定义逻辑更新,否则插入
219
+ * @param table 表信息
220
+ * @param data 插入的数据
221
+ * @param updater 冲突时的更新器
222
+ * @returns
223
+ */
224
+ upsertWithUpdater<T>(table: Table<T>, data: InsertValue<T>, updater: Updater<T>): Promise<T> {
225
+ return this.queryWithConnection(conn => upsertWithUpdater(this.opts.config, conn, table, data, updater))
226
+ }
227
+ /**
228
+ * 更新
229
+ * @param table 表信息
230
+ * @param data
231
+ */
232
+ update<T>(table: Table<T>, data: T): Promise<T> {
233
+ return this.queryWithConnection(conn => update(this.opts.config, conn, table, data))
234
+ }
235
+ /**
236
+ * 更新所以匹配条件的记录
237
+ * @param opts
238
+ * @returns
239
+ */
240
+ updateMany<T>(opts: UpdateOpts<T>): Promise<number> {
241
+ return this.queryWithConnection(conn => updateMany(this.opts.config, conn, opts))
242
+ }
243
+
244
+ /**
245
+ * 只更新一条记录。仅支持相等条件,不支持范围条件,可以严格事务中使用。
246
+ * @param table
247
+ * @param criteria
248
+ * @param updater
249
+ * @returns 更新是否成功
250
+ */
251
+ updateOne<T>(table: Table<T>, criteria: MixCriteria<T>, updater: Updater<T>) {
252
+ if (!Object.keys(updater).length) {
253
+ throw new MysqlException('updater cannot be empty !')
254
+ }
255
+ return this.queryWithConnection(conn =>
256
+ updateOne(this.opts.config, conn, table, criteria, updater)
257
+ )
258
+ }
259
+
260
+ /**
261
+ * 部分更新
262
+ * @param table 表信息
263
+ * @param data 字段信息,必须要包含id字段,如果包含了更新和创建时间的字段,则忽略掉
264
+ */
265
+ partialUpdate<T>(table: Table<T>, data: Updater<T>): Promise<boolean> {
266
+ return this.queryWithConnection(conn => partialUpdate(this.opts.config, conn, table, data))
267
+ }
268
+
269
+ /**
270
+ * 查找实体类 自定义条件
271
+ * @param opts
272
+ * @returns
273
+ */
274
+ find<T>(opts: FindOpts<T>): Promise<T[]> {
275
+ return this.queryWithConnection(conn => find(this.opts.config, conn, opts))
276
+ }
277
+
278
+ /**
279
+ * 指定字段条件查询
280
+ * @param opts
281
+ * @returns
282
+ */
283
+ findSelect<T, K extends keyof T>(opts: FindSelectOpts<T, K>): Promise<Pick<T, K>[]> {
284
+ return this.queryWithConnection(conn => findSelect(this.opts.config, conn, opts))
285
+ }
286
+
287
+ /**
288
+ * 指定条件查询数量
289
+ * @param table 表信息
290
+ * @param criteria 查询条件
291
+ * @returns
292
+ */
293
+ count<T>(table: Table<T>, criteria?: MixCriteria<T>): Promise<number> {
294
+ return this.queryWithConnection(conn => count(this.opts.config, conn, table, criteria))
295
+ }
296
+ /**
297
+ * 分页查询
298
+ * @param opts
299
+ * @returns
300
+ */
301
+ paginate<T>(opts: MysqlPaginateOpts<T>): Promise<MysqlPage<T>> {
302
+ return this.queryWithConnection(conn => paginate(this.opts.config, conn, opts))
303
+ }
304
+
305
+ /**
306
+ * 指定字段分页查询
307
+ * @param opts
308
+ * @returns
309
+ */
310
+ paginateSelect<T, K extends keyof T>(opts: MysqlPaginateSelectOpts<T, K>): Promise<MysqlPage<Pick<T, K>>> {
311
+ return this.queryWithConnection(conn => paginateSelect(this.opts.config, conn, opts))
312
+ }
313
+
314
+ /**
315
+ * 自定义查询,指定 sql 、参数和返回值类型
316
+ * @param sql 预编译 sql ,参数使用 ”?“(英文问号) 占位,注意查询的字段名称会与返回值类型的字段映射,如果 sql 中的字段名称很特殊(比如纯数字等),需要设置别名,避免产生映射错误
317
+ * @param values 要传递的值,对应 sql 中的占位符 ”?“(英文问号)
318
+ * @param T 返回值类型,注意类型映射问题,详细可以参考文档中关于类型映射的说明
319
+ */
320
+ async query<T>(sql: string, values?: any[]): Promise<T[]> {
321
+ return this.queryWithConnection(conn => query(this.opts.config, conn, sql, values))
322
+ }
323
+ /**
324
+ * 自定义 sql 执行,必须是修改类的 sql ,否则会发生错误
325
+ * @param sql
326
+ * @param values
327
+ * @returns 返回影响的行数
328
+ */
329
+ async modify(sql: string, values?: any[]): Promise<number> {
330
+ return this.queryWithConnection(conn => modify(this.opts.config, conn, sql, values))
331
+ }
332
+ }
@@ -0,0 +1,112 @@
1
+ import { Pool } from 'mysql2'
2
+ import { MysqlConfig } from '../config'
3
+ import { MysqlException } from '../exception'
4
+ import { BaseMysqlManager } from './base'
5
+ import { MysqlTxSession } from './tx'
6
+ import { MysqlStrictTxSession } from './tx-strict'
7
+ import { promiseGetConnection, promiseQuery } from './utils'
8
+
9
+ /**
10
+ * mysql 管理器,封装数据库操作,提供方便使用的实体类操作方法.
11
+ */
12
+ export class MysqlManager extends BaseMysqlManager {
13
+ /**
14
+ * @param mapping 映射
15
+ */
16
+ constructor(
17
+ private readonly config: MysqlConfig,
18
+ /**
19
+ * 连接池.
20
+ */
21
+ private readonly pool: Pool
22
+ ) {
23
+ super({ config, pool })
24
+ }
25
+
26
+ /**
27
+ * 事务. 所有事务中的操作都必须使用 exec 函数中提供的 session 对象,直接使用 MysqlManager 上的方法
28
+ * 进行的操作不会在事务中生效.
29
+ * @param ops 逻辑执行函数,内部的所有逻辑都必须在函数内执行完,
30
+ * 不得有操作在函数外异步执行(异步操作不 await,或使用定时器单独执行等),否则不会在事务中生效
31
+ * @param opts 选项,可设置超时时间等
32
+ */
33
+ async tx<T>(
34
+ ops: (session: MysqlTxSession) => Promise<T>,
35
+ opts?: {
36
+ timeout?: number
37
+ isolationLevel?: 'REPEATABLE READ' | 'READ COMMITTED' | 'READ UNCOMMITTED' | 'SERIALIZABLE'
38
+ accessMode?: 'READ WRITE' | 'READ ONLY'
39
+ }
40
+ ): Promise<T> {
41
+ const conn = await promiseGetConnection(this.pool)
42
+ if (opts && opts.isolationLevel) {
43
+ await promiseQuery(
44
+ this.config,
45
+ conn,
46
+ `SET TRANSACTION ISOLATION LEVEL ${opts.isolationLevel}`
47
+ )
48
+ }
49
+ if (opts && opts.accessMode) {
50
+ await promiseQuery(this.config, conn, `SET TRANSACTION ${opts.accessMode}`)
51
+ }
52
+ await new Promise<void>((resolve, reject) => {
53
+ conn.beginTransaction(err => {
54
+ if (err) {
55
+ reject(err)
56
+ } else {
57
+ resolve()
58
+ }
59
+ })
60
+ })
61
+ // 构建 session ,然后执行查询
62
+ const session = this.config.transactionStrict
63
+ ? new MysqlStrictTxSession(this.config, conn)
64
+ : new MysqlTxSession(this.config, conn)
65
+ try {
66
+ // 超时抛出异常
67
+ const timeout =
68
+ opts && typeof opts.timeout === 'number' ? opts.timeout : this.config.transactionTimeout
69
+ const result =
70
+ timeout > 0
71
+ ? await Promise.race([
72
+ ops(session),
73
+ new Promise<T>((resolve, reject) => {
74
+ setTimeout(() => {
75
+ // 立即中止会话,防止再有后续操作
76
+ session.abort()
77
+ reject(new MysqlException('Transaction timeout !'))
78
+ }, timeout)
79
+ })
80
+ ])
81
+ : await ops(session)
82
+ await new Promise<void>((resolve, reject) => {
83
+ conn.commit(err => {
84
+ if (err) {
85
+ reject(err)
86
+ } else {
87
+ resolve()
88
+ }
89
+ })
90
+ })
91
+ return result
92
+ } catch (e) {
93
+ await new Promise<void>((resolve, reject) => {
94
+ conn.rollback(err => {
95
+ if (err) {
96
+ reject(err)
97
+ } else {
98
+ resolve()
99
+ }
100
+ })
101
+ })
102
+ throw e
103
+ } finally {
104
+ // 无论如何中止会话,离开事务,会话就不能再被使用
105
+ session.abort()
106
+ this.pool.releaseConnection(conn)
107
+ }
108
+ }
109
+ }
110
+
111
+ export { FindOpts, MixCriteria, MysqlCriteria } from './ops'
112
+ export { BaseMysqlManager, MysqlTxSession }
@@ -0,0 +1,30 @@
1
+ import { PoolConnection, RowDataPacket } from 'mysql2'
2
+ import { Table } from '../../table-info'
3
+ import { MixCriteria, buildQuery } from './criteria'
4
+ import { promiseQuery } from '../utils'
5
+ import { MysqlConfig } from '../../config'
6
+
7
+ /**
8
+ * 按条件统计数量.
9
+ * @param config
10
+ * @param conn
11
+ * @param table
12
+ * @param criteria
13
+ * @returns
14
+ */
15
+ export async function count<T>(
16
+ config: MysqlConfig,
17
+ conn: PoolConnection,
18
+ table: Table<T>,
19
+ criteria?: MixCriteria<T>
20
+ ): Promise<number> {
21
+ let query = criteria ? buildQuery(criteria) : undefined
22
+ const res = await promiseQuery(
23
+ config,
24
+ conn,
25
+ `select count(*) as ct from ?? ${query ? `where ${query.sql}` : ''} `,
26
+ [table.tableName].concat(query ? query.values : [])
27
+ )
28
+ const row = res as RowDataPacket[]
29
+ return row[0].ct
30
+ }