wok-server 0.4.13 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (376) hide show
  1. package/README.en.md +61 -0
  2. package/README.md +44 -29
  3. package/dist/cache/cache.js +98 -98
  4. package/dist/cache/config.js +19 -19
  5. package/dist/cache/index.js +27 -27
  6. package/dist/cache/purge-task.js +46 -46
  7. package/dist/cache/stat.js +47 -47
  8. package/dist/config/convert.js +36 -36
  9. package/dist/config/exception.js +14 -14
  10. package/dist/config/index.js +81 -81
  11. package/dist/http-client/index.js +136 -136
  12. package/dist/i18n/ar.js +17 -17
  13. package/dist/i18n/de.js +17 -17
  14. package/dist/i18n/en-us.js +17 -17
  15. package/dist/i18n/es.js +17 -17
  16. package/dist/i18n/fr.js +17 -17
  17. package/dist/i18n/i18n.js +231 -231
  18. package/dist/i18n/index.js +52 -52
  19. package/dist/i18n/ja.js +17 -17
  20. package/dist/i18n/ko.js +17 -17
  21. package/dist/i18n/msg.js +2 -2
  22. package/dist/i18n/pt.js +17 -17
  23. package/dist/i18n/ru.js +17 -17
  24. package/dist/i18n/tag.js +18 -18
  25. package/dist/i18n/zh-HK.js +17 -17
  26. package/dist/i18n/zh-TW.js +17 -17
  27. package/dist/i18n/zh-cn.js +17 -17
  28. package/dist/index.js +14 -14
  29. package/dist/lock/index.js +114 -114
  30. package/dist/log/config.js +35 -29
  31. package/dist/log/date.js +21 -21
  32. package/dist/log/file.js +198 -72
  33. package/dist/log/index.js +135 -105
  34. package/dist/log/level.js +33 -33
  35. package/dist/log/log.js +56 -0
  36. package/dist/log/store.js +19 -16
  37. package/dist/mongodb/collection.js +2 -2
  38. package/dist/mongodb/config.js +34 -34
  39. package/dist/mongodb/doc.js +2 -2
  40. package/dist/mongodb/exception.js +14 -14
  41. package/dist/mongodb/index.js +58 -58
  42. package/dist/mongodb/manager/base.js +563 -563
  43. package/dist/mongodb/manager/index.js +63 -63
  44. package/dist/mongodb/manager/tx-strict.js +84 -84
  45. package/dist/mongodb/manager/tx.js +30 -30
  46. package/dist/mongodb/migration.js +52 -52
  47. package/dist/mvc/access-log.js +33 -33
  48. package/dist/mvc/config.js +27 -27
  49. package/dist/mvc/exchange.js +113 -113
  50. package/dist/mvc/handler/index.js +7 -6
  51. package/dist/mvc/handler/json.js +65 -65
  52. package/dist/mvc/handler/restful.js +35 -35
  53. package/dist/mvc/handler/sse.js +65 -0
  54. package/dist/mvc/handler/upload.js +31 -31
  55. package/dist/mvc/index.js +50 -50
  56. package/dist/mvc/interceptor.js +2 -2
  57. package/dist/mvc/query.js +43 -43
  58. package/dist/mvc/render/file.js +132 -132
  59. package/dist/mvc/render/html/html.js +90 -90
  60. package/dist/mvc/render/html/index.js +18 -18
  61. package/dist/mvc/render/html/style.js +2 -2
  62. package/dist/mvc/render/index.js +7 -7
  63. package/dist/mvc/render/json.js +26 -26
  64. package/dist/mvc/render/text.js +16 -16
  65. package/dist/mvc/router.js +2 -2
  66. package/dist/mvc/server.js +272 -272
  67. package/dist/mvc/static/header.js +67 -67
  68. package/dist/mvc/static/index.js +6 -6
  69. package/dist/mvc/static/mime-type.js +84 -84
  70. package/dist/mvc/static/server-cache-config.js +66 -66
  71. package/dist/mvc/static/server-cache.js +133 -133
  72. package/dist/mvc/static/static-handler.js +372 -372
  73. package/dist/mysql/config.js +51 -51
  74. package/dist/mysql/exception.js +14 -14
  75. package/dist/mysql/index.js +87 -87
  76. package/dist/mysql/manager/base.js +239 -231
  77. package/dist/mysql/manager/index.js +107 -107
  78. package/dist/mysql/manager/ops/count.js +20 -20
  79. package/dist/mysql/manager/ops/criteria.js +356 -356
  80. package/dist/mysql/manager/ops/delete.js +65 -65
  81. package/dist/mysql/manager/ops/exist.js +26 -26
  82. package/dist/mysql/manager/ops/find.js +169 -130
  83. package/dist/mysql/manager/ops/index.js +14 -14
  84. package/dist/mysql/manager/ops/insert.js +106 -106
  85. package/dist/mysql/manager/ops/modify.js +10 -10
  86. package/dist/mysql/manager/ops/paginate.js +23 -23
  87. package/dist/mysql/manager/ops/query.js +9 -9
  88. package/dist/mysql/manager/ops/update.js +216 -216
  89. package/dist/mysql/manager/ops/utils.js +24 -24
  90. package/dist/mysql/manager/tx-strict.js +103 -100
  91. package/dist/mysql/manager/tx.js +30 -30
  92. package/dist/mysql/manager/utils.js +56 -56
  93. package/dist/mysql/migration.js +136 -136
  94. package/dist/mysql/table-info.js +8 -8
  95. package/dist/task/daily.js +59 -59
  96. package/dist/task/fixed-delay.js +38 -38
  97. package/dist/task/fixed-rate.js +42 -42
  98. package/dist/task/index.js +9 -9
  99. package/dist/task/task.js +56 -56
  100. package/dist/validation/exception.js +36 -36
  101. package/dist/validation/index.js +40 -40
  102. package/dist/validation/validator/array.js +34 -34
  103. package/dist/validation/validator/enum.js +28 -28
  104. package/dist/validation/validator/index.js +14 -14
  105. package/dist/validation/validator/length.js +40 -40
  106. package/dist/validation/validator/max-length.js +35 -35
  107. package/dist/validation/validator/max.js +29 -29
  108. package/dist/validation/validator/min-length.js +33 -33
  109. package/dist/validation/validator/min.js +29 -29
  110. package/dist/validation/validator/not-blank.js +33 -33
  111. package/dist/validation/validator/not-null.js +21 -21
  112. package/dist/validation/validator/plain-obj.js +32 -32
  113. package/dist/validation/validator/regexp.js +34 -34
  114. package/documentation/en/cache.md +56 -0
  115. package/documentation/en/config.md +96 -0
  116. package/documentation/en/engineering.md +256 -0
  117. package/documentation/en/http-client.md +32 -0
  118. package/documentation/en/i18n.md +143 -0
  119. package/documentation/en/index.md +24 -0
  120. package/documentation/en/lock.md +51 -0
  121. package/documentation/en/log.md +109 -0
  122. package/documentation/en/mongodb.md +256 -0
  123. package/documentation/en/mvc.md +688 -0
  124. package/documentation/en/mysql.md +552 -0
  125. package/documentation/en/task.md +45 -0
  126. package/documentation/en/test.md +56 -0
  127. package/documentation/en/validate.md +130 -0
  128. package/documentation/zh-cn/engineering.md +1 -1
  129. package/documentation/zh-cn/log.md +81 -8
  130. package/documentation/zh-cn/mvc.md +66 -24
  131. package/documentation/zh-cn/mysql.md +24 -23
  132. package/documentation/zh-cn/validate.md +2 -2
  133. package/package.json +3 -1
  134. package/skills/wok-server-api-rules/SKILL.md +350 -0
  135. package/skills/wok-server-cache/SKILL.md +216 -0
  136. package/skills/wok-server-config/SKILL.md +200 -0
  137. package/skills/wok-server-getting-started/SKILL.md +123 -0
  138. package/skills/wok-server-getting-started/references/engineering.md +169 -0
  139. package/skills/wok-server-http-client/SKILL.md +164 -0
  140. package/skills/wok-server-i18n/SKILL.md +214 -0
  141. package/skills/wok-server-lock/SKILL.md +144 -0
  142. package/skills/wok-server-log/SKILL.md +218 -0
  143. package/skills/wok-server-mongodb/SKILL.md +235 -0
  144. package/skills/wok-server-mvc/SKILL.md +251 -0
  145. package/skills/wok-server-mvc/references/respond-html.md +157 -0
  146. package/skills/wok-server-mvc/references/sse.md +121 -0
  147. package/skills/wok-server-mvc/references/static-files.md +47 -0
  148. package/skills/wok-server-mvc/references/upload.md +62 -0
  149. package/skills/wok-server-mvc/references/websocket.md +30 -0
  150. package/skills/wok-server-mysql/SKILL.md +315 -0
  151. package/skills/wok-server-mysql/references/multi-datasource.md +76 -0
  152. package/skills/wok-server-mysql/references/version-control.md +22 -0
  153. package/skills/wok-server-task/SKILL.md +158 -0
  154. package/skills/wok-server-validate/SKILL.md +167 -0
  155. package/src/cache/cache.ts +118 -0
  156. package/src/cache/config.ts +53 -0
  157. package/src/cache/index.ts +27 -0
  158. package/src/cache/purge-task.ts +53 -0
  159. package/src/cache/stat.ts +47 -0
  160. package/src/config/convert.ts +27 -0
  161. package/src/config/exception.ts +8 -0
  162. package/src/config/index.ts +92 -0
  163. package/src/http-client/index.ts +202 -0
  164. package/src/i18n/ar.ts +16 -0
  165. package/src/i18n/de.ts +16 -0
  166. package/src/i18n/en-us.ts +16 -0
  167. package/src/i18n/es.ts +16 -0
  168. package/src/i18n/fr.ts +16 -0
  169. package/src/i18n/i18n.ts +230 -0
  170. package/src/i18n/index.ts +50 -0
  171. package/src/i18n/ja.ts +16 -0
  172. package/src/i18n/ko.ts +16 -0
  173. package/src/i18n/msg.ts +50 -0
  174. package/src/i18n/pt.ts +16 -0
  175. package/src/i18n/ru.ts +16 -0
  176. package/src/i18n/tag.ts +18 -0
  177. package/src/i18n/zh-HK.ts +16 -0
  178. package/src/i18n/zh-TW.ts +16 -0
  179. package/src/i18n/zh-cn.ts +16 -0
  180. package/src/index.ts +11 -0
  181. package/src/lock/index.ts +164 -0
  182. package/src/log/config.ts +71 -0
  183. package/src/log/date.ts +19 -0
  184. package/src/log/file.ts +215 -0
  185. package/src/log/index.ts +136 -0
  186. package/src/log/level.ts +29 -0
  187. package/src/log/log.ts +77 -0
  188. package/src/log/store.ts +31 -0
  189. package/src/mongodb/collection.ts +25 -0
  190. package/src/mongodb/config.ts +69 -0
  191. package/src/mongodb/doc.ts +12 -0
  192. package/src/mongodb/exception.ts +8 -0
  193. package/src/mongodb/index.ts +71 -0
  194. package/src/mongodb/manager/base.ts +674 -0
  195. package/src/mongodb/manager/index.ts +80 -0
  196. package/src/mongodb/manager/tx-strict.ts +153 -0
  197. package/src/mongodb/manager/tx.ts +34 -0
  198. package/src/mongodb/migration.ts +66 -0
  199. package/src/mvc/access-log.ts +33 -0
  200. package/src/mvc/config.ts +70 -0
  201. package/src/mvc/exchange.ts +126 -0
  202. package/src/mvc/handler/index.ts +4 -0
  203. package/src/mvc/handler/json.ts +96 -0
  204. package/src/mvc/handler/restful.ts +39 -0
  205. package/src/mvc/handler/sse.ts +90 -0
  206. package/src/mvc/handler/upload.ts +54 -0
  207. package/src/mvc/index.ts +48 -0
  208. package/src/mvc/interceptor.ts +12 -0
  209. package/src/mvc/query.ts +36 -0
  210. package/src/mvc/render/file.ts +148 -0
  211. package/src/mvc/render/html/html.ts +187 -0
  212. package/src/mvc/render/html/index.ts +16 -0
  213. package/src/mvc/render/html/style.ts +1201 -0
  214. package/src/mvc/render/index.ts +4 -0
  215. package/src/mvc/render/json.ts +24 -0
  216. package/src/mvc/render/text.ts +14 -0
  217. package/src/mvc/router.ts +13 -0
  218. package/src/mvc/server.ts +315 -0
  219. package/src/mvc/static/header.ts +86 -0
  220. package/src/mvc/static/index.ts +3 -0
  221. package/src/mvc/static/mime-type.ts +81 -0
  222. package/src/mvc/static/server-cache-config.ts +92 -0
  223. package/src/mvc/static/server-cache.ts +171 -0
  224. package/src/mvc/static/static-handler.ts +445 -0
  225. package/src/mysql/config.ts +130 -0
  226. package/src/mysql/exception.ts +8 -0
  227. package/src/mysql/index.ts +88 -0
  228. package/src/mysql/manager/base.ts +285 -0
  229. package/src/mysql/manager/index.ts +112 -0
  230. package/src/mysql/manager/ops/count.ts +30 -0
  231. package/src/mysql/manager/ops/criteria.ts +412 -0
  232. package/src/mysql/manager/ops/delete.ts +96 -0
  233. package/src/mysql/manager/ops/exist.ts +41 -0
  234. package/src/mysql/manager/ops/find.ts +226 -0
  235. package/src/mysql/manager/ops/index.ts +11 -0
  236. package/src/mysql/manager/ops/insert.ts +120 -0
  237. package/src/mysql/manager/ops/modify.ts +14 -0
  238. package/src/mysql/manager/ops/paginate.ts +60 -0
  239. package/src/mysql/manager/ops/query.ts +13 -0
  240. package/src/mysql/manager/ops/update.ts +294 -0
  241. package/src/mysql/manager/ops/utils.ts +20 -0
  242. package/src/mysql/manager/tx-strict.ts +138 -0
  243. package/src/mysql/manager/tx.ts +31 -0
  244. package/src/mysql/manager/utils.ts +75 -0
  245. package/src/mysql/migration.ts +149 -0
  246. package/src/mysql/table-info.ts +41 -0
  247. package/src/task/daily.ts +70 -0
  248. package/src/task/fixed-delay.ts +45 -0
  249. package/src/task/fixed-rate.ts +49 -0
  250. package/src/task/index.ts +4 -0
  251. package/src/task/task.ts +70 -0
  252. package/src/validation/exception.ts +27 -0
  253. package/src/validation/index.ts +61 -0
  254. package/src/validation/validator/array.ts +32 -0
  255. package/src/validation/validator/enum.ts +25 -0
  256. package/src/validation/validator/index.ts +11 -0
  257. package/src/validation/validator/length.ts +42 -0
  258. package/src/validation/validator/max-length.ts +33 -0
  259. package/src/validation/validator/max.ts +26 -0
  260. package/src/validation/validator/min-length.ts +31 -0
  261. package/src/validation/validator/min.ts +26 -0
  262. package/src/validation/validator/not-blank.ts +31 -0
  263. package/src/validation/validator/not-null.ts +19 -0
  264. package/src/validation/validator/plain-obj.ts +30 -0
  265. package/src/validation/validator/regexp.ts +32 -0
  266. package/types/cache/cache.d.ts +52 -52
  267. package/types/cache/config.d.ts +32 -32
  268. package/types/cache/index.d.ts +2 -2
  269. package/types/cache/purge-task.d.ts +11 -11
  270. package/types/cache/stat.d.ts +26 -26
  271. package/types/config/convert.d.ts +6 -6
  272. package/types/config/exception.d.ts +7 -7
  273. package/types/config/index.d.ts +25 -25
  274. package/types/http-client/index.d.ts +71 -71
  275. package/types/i18n/ar.d.ts +2 -2
  276. package/types/i18n/de.d.ts +2 -2
  277. package/types/i18n/en-us.d.ts +2 -2
  278. package/types/i18n/es.d.ts +2 -2
  279. package/types/i18n/fr.d.ts +2 -2
  280. package/types/i18n/i18n.d.ts +102 -102
  281. package/types/i18n/index.d.ts +9 -9
  282. package/types/i18n/ja.d.ts +2 -2
  283. package/types/i18n/ko.d.ts +2 -2
  284. package/types/i18n/msg.d.ts +50 -50
  285. package/types/i18n/pt.d.ts +2 -2
  286. package/types/i18n/ru.d.ts +2 -2
  287. package/types/i18n/tag.d.ts +11 -11
  288. package/types/i18n/zh-HK.d.ts +2 -2
  289. package/types/i18n/zh-TW.d.ts +2 -2
  290. package/types/i18n/zh-cn.d.ts +2 -2
  291. package/types/index.d.ts +11 -11
  292. package/types/lock/index.d.ts +64 -64
  293. package/types/log/config.d.ts +35 -27
  294. package/types/log/date.d.ts +2 -2
  295. package/types/log/file.d.ts +13 -5
  296. package/types/log/index.d.ts +53 -34
  297. package/types/log/level.d.ts +14 -14
  298. package/types/log/log.d.ts +40 -0
  299. package/types/log/store.d.ts +19 -12
  300. package/types/mongodb/collection.d.ts +25 -25
  301. package/types/mongodb/config.d.ts +45 -45
  302. package/types/mongodb/doc.d.ts +11 -11
  303. package/types/mongodb/exception.d.ts +7 -7
  304. package/types/mongodb/index.d.ts +29 -29
  305. package/types/mongodb/manager/base.d.ts +188 -188
  306. package/types/mongodb/manager/index.d.ts +38 -38
  307. package/types/mongodb/manager/tx-strict.d.ts +41 -41
  308. package/types/mongodb/manager/tx.d.ts +21 -21
  309. package/types/mongodb/migration.d.ts +12 -12
  310. package/types/mvc/access-log.d.ts +7 -7
  311. package/types/mvc/config.d.ts +42 -42
  312. package/types/mvc/exchange.d.ts +72 -72
  313. package/types/mvc/handler/index.d.ts +4 -3
  314. package/types/mvc/handler/json.d.ts +44 -44
  315. package/types/mvc/handler/restful.d.ts +11 -11
  316. package/types/mvc/handler/sse.d.ts +34 -0
  317. package/types/mvc/handler/upload.d.ts +36 -36
  318. package/types/mvc/index.d.ts +22 -22
  319. package/types/mvc/interceptor.d.ts +11 -11
  320. package/types/mvc/query.d.ts +13 -13
  321. package/types/mvc/render/file.d.ts +10 -10
  322. package/types/mvc/render/html/html.d.ts +98 -98
  323. package/types/mvc/render/html/index.d.ts +11 -11
  324. package/types/mvc/render/html/style.d.ts +1201 -1201
  325. package/types/mvc/render/index.d.ts +4 -4
  326. package/types/mvc/render/json.d.ts +17 -17
  327. package/types/mvc/render/text.d.ts +10 -10
  328. package/types/mvc/router.d.ts +11 -11
  329. package/types/mvc/server.d.ts +90 -90
  330. package/types/mvc/static/header.d.ts +27 -27
  331. package/types/mvc/static/index.d.ts +3 -3
  332. package/types/mvc/static/mime-type.d.ts +2 -2
  333. package/types/mvc/static/server-cache-config.d.ts +30 -30
  334. package/types/mvc/static/server-cache.d.ts +76 -76
  335. package/types/mvc/static/static-handler.d.ts +77 -77
  336. package/types/mysql/config.d.ts +90 -90
  337. package/types/mysql/exception.d.ts +7 -7
  338. package/types/mysql/index.d.ts +16 -16
  339. package/types/mysql/manager/base.d.ts +165 -159
  340. package/types/mysql/manager/index.d.ts +36 -36
  341. package/types/mysql/manager/ops/count.d.ts +13 -13
  342. package/types/mysql/manager/ops/criteria.d.ts +134 -134
  343. package/types/mysql/manager/ops/delete.d.ts +46 -46
  344. package/types/mysql/manager/ops/exist.d.ts +6 -6
  345. package/types/mysql/manager/ops/find.d.ts +86 -70
  346. package/types/mysql/manager/ops/index.d.ts +10 -10
  347. package/types/mysql/manager/ops/insert.d.ts +18 -18
  348. package/types/mysql/manager/ops/modify.d.ts +3 -3
  349. package/types/mysql/manager/ops/paginate.d.ts +36 -36
  350. package/types/mysql/manager/ops/query.d.ts +3 -3
  351. package/types/mysql/manager/ops/update.d.ts +76 -76
  352. package/types/mysql/manager/ops/utils.d.ts +5 -5
  353. package/types/mysql/manager/tx-strict.d.ts +36 -35
  354. package/types/mysql/manager/tx.d.ts +15 -15
  355. package/types/mysql/manager/utils.d.ts +17 -17
  356. package/types/mysql/migration.d.ts +8 -8
  357. package/types/mysql/table-info.d.ts +36 -36
  358. package/types/task/daily.d.ts +16 -16
  359. package/types/task/fixed-delay.d.ts +9 -9
  360. package/types/task/fixed-rate.d.ts +9 -9
  361. package/types/task/index.d.ts +4 -4
  362. package/types/task/task.d.ts +34 -34
  363. package/types/validation/exception.d.ts +38 -38
  364. package/types/validation/index.d.ts +32 -32
  365. package/types/validation/validator/array.d.ts +5 -5
  366. package/types/validation/validator/enum.d.ts +8 -8
  367. package/types/validation/validator/index.d.ts +11 -11
  368. package/types/validation/validator/length.d.ts +10 -10
  369. package/types/validation/validator/max-length.d.ts +8 -8
  370. package/types/validation/validator/max.d.ts +7 -7
  371. package/types/validation/validator/min-length.d.ts +6 -6
  372. package/types/validation/validator/min.d.ts +7 -7
  373. package/types/validation/validator/not-blank.d.ts +7 -7
  374. package/types/validation/validator/not-null.d.ts +6 -6
  375. package/types/validation/validator/plain-obj.d.ts +7 -7
  376. package/types/validation/validator/regexp.d.ts +8 -8
@@ -0,0 +1,130 @@
1
+ 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(1), 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,285 @@
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
+ UpdateOpts,
12
+ Updater,
13
+ count,
14
+ deleteMany,
15
+ deleteById,
16
+ existsBy,
17
+ existsById,
18
+ find,
19
+ findAll,
20
+ findById,
21
+ findByIdIn,
22
+ findFirst,
23
+ insert,
24
+ insertMany,
25
+ modify,
26
+ paginate,
27
+ partialUpdate,
28
+ query,
29
+ update,
30
+ updateMany,
31
+ updateOne,
32
+ FindSelectOpts,
33
+ findSelect
34
+ } from './ops'
35
+ import { promiseGetConnection } from './utils'
36
+
37
+ /**
38
+ * mysql 管理器基类,提供基础的操作方法.
39
+ */
40
+ export abstract class BaseMysqlManager {
41
+ /**
42
+ * @param mapping 映射
43
+ */
44
+ constructor(
45
+ /**
46
+ * 选项,连接池和连接必须有一个,连接池优先.
47
+ */
48
+ private readonly opts: { config: MysqlConfig; pool?: Pool; connection?: PoolConnection }
49
+ ) {
50
+ if (!opts.pool && !opts.connection) {
51
+ throw new MysqlException('Pool and Connection cannot be both null.')
52
+ }
53
+ }
54
+
55
+ protected async queryWithConnection<T>(
56
+ queryFn: (conn: PoolConnection) => Promise<T>
57
+ ): Promise<T> {
58
+ let conn: PoolConnection | undefined
59
+ if (this.opts.pool) {
60
+ conn = await promiseGetConnection(this.opts.pool)
61
+ } else if (this.opts.connection) {
62
+ conn = this.opts.connection
63
+ }
64
+ if (!conn) {
65
+ throw new MysqlException('Unable to obtain connection')
66
+ }
67
+ try {
68
+ return queryFn(conn)
69
+ } finally {
70
+ // 如果是连接池来的,每次连接都是新建,必须释放掉
71
+ if (this.opts.pool) {
72
+ this.opts.pool.releaseConnection(conn)
73
+ }
74
+ }
75
+ }
76
+ /**
77
+ * 依据id查找.
78
+ * @param table 表信息
79
+ * @param id id
80
+ * @returns
81
+ */
82
+ findById<T>(table: Table<T>, id: string | number): Promise<T | null> {
83
+ return this.queryWithConnection(conn => findById(this.opts.config, conn, table, id))
84
+ }
85
+ /**
86
+ * 根据id列表查询
87
+ * @param table
88
+ * @param ids
89
+ * @returns
90
+ */
91
+ findByIdIn<T>(table: Table<T>, ids: Array<string | number>): Promise<T[]> {
92
+ return this.queryWithConnection(conn => findByIdIn(this.opts.config, conn, table, ids))
93
+ }
94
+ /**
95
+ * 根据条件判定是否存在记录.
96
+ * @param table
97
+ * @param criteria 条件信息,可以为空,为空的情况下判定整个表是否有记录
98
+ * @returns
99
+ */
100
+ existsBy<T>(table: Table<T>, criteria?: MixCriteria<T>): Promise<boolean> {
101
+ return this.queryWithConnection(conn => existsBy(this.opts.config, conn, table, criteria))
102
+ }
103
+ /**
104
+ * 根据id判定记录是否存在
105
+ * @param table
106
+ * @param id
107
+ * @returns
108
+ */
109
+ existsById<T>(table: Table<T>, id: string | number): Promise<boolean> {
110
+ return this.queryWithConnection(conn => existsById(this.opts.config, conn, table, id))
111
+ }
112
+ /**
113
+ * 按 id 查询
114
+ * @param table 表信息
115
+ * @param id
116
+ */
117
+ deleteById<T>(table: Table<T>, id: string | number): Promise<boolean> {
118
+ return this.queryWithConnection(conn => deleteById(this.opts.config, conn, table, id))
119
+ }
120
+ /**
121
+ * 按条件删除数据。批量删除是危险操作,建议在使用时尽可能设置 limit 参数来限制数量。
122
+ * @param opts
123
+ * @returns
124
+ */
125
+ deleteMany<T>(opts: DeleteManyOpts<T>): Promise<number> {
126
+ return this.queryWithConnection(conn => deleteMany(this.opts.config, conn, opts))
127
+ }
128
+ /**
129
+ * 仅删除符合条件的一条记录,必须是相等条件
130
+ * @param table
131
+ * @param criteria
132
+ * @returns
133
+ */
134
+ async deleteOne<T>(table: Table<T>, criteria: Partial<T>) {
135
+ if (!Object.keys(criteria).length) {
136
+ throw new MysqlException('criteria cannot be empty !')
137
+ }
138
+ const res = await this.queryWithConnection(conn =>
139
+ deleteMany(this.opts.config, conn, {
140
+ table,
141
+ criteria,
142
+ limit: 1
143
+ })
144
+ )
145
+ return res === 1
146
+ }
147
+ /**
148
+ * 查询表中所有数据.
149
+ * @param table 表信息
150
+ * @returns
151
+ */
152
+ findAll<T>(table: Table<T>): Promise<T[]> {
153
+ return this.queryWithConnection(conn => findAll(this.opts.config, conn, table))
154
+ }
155
+ /**
156
+ * 按条件查询第一条记录.
157
+ * @param table 表信息
158
+ * @param criteria 查询条件
159
+ * @param orderBy 排序规则,按先后顺序放入,每个规则是一个元组,第一个元素是字段名称,第二个元素是顺序
160
+ * @returns
161
+ */
162
+ findFirst<T>(
163
+ table: Table<T>,
164
+ criteria?: MixCriteria<T>,
165
+ orderBy?: Array<[keyof T, 'asc' | 'desc']>
166
+ ): Promise<T | null> {
167
+ return this.queryWithConnection(conn =>
168
+ findFirst(this.opts.config, conn, table, criteria, orderBy)
169
+ )
170
+ }
171
+
172
+ /**
173
+ * 插入数据. 不支持自增加长id,id必须提前生成,请使用 uuid.
174
+ * @param table 表信息
175
+ * @param data 数据,数据必须是 T 的实例, T 必须是已配置的实体类类型,否则无法完成操作
176
+ * @returns 插入后的数据
177
+ */
178
+ insert<T>(table: Table<T>, data: T): Promise<T> {
179
+ return this.queryWithConnection(conn => insert(this.opts.config, conn, table, data))
180
+ }
181
+ /**
182
+ * 批量插入
183
+ * @param table 表
184
+ * @param list 要插入的数据列表
185
+ */
186
+ insertMany<T>(table: Table<T>, list: T[]): Promise<void> {
187
+ return this.queryWithConnection(conn => insertMany(this.opts.config, conn, table, list))
188
+ }
189
+ /**
190
+ * 更新
191
+ * @param table 表信息
192
+ * @param data
193
+ */
194
+ update<T>(table: Table<T>, data: T): Promise<T> {
195
+ return this.queryWithConnection(conn => update(this.opts.config, conn, table, data))
196
+ }
197
+ /**
198
+ * 更新所以匹配条件的记录
199
+ * @param opts
200
+ * @returns
201
+ */
202
+ updateMany<T>(opts: UpdateOpts<T>): Promise<number> {
203
+ return this.queryWithConnection(conn => updateMany(this.opts.config, conn, opts))
204
+ }
205
+
206
+ /**
207
+ * 只更新一条记录。仅支持相等条件,不支持范围条件,可以严格事务中使用。
208
+ * @param table
209
+ * @param criteria
210
+ * @param updater
211
+ * @returns 更新是否成功
212
+ */
213
+ updateOne<T>(table: Table<T>, criteria: MixCriteria<T>, updater: Updater<T>) {
214
+ if (!Object.keys(updater).length) {
215
+ throw new MysqlException('updater cannot be empty !')
216
+ }
217
+ return this.queryWithConnection(conn =>
218
+ updateOne(this.opts.config, conn, table, criteria, updater)
219
+ )
220
+ }
221
+
222
+ /**
223
+ * 部分更新
224
+ * @param table 表信息
225
+ * @param data 字段信息,必须要包含id字段,如果包含了更新和创建时间的字段,则忽略掉
226
+ */
227
+ partialUpdate<T>(table: Table<T>, data: Updater<T>): Promise<boolean> {
228
+ return this.queryWithConnection(conn => partialUpdate(this.opts.config, conn, table, data))
229
+ }
230
+
231
+ /**
232
+ * 查找实体类 自定义条件
233
+ * @param opts
234
+ * @returns
235
+ */
236
+ find<T>(opts: FindOpts<T>): Promise<T[]> {
237
+ return this.queryWithConnection(conn => find(this.opts.config, conn, opts))
238
+ }
239
+
240
+ /**
241
+ * 指定字段条件查询
242
+ * @param opts
243
+ * @returns
244
+ */
245
+ findSelect<T, K extends keyof T>(opts: FindSelectOpts<T, K>): Promise<Pick<T, K>[]> {
246
+ return this.queryWithConnection(conn => findSelect(this.opts.config, conn, opts))
247
+ }
248
+
249
+ /**
250
+ * 指定条件查询数量
251
+ * @param table 表信息
252
+ * @param criteria 查询条件
253
+ * @returns
254
+ */
255
+ count<T>(table: Table<T>, criteria?: MixCriteria<T>): Promise<number> {
256
+ return this.queryWithConnection(conn => count(this.opts.config, conn, table, criteria))
257
+ }
258
+ /**
259
+ * 分页查询
260
+ * @param opts
261
+ * @returns
262
+ */
263
+ paginate<T>(opts: MysqlPaginateOpts<T>): Promise<MysqlPage<T>> {
264
+ return this.queryWithConnection(conn => paginate(this.opts.config, conn, opts))
265
+ }
266
+
267
+ /**
268
+ * 自定义查询,指定 sql 、参数和返回值类型
269
+ * @param sql 预编译 sql ,参数使用 ”?“(英文问号) 占位,注意查询的字段名称会与返回值类型的字段映射,如果 sql 中的字段名称很特殊(比如纯数字等),需要设置别名,避免产生映射错误
270
+ * @param values 要传递的值,对应 sql 中的占位符 ”?“(英文问号)
271
+ * @param T 返回值类型,注意类型映射问题,详细可以参考文档中关于类型映射的说明
272
+ */
273
+ async query<T>(sql: string, values?: any[]): Promise<T[]> {
274
+ return this.queryWithConnection(conn => query(this.opts.config, conn, sql, values))
275
+ }
276
+ /**
277
+ * 自定义 sql 执行,必须是修改类的 sql ,否则会发生错误
278
+ * @param sql
279
+ * @param values
280
+ * @returns 返回影响的行数
281
+ */
282
+ async modify(sql: string, values?: any[]): Promise<number> {
283
+ return this.queryWithConnection(conn => modify(this.opts.config, conn, sql, values))
284
+ }
285
+ }
@@ -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
+ }