@nocobase/database 0.5.0-alpha.38 → 0.7.0-alpha.10

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 (458) hide show
  1. package/LICENSE +201 -21
  2. package/esm/collection-importer.d.ts +7 -0
  3. package/esm/collection-importer.js +49 -0
  4. package/esm/collection-importer.js.map +1 -0
  5. package/esm/collection.d.ts +73 -0
  6. package/esm/collection.js +224 -0
  7. package/esm/collection.js.map +1 -0
  8. package/esm/database.d.ts +101 -0
  9. package/esm/database.js +275 -0
  10. package/esm/database.js.map +1 -0
  11. package/esm/fields/array-field.d.ts +11 -0
  12. package/esm/fields/array-field.js +26 -0
  13. package/esm/fields/array-field.js.map +1 -0
  14. package/esm/fields/belongs-to-field.d.ts +12 -0
  15. package/esm/fields/belongs-to-field.js +57 -0
  16. package/esm/fields/belongs-to-field.js.map +1 -0
  17. package/esm/fields/belongs-to-many-field.d.ts +11 -0
  18. package/esm/fields/belongs-to-many-field.js +55 -0
  19. package/esm/fields/belongs-to-many-field.js.map +1 -0
  20. package/esm/fields/boolean-field.d.ts +8 -0
  21. package/esm/fields/boolean-field.js +8 -0
  22. package/esm/fields/boolean-field.js.map +1 -0
  23. package/esm/fields/context-field.d.ts +13 -0
  24. package/esm/fields/context-field.js +43 -0
  25. package/esm/fields/context-field.js.map +1 -0
  26. package/esm/fields/date-field.d.ts +8 -0
  27. package/esm/fields/date-field.js +8 -0
  28. package/esm/fields/date-field.js.map +1 -0
  29. package/esm/fields/field.d.ts +37 -0
  30. package/esm/fields/field.js +74 -0
  31. package/esm/fields/field.js.map +1 -0
  32. package/esm/fields/has-inverse-field.d.ts +4 -0
  33. package/esm/fields/has-inverse-field.js +2 -0
  34. package/esm/fields/has-inverse-field.js.map +1 -0
  35. package/esm/fields/has-many-field.d.ts +64 -0
  36. package/esm/fields/has-many-field.js +58 -0
  37. package/esm/fields/has-many-field.js.map +1 -0
  38. package/esm/fields/has-one-field.d.ts +64 -0
  39. package/esm/fields/has-one-field.js +57 -0
  40. package/esm/fields/has-one-field.js.map +1 -0
  41. package/esm/fields/index.d.ts +40 -0
  42. package/esm/fields/index.js +21 -0
  43. package/esm/fields/index.js.map +1 -0
  44. package/esm/fields/json-field.d.ts +14 -0
  45. package/esm/fields/json-field.js +17 -0
  46. package/esm/fields/json-field.js.map +1 -0
  47. package/esm/fields/number-field.d.ts +32 -0
  48. package/esm/fields/number-field.js +28 -0
  49. package/esm/fields/number-field.js.map +1 -0
  50. package/esm/fields/password-field.d.ts +21 -0
  51. package/esm/fields/password-field.js +71 -0
  52. package/esm/fields/password-field.js.map +1 -0
  53. package/esm/fields/radio-field.d.ts +14 -0
  54. package/esm/fields/radio-field.js +49 -0
  55. package/esm/fields/radio-field.js.map +1 -0
  56. package/esm/fields/relation-field.d.ts +20 -0
  57. package/esm/fields/relation-field.js +27 -0
  58. package/esm/fields/relation-field.js.map +1 -0
  59. package/esm/fields/sort-field.d.ts +16 -0
  60. package/esm/fields/sort-field.js +90 -0
  61. package/esm/fields/sort-field.js.map +1 -0
  62. package/esm/fields/string-field.d.ts +8 -0
  63. package/esm/fields/string-field.js +8 -0
  64. package/esm/fields/string-field.js.map +1 -0
  65. package/esm/fields/text-field.d.ts +8 -0
  66. package/esm/fields/text-field.js +8 -0
  67. package/esm/fields/text-field.js.map +1 -0
  68. package/esm/fields/time-field.d.ts +8 -0
  69. package/esm/fields/time-field.js +8 -0
  70. package/esm/fields/time-field.js.map +1 -0
  71. package/esm/fields/uid-field.d.ts +10 -0
  72. package/esm/fields/uid-field.js +27 -0
  73. package/esm/fields/uid-field.js.map +1 -0
  74. package/esm/fields/virtual-field.d.ts +8 -0
  75. package/esm/fields/virtual-field.js +8 -0
  76. package/esm/fields/virtual-field.js.map +1 -0
  77. package/esm/filter-parser.d.ts +27 -0
  78. package/esm/filter-parser.js +185 -0
  79. package/esm/filter-parser.js.map +1 -0
  80. package/esm/index.d.ts +15 -0
  81. package/esm/index.js +16 -0
  82. package/esm/index.js.map +1 -0
  83. package/esm/magic-attribute-model.d.ts +7 -0
  84. package/esm/magic-attribute-model.js +70 -0
  85. package/esm/magic-attribute-model.js.map +1 -0
  86. package/esm/mock-database.d.ts +22 -0
  87. package/esm/mock-database.js +34 -0
  88. package/esm/mock-database.js.map +1 -0
  89. package/esm/model-hook.d.ts +12 -0
  90. package/esm/model-hook.js +61 -0
  91. package/esm/model-hook.js.map +1 -0
  92. package/esm/model.d.ts +15 -0
  93. package/esm/model.js +80 -0
  94. package/esm/model.js.map +1 -0
  95. package/esm/operators/array.d.ts +26 -0
  96. package/esm/operators/array.js +105 -0
  97. package/esm/operators/array.js.map +1 -0
  98. package/esm/operators/association.d.ts +10 -0
  99. package/esm/operators/association.js +14 -0
  100. package/esm/operators/association.js.map +1 -0
  101. package/esm/operators/date.d.ts +34 -0
  102. package/esm/operators/date.js +35 -0
  103. package/esm/operators/date.js.map +1 -0
  104. package/esm/operators/empty.d.ts +28 -0
  105. package/esm/operators/empty.js +58 -0
  106. package/esm/operators/empty.js.map +1 -0
  107. package/esm/operators/index.d.ts +2 -0
  108. package/esm/operators/index.js +2 -0
  109. package/esm/operators/index.js.map +1 -0
  110. package/esm/operators/ne.d.ts +10 -0
  111. package/esm/operators/ne.js +12 -0
  112. package/esm/operators/ne.js.map +1 -0
  113. package/esm/operators/string.d.ts +21 -0
  114. package/esm/operators/string.js +35 -0
  115. package/esm/operators/string.js.map +1 -0
  116. package/esm/operators/utils.d.ts +4 -0
  117. package/esm/operators/utils.js +11 -0
  118. package/esm/operators/utils.js.map +1 -0
  119. package/esm/options-parser.d.ts +31 -0
  120. package/esm/options-parser.js +225 -0
  121. package/esm/options-parser.js.map +1 -0
  122. package/esm/playground.d.ts +1 -0
  123. package/esm/playground.js +53 -0
  124. package/esm/playground.js.map +1 -0
  125. package/esm/relation-repository/belongs-to-many-repository.d.ts +36 -0
  126. package/esm/relation-repository/belongs-to-many-repository.js +199 -0
  127. package/esm/relation-repository/belongs-to-many-repository.js.map +1 -0
  128. package/esm/relation-repository/belongs-to-repository.d.ts +17 -0
  129. package/esm/relation-repository/belongs-to-repository.js +4 -0
  130. package/esm/relation-repository/belongs-to-repository.js.map +1 -0
  131. package/esm/relation-repository/hasmany-repository.d.ts +23 -0
  132. package/esm/relation-repository/hasmany-repository.js +125 -0
  133. package/esm/relation-repository/hasmany-repository.js.map +1 -0
  134. package/esm/relation-repository/hasone-repository.d.ts +17 -0
  135. package/esm/relation-repository/hasone-repository.js +4 -0
  136. package/esm/relation-repository/hasone-repository.js.map +1 -0
  137. package/esm/relation-repository/multiple-relation-repository.d.ts +23 -0
  138. package/esm/relation-repository/multiple-relation-repository.js +149 -0
  139. package/esm/relation-repository/multiple-relation-repository.js.map +1 -0
  140. package/esm/relation-repository/relation-repository.d.ts +32 -0
  141. package/esm/relation-repository/relation-repository.js +93 -0
  142. package/esm/relation-repository/relation-repository.js.map +1 -0
  143. package/esm/relation-repository/single-relation-repository.d.ts +23 -0
  144. package/esm/relation-repository/single-relation-repository.js +96 -0
  145. package/esm/relation-repository/single-relation-repository.js.map +1 -0
  146. package/esm/relation-repository/types.d.ts +7 -0
  147. package/esm/relation-repository/types.js +2 -0
  148. package/esm/relation-repository/types.js.map +1 -0
  149. package/esm/repository.d.ts +165 -0
  150. package/esm/repository.js +276 -0
  151. package/esm/repository.js.map +1 -0
  152. package/esm/transaction-decorator.d.ts +1 -0
  153. package/esm/transaction-decorator.js +63 -0
  154. package/esm/transaction-decorator.js.map +1 -0
  155. package/esm/update-associations.d.ts +60 -0
  156. package/esm/update-associations.js +362 -0
  157. package/esm/update-associations.js.map +1 -0
  158. package/esm/update-guard.d.ts +26 -0
  159. package/esm/update-guard.js +122 -0
  160. package/esm/update-guard.js.map +1 -0
  161. package/lib/collection-importer.d.ts +7 -0
  162. package/lib/collection-importer.js +75 -0
  163. package/lib/collection-importer.js.map +1 -0
  164. package/lib/collection.d.ts +73 -0
  165. package/lib/collection.js +231 -0
  166. package/lib/collection.js.map +1 -0
  167. package/lib/database.d.ts +93 -43
  168. package/lib/database.js +277 -471
  169. package/lib/database.js.map +1 -1
  170. package/lib/fields/array-field.d.ts +11 -0
  171. package/lib/fields/array-field.js +30 -0
  172. package/lib/fields/array-field.js.map +1 -0
  173. package/lib/fields/belongs-to-field.d.ts +12 -0
  174. package/lib/fields/belongs-to-field.js +61 -0
  175. package/lib/fields/belongs-to-field.js.map +1 -0
  176. package/lib/fields/belongs-to-many-field.d.ts +11 -0
  177. package/lib/fields/belongs-to-many-field.js +59 -0
  178. package/lib/fields/belongs-to-many-field.js.map +1 -0
  179. package/lib/fields/boolean-field.d.ts +8 -0
  180. package/lib/fields/boolean-field.js +12 -0
  181. package/lib/fields/boolean-field.js.map +1 -0
  182. package/lib/fields/context-field.d.ts +13 -0
  183. package/lib/fields/context-field.js +50 -0
  184. package/lib/fields/context-field.js.map +1 -0
  185. package/lib/fields/date-field.d.ts +8 -0
  186. package/lib/fields/date-field.js +12 -0
  187. package/lib/fields/date-field.js.map +1 -0
  188. package/lib/fields/field.d.ts +37 -0
  189. package/lib/fields/field.js +81 -0
  190. package/lib/fields/field.js.map +1 -0
  191. package/lib/fields/has-inverse-field.d.ts +4 -0
  192. package/lib/fields/has-inverse-field.js +3 -0
  193. package/lib/fields/has-inverse-field.js.map +1 -0
  194. package/lib/fields/has-many-field.d.ts +64 -0
  195. package/lib/fields/has-many-field.js +62 -0
  196. package/lib/fields/has-many-field.js.map +1 -0
  197. package/lib/fields/has-one-field.d.ts +64 -0
  198. package/lib/fields/has-one-field.js +61 -0
  199. package/lib/fields/has-one-field.js.map +1 -0
  200. package/lib/fields/index.d.ts +40 -10
  201. package/lib/fields/index.js +31 -138
  202. package/lib/fields/index.js.map +1 -1
  203. package/lib/fields/json-field.d.ts +14 -0
  204. package/lib/fields/json-field.js +22 -0
  205. package/lib/fields/json-field.js.map +1 -0
  206. package/lib/fields/number-field.d.ts +32 -0
  207. package/lib/fields/number-field.js +36 -0
  208. package/lib/fields/number-field.js.map +1 -0
  209. package/lib/fields/password-field.d.ts +21 -0
  210. package/lib/fields/password-field.js +78 -0
  211. package/lib/fields/password-field.js.map +1 -0
  212. package/lib/fields/radio-field.d.ts +14 -0
  213. package/lib/fields/radio-field.js +53 -0
  214. package/lib/fields/radio-field.js.map +1 -0
  215. package/lib/fields/relation-field.d.ts +20 -0
  216. package/lib/fields/relation-field.js +31 -0
  217. package/lib/fields/relation-field.js.map +1 -0
  218. package/lib/fields/sort-field.d.ts +16 -0
  219. package/lib/fields/sort-field.js +94 -0
  220. package/lib/fields/sort-field.js.map +1 -0
  221. package/lib/fields/string-field.d.ts +8 -0
  222. package/lib/fields/string-field.js +12 -0
  223. package/lib/fields/string-field.js.map +1 -0
  224. package/lib/fields/text-field.d.ts +8 -0
  225. package/lib/fields/text-field.js +12 -0
  226. package/lib/fields/text-field.js.map +1 -0
  227. package/lib/fields/time-field.d.ts +8 -0
  228. package/lib/fields/time-field.js +12 -0
  229. package/lib/fields/time-field.js.map +1 -0
  230. package/lib/fields/uid-field.d.ts +10 -0
  231. package/lib/fields/uid-field.js +31 -0
  232. package/lib/fields/uid-field.js.map +1 -0
  233. package/lib/fields/virtual-field.d.ts +8 -0
  234. package/lib/fields/virtual-field.js +12 -0
  235. package/lib/fields/virtual-field.js.map +1 -0
  236. package/lib/filter-parser.d.ts +27 -0
  237. package/lib/filter-parser.js +191 -0
  238. package/lib/filter-parser.js.map +1 -0
  239. package/lib/index.d.ts +13 -6
  240. package/lib/index.js +27 -60
  241. package/lib/index.js.map +1 -1
  242. package/lib/magic-attribute-model.d.ts +7 -0
  243. package/lib/magic-attribute-model.js +77 -0
  244. package/lib/magic-attribute-model.js.map +1 -0
  245. package/lib/mock-database.d.ts +22 -0
  246. package/lib/mock-database.js +40 -0
  247. package/lib/mock-database.js.map +1 -0
  248. package/lib/model-hook.d.ts +12 -0
  249. package/lib/model-hook.js +68 -0
  250. package/lib/model-hook.js.map +1 -0
  251. package/lib/model.d.ts +11 -45
  252. package/lib/model.js +76 -452
  253. package/lib/model.js.map +1 -1
  254. package/lib/operators/array.d.ts +26 -0
  255. package/lib/operators/array.js +107 -0
  256. package/lib/operators/array.js.map +1 -0
  257. package/lib/operators/association.d.ts +10 -0
  258. package/lib/operators/association.js +16 -0
  259. package/lib/operators/association.js.map +1 -0
  260. package/lib/operators/date.d.ts +34 -0
  261. package/lib/operators/date.js +40 -0
  262. package/lib/operators/date.js.map +1 -0
  263. package/lib/operators/empty.d.ts +28 -0
  264. package/lib/operators/empty.js +82 -0
  265. package/lib/operators/empty.js.map +1 -0
  266. package/lib/operators/index.d.ts +2 -0
  267. package/lib/operators/index.js +4 -0
  268. package/lib/operators/index.js.map +1 -0
  269. package/lib/operators/ne.d.ts +10 -0
  270. package/lib/operators/ne.js +14 -0
  271. package/lib/operators/ne.js.map +1 -0
  272. package/lib/operators/string.d.ts +21 -0
  273. package/lib/operators/string.js +37 -0
  274. package/lib/operators/string.js.map +1 -0
  275. package/lib/operators/utils.d.ts +4 -0
  276. package/lib/operators/utils.js +16 -0
  277. package/lib/operators/utils.js.map +1 -0
  278. package/lib/options-parser.d.ts +31 -0
  279. package/lib/options-parser.js +232 -0
  280. package/lib/options-parser.js.map +1 -0
  281. package/lib/playground.d.ts +1 -0
  282. package/lib/playground.js +55 -0
  283. package/lib/playground.js.map +1 -0
  284. package/lib/relation-repository/belongs-to-many-repository.d.ts +36 -0
  285. package/lib/relation-repository/belongs-to-many-repository.js +206 -0
  286. package/lib/relation-repository/belongs-to-many-repository.js.map +1 -0
  287. package/lib/relation-repository/belongs-to-repository.d.ts +17 -0
  288. package/lib/relation-repository/belongs-to-repository.js +8 -0
  289. package/lib/relation-repository/belongs-to-repository.js.map +1 -0
  290. package/lib/relation-repository/hasmany-repository.d.ts +23 -0
  291. package/lib/relation-repository/hasmany-repository.js +129 -0
  292. package/lib/relation-repository/hasmany-repository.js.map +1 -0
  293. package/lib/relation-repository/hasone-repository.d.ts +17 -0
  294. package/lib/relation-repository/hasone-repository.js +8 -0
  295. package/lib/relation-repository/hasone-repository.js.map +1 -0
  296. package/lib/relation-repository/multiple-relation-repository.d.ts +23 -0
  297. package/lib/relation-repository/multiple-relation-repository.js +153 -0
  298. package/lib/relation-repository/multiple-relation-repository.js.map +1 -0
  299. package/lib/relation-repository/relation-repository.d.ts +32 -0
  300. package/lib/relation-repository/relation-repository.js +100 -0
  301. package/lib/relation-repository/relation-repository.js.map +1 -0
  302. package/lib/relation-repository/single-relation-repository.d.ts +23 -0
  303. package/lib/relation-repository/single-relation-repository.js +103 -0
  304. package/lib/relation-repository/single-relation-repository.js.map +1 -0
  305. package/lib/relation-repository/types.d.ts +7 -0
  306. package/lib/relation-repository/types.js +3 -0
  307. package/lib/relation-repository/types.js.map +1 -0
  308. package/lib/repository.d.ts +165 -0
  309. package/lib/repository.js +302 -0
  310. package/lib/repository.js.map +1 -0
  311. package/lib/transaction-decorator.d.ts +1 -0
  312. package/lib/transaction-decorator.js +70 -0
  313. package/lib/transaction-decorator.js.map +1 -0
  314. package/lib/update-associations.d.ts +60 -0
  315. package/lib/update-associations.js +374 -0
  316. package/lib/update-associations.js.map +1 -0
  317. package/lib/update-guard.d.ts +26 -0
  318. package/lib/update-guard.js +129 -0
  319. package/lib/update-guard.js.map +1 -0
  320. package/package.json +17 -5
  321. package/src/__tests__/collection-importer.test.ts +21 -0
  322. package/src/__tests__/collection.sortable.test.ts +65 -0
  323. package/src/__tests__/collection.test.ts +218 -0
  324. package/src/__tests__/database.import.test.ts +33 -0
  325. package/src/__tests__/database.test.ts +229 -0
  326. package/src/__tests__/field-options/hidden.test.ts +302 -0
  327. package/src/__tests__/field-options/sort-by.test.ts +220 -0
  328. package/src/__tests__/fields/belongs-to-field.test.ts +162 -0
  329. package/src/__tests__/fields/belongs-to-many-field.test.ts +61 -0
  330. package/src/__tests__/fields/context-field.test.ts +140 -0
  331. package/src/__tests__/fields/has-many-field.test.ts +152 -0
  332. package/src/__tests__/fields/has-one-field.test.ts +67 -0
  333. package/src/__tests__/fields/password-field.test.ts +30 -0
  334. package/src/__tests__/fields/sort-field.test.ts +133 -0
  335. package/src/__tests__/fields/string-field.test.ts +77 -0
  336. package/src/__tests__/filter-parser.test.ts +104 -0
  337. package/src/__tests__/fixtures/c0/a.ts +6 -0
  338. package/src/__tests__/fixtures/c1/b.ts +6 -0
  339. package/src/__tests__/fixtures/c2/a.ts +6 -0
  340. package/src/__tests__/fixtures/collections/delay-extend.ts +6 -0
  341. package/src/__tests__/fixtures/collections/delay-extend2.ts +6 -0
  342. package/src/__tests__/fixtures/collections/extend.ts +6 -0
  343. package/src/__tests__/fixtures/collections/extend2.ts +6 -0
  344. package/src/__tests__/fixtures/collections/posts.ts +4 -0
  345. package/src/__tests__/fixtures/collections/tags.js +4 -0
  346. package/src/__tests__/fixtures/collections/test.jpg +0 -0
  347. package/src/__tests__/fixtures/collections/user.json +9 -0
  348. package/src/__tests__/index.ts +1 -0
  349. package/src/__tests__/magic-attribute-model.test.ts +103 -0
  350. package/src/__tests__/model.test.ts +60 -0
  351. package/src/__tests__/operator/array-operator.test.ts +268 -0
  352. package/src/__tests__/operator/association-operator.test.ts +263 -0
  353. package/src/__tests__/operator/date-operator.test.ts +165 -0
  354. package/src/__tests__/operator/empty-operator.test.ts +77 -0
  355. package/src/__tests__/operator/ne.test.ts +33 -0
  356. package/src/__tests__/operator/string-operator.test.ts +62 -0
  357. package/src/__tests__/option-parser.test.ts +185 -0
  358. package/src/__tests__/relation-repository/belongs-to-many-repository.test.ts +697 -0
  359. package/src/__tests__/relation-repository/has-many-repository.test.ts +414 -0
  360. package/src/__tests__/relation-repository/hasone-repository.test.ts +77 -0
  361. package/src/__tests__/repository/count.test.ts +180 -0
  362. package/src/__tests__/repository/create.test.ts +163 -0
  363. package/src/__tests__/repository/destroy.test.ts +196 -0
  364. package/src/__tests__/repository/find.test.ts +247 -0
  365. package/src/__tests__/repository/update.test.ts +60 -0
  366. package/src/__tests__/repository.test.ts +438 -0
  367. package/src/__tests__/update-associations.test.ts +412 -0
  368. package/src/__tests__/update-guard.test.ts +376 -0
  369. package/src/collection-importer.ts +49 -0
  370. package/src/collection.ts +282 -0
  371. package/src/database.ts +340 -0
  372. package/src/fields/array-field.ts +35 -0
  373. package/src/fields/belongs-to-field.ts +76 -0
  374. package/src/fields/belongs-to-many-field.ts +77 -0
  375. package/src/fields/boolean-field.ts +12 -0
  376. package/src/fields/context-field.ts +45 -0
  377. package/src/fields/date-field.ts +12 -0
  378. package/src/fields/field.ts +105 -0
  379. package/src/fields/has-inverse-field.ts +5 -0
  380. package/src/fields/has-many-field.ts +143 -0
  381. package/src/fields/has-one-field.ts +136 -0
  382. package/src/fields/index.ts +72 -0
  383. package/src/fields/json-field.ts +25 -0
  384. package/src/fields/number-field.ts +52 -0
  385. package/src/fields/password-field.ts +72 -0
  386. package/src/fields/radio-field.ts +50 -0
  387. package/src/fields/relation-field.ts +37 -0
  388. package/src/fields/sort-field.ts +96 -0
  389. package/src/fields/string-field.ts +12 -0
  390. package/src/fields/text-field.ts +12 -0
  391. package/src/fields/time-field.ts +12 -0
  392. package/src/fields/uid-field.ts +24 -0
  393. package/src/fields/virtual-field.ts +12 -0
  394. package/src/filter-parser.ts +243 -0
  395. package/src/index.ts +16 -0
  396. package/src/magic-attribute-model.ts +62 -0
  397. package/src/mock-database.ts +42 -0
  398. package/src/model-hook.ts +69 -0
  399. package/src/model.ts +114 -0
  400. package/src/operators/array.ts +145 -0
  401. package/src/operators/association.ts +14 -0
  402. package/src/operators/date.ts +41 -0
  403. package/src/operators/empty.ts +75 -0
  404. package/src/operators/index.ts +8 -0
  405. package/src/operators/ne.ts +12 -0
  406. package/src/operators/string.ts +40 -0
  407. package/src/operators/utils.ts +13 -0
  408. package/src/options-parser.ts +285 -0
  409. package/src/playground.ts +52 -0
  410. package/src/relation-repository/belongs-to-many-repository.ts +240 -0
  411. package/src/relation-repository/belongs-to-repository.ts +23 -0
  412. package/src/relation-repository/hasmany-repository.ts +145 -0
  413. package/src/relation-repository/hasone-repository.ts +23 -0
  414. package/src/relation-repository/multiple-relation-repository.ts +198 -0
  415. package/src/relation-repository/relation-repository.ts +114 -0
  416. package/src/relation-repository/single-relation-repository.ts +99 -0
  417. package/src/relation-repository/types.ts +15 -0
  418. package/src/repository.ts +478 -0
  419. package/src/transaction-decorator.ts +58 -0
  420. package/src/update-associations.ts +478 -0
  421. package/src/update-guard.ts +167 -0
  422. package/tsconfig.build.json +9 -0
  423. package/tsconfig.json +5 -0
  424. package/examples/index.ts +0 -125
  425. package/examples/plugins/db-driven/index.ts +0 -25
  426. package/examples/plugins/db-driven/tables/fields.ts +0 -78
  427. package/examples/plugins/db-driven/tables/tables.ts +0 -53
  428. package/examples/tables/bar.js +0 -26
  429. package/examples/tables/comments.ts +0 -19
  430. package/examples/tables/foo.json +0 -3
  431. package/examples/tables/posts.ts +0 -28
  432. package/examples/tables/profiles.ts +0 -23
  433. package/examples/tables/tags.ts +0 -15
  434. package/examples/tables/users.ts +0 -34
  435. package/lib/database.d.ts.map +0 -1
  436. package/lib/fields/field-types.d.ts +0 -419
  437. package/lib/fields/field-types.d.ts.map +0 -1
  438. package/lib/fields/field-types.js +0 -1222
  439. package/lib/fields/field-types.js.map +0 -1
  440. package/lib/fields/index.d.ts.map +0 -1
  441. package/lib/fields/option-types.d.ts +0 -105
  442. package/lib/fields/option-types.d.ts.map +0 -1
  443. package/lib/fields/option-types.js +0 -18
  444. package/lib/fields/option-types.js.map +0 -1
  445. package/lib/index.d.ts.map +0 -1
  446. package/lib/model.d.ts.map +0 -1
  447. package/lib/op.d.ts +0 -45
  448. package/lib/op.d.ts.map +0 -1
  449. package/lib/op.js +0 -225
  450. package/lib/op.js.map +0 -1
  451. package/lib/table.d.ts +0 -56
  452. package/lib/table.d.ts.map +0 -1
  453. package/lib/table.js +0 -456
  454. package/lib/table.js.map +0 -1
  455. package/lib/utils.d.ts +0 -26
  456. package/lib/utils.d.ts.map +0 -1
  457. package/lib/utils.js +0 -438
  458. package/lib/utils.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["fields/field-types.ts"],"names":[],"mappings":"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","file":"field-types.js","sourcesContent":["import {\n Op,\n Utils,\n DataType,\n DataTypes,\n Sequelize,\n HasOneOptions,\n HasManyOptions,\n BelongsToOptions,\n BelongsToManyOptions,\n ThroughOptions,\n} from 'sequelize';\nimport { template, get, toNumber } from 'lodash';\nimport bcrypt from 'bcrypt';\n\nimport * as Options from './option-types';\nimport { getDataTypeKey } from '.';\nimport Table from '../table';\nimport Database from '../database';\nimport Model, { ModelCtor } from '../model';\nimport { whereCompare, isNumber, uid } from '../utils';\n\nexport interface IField {\n\n}\n\nexport interface IFields {\n [key: string]: IField;\n}\n\nexport interface FieldContext {\n sourceTable: Table;\n database: Database,\n}\n\nexport class Field implements IField {\n\n public readonly options: any;\n\n protected context: FieldContext;\n\n constructor(options: any, context: FieldContext) {\n const { type } = options;\n this.options = {\n ...options,\n // type: getDataTypeKey(type)\n };\n this.context = context;\n }\n\n public isMultipleColumns() {\n return false;\n }\n\n public getType() {\n return this.options.type;\n }\n\n public getOptions() {\n return this.options;\n }\n}\n\nexport class Column extends Field {\n\n public getDataType() {\n const { type } = this.options;\n const dataType = getDataTypeKey(type);\n if (DataTypes[dataType]) {\n return DataTypes[dataType];\n }\n return DataTypes[(<typeof Column>this.constructor).name.toUpperCase()];\n }\n\n public getDataTypeInstance(options: any = {}): any {\n const dataType = this.getDataType();\n Object.keys(options).forEach(key => options[key] === undefined && delete options[key]);\n return Object.keys(options).length > 0 ? dataType(options) : dataType;\n }\n\n public getAttributeOptions() {\n return {\n ...this.options,\n type: this.getDataTypeInstance(),\n }\n }\n}\n\nexport class BOOLEAN extends Column {\n}\n\nexport class NUMBER extends Column {\n}\n\nexport class INTEGER extends NUMBER {\n\n public readonly options: Options.IntegerOptions;\n\n public getDataType(): Function {\n const { type } = this.options;\n\n const dataType = getDataTypeKey(type);\n\n return {\n INT: DataTypes.INTEGER,\n INTEGER: DataTypes.INTEGER,\n TINYINT: DataTypes.TINYINT,\n TINYINTEGER: DataTypes.TINYINT,\n SMALLINT: DataTypes.SMALLINT,\n SMALLINTEGER: DataTypes.SMALLINT,\n MEDIUMINT: DataTypes.MEDIUMINT,\n MEDIUMINTEGER: DataTypes.MEDIUMINT,\n BIGINT: DataTypes.BIGINT,\n BIGINTEGER: DataTypes.BIGINT,\n }[dataType] || DataTypes.INTEGER;\n }\n\n public getAttributeOptions() {\n const { length, zerofill, unsigned, ...restOptions } = this.options;\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ length, zerofill, unsigned }),\n }\n }\n}\n\nexport class FLOAT extends NUMBER {\n\n public readonly options: Options.FloatOptions;\n\n public getAttributeOptions() {\n const { length, decimals, ...restOptions } = this.options;\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ length, decimals }),\n }\n }\n}\n\nexport class DOUBLE extends NUMBER {\n public readonly options: Options.DoubleOptions;\n\n public getAttributeOptions() {\n const { length, decimals, ...restOptions } = this.options;\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ length, decimals }),\n }\n }\n}\n\nexport class DECIMAL extends NUMBER {\n\n public readonly options: Options.DecimalOptions;\n\n public getAttributeOptions() {\n const { precision, scale, ...restOptions } = this.options;\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ precision, scale }),\n }\n }\n}\n\nexport class REAL extends NUMBER {\n\n public readonly options: Options.RealOptions;\n\n public getAttributeOptions() {\n const { length, decimals, ...restOptions } = this.options;\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ length, decimals }),\n }\n }\n}\n\nexport class STRING extends Column {\n\n public readonly options: Options.StringOptions;\n\n public getAttributeOptions() {\n const { length, binary, ...restOptions } = this.options;\n\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ length, binary }),\n }\n }\n}\n\nexport class TEXT extends Column {\n\n public readonly options: Options.TextOptions;\n\n public getDataTypeInstance(options: any = {}): any {\n const { database } = this.context;\n const dataType = this.getDataType();\n Object.keys(options).forEach(key => options[key] === undefined && delete options[key]);\n if (database.sequelize.getDialect() === 'postgres') {\n return Object.keys(options).length > 0 ? dataType() : dataType;\n }\n return Object.keys(options).length > 0 ? dataType(options) : dataType;\n }\n\n public getAttributeOptions() {\n const { length, ...restOptions } = this.options;\n\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ length }),\n }\n }\n}\n\nexport class TIME extends Column {\n}\n\nexport class DATE extends Column {\n\n public readonly options: Options.DateOptions;\n\n public getAttributeOptions() {\n const { length, ...restOptions } = this.options;\n\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ length }),\n }\n }\n}\n\nexport class DATEONLY extends Column {\n}\n\nexport class VIRTUAL extends Column {\n}\n\nexport class REFERENCE extends VIRTUAL {\n\n public getDataType() {\n return DataTypes.VIRTUAL;\n }\n\n public getAttributeOptions() {\n const { source, dataIndex, ...restOptions } = this.options;\n\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ source, dataIndex }),\n get() {\n return get(this[source], dataIndex);\n },\n }\n }\n}\n\nexport class FORMULA extends VIRTUAL {\n\n public getDataType() {\n return DataTypes.VIRTUAL;\n }\n\n public getAttributeOptions() {\n const { sourceTable } = this.context;\n const { formula, format = 'string', ...restOptions } = this.options;\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ formula }),\n get() {\n const fields = sourceTable.getFields();\n const data: any = {};\n for (const [name, field] of fields) {\n if (['formula', 'virtual'].indexOf((field.getType() as string).toLowerCase()) === -1) {\n data[name] = this.getDataValue(name);\n }\n }\n try {\n const compiled = template(formula, {\n interpolate: /{{([\\s\\S]+?)}}/g,\n });\n const value = compiled(data);\n return format === 'number' ? toNumber(value) : value;\n } catch (error) {\n console.log(error);\n return;\n }\n }\n }\n }\n}\n\nexport class PASSWORD extends STRING {\n\n public getDataType() {\n return DataTypes.STRING;\n }\n\n constructor(options: Options.StringOptions, context: FieldContext) {\n super(options, context);\n const { database, sourceTable } = context;\n const name = sourceTable.getName();\n database.on(`${name}.beforeCreate`, PASSWORD.hash.bind(this));\n database.on(`${name}.beforeUpdate`, PASSWORD.hash.bind(this));\n }\n\n public static async hash(this: PASSWORD, model) {\n const { name } = this.options;\n if (!model.changed(name as any)) {\n return;\n }\n const value = model.get(name) as string;\n if (value) {\n if (value.startsWith('$2b$10$') && value.length === 60) {\n return;\n }\n const hash = await bcrypt.hash(value, 10);\n model.set(name, hash);\n } else {\n model.set(name, null);\n }\n }\n\n public static async verify(value: string, hash: string) {\n return await bcrypt.compare(value, hash);\n }\n}\n\nexport class ARRAY extends Column {\n\n public readonly options: Options.ArrayOptions;\n\n public getDataType() {\n return DataTypes.JSONB;\n }\n\n public getAttributeOptions() {\n const { items, ...restOptions } = this.options;\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ items }),\n }\n }\n}\n\nexport class JSON extends Column {\n public getDataType() {\n return DataTypes.JSON;\n }\n}\n\nexport class JSONB extends Column {\n public getDataType() {\n if (this.context.database.sequelize.getDialect() === 'postgres') {\n return DataTypes.JSONB;\n }\n return DataTypes.JSON;\n }\n}\n\nexport class UUID extends Column {\n public getDataType() {\n return DataTypes.UUID;\n }\n}\n\nexport class UID extends Column {\n\n constructor(options: Options.StringOptions, context: FieldContext) {\n super(options, context);\n const { sourceTable, database } = context;\n const { name, prefix = '' } = options;\n database.on(`${sourceTable.getName()}.beforeCreate`, (model) => {\n if (!model.get(name)) {\n model.set(name, `${prefix}${uid()}`);\n }\n });\n }\n\n public getDataType() {\n return DataTypes.STRING;\n }\n}\n\nexport class UUIDV4 extends Column {\n public getDataType() {\n return DataTypes.UUIDV4;\n }\n}\n\nexport interface HasOneAccessors {\n get: string;\n set: string;\n create: string;\n}\n\nexport interface HasManyAccessors {\n get: string;\n set: string;\n addMultiple: string;\n add: string;\n create: string;\n remove: string;\n removeMultiple: string;\n hasSingle: string;\n hasAll: string;\n count: string;\n}\n\nexport interface BelongsToAccessors {\n get: string;\n set: string;\n create: string;\n}\n\nexport interface BelongsToManyAccessors {\n get: string;\n set: string;\n addMultiple: string;\n add: string;\n create: string;\n remove: string;\n removeMultiple: string;\n hasSingle: string;\n hasAll: string;\n count: string;\n}\n\nexport abstract class Relation extends Field {\n\n public targetTableInit() {\n const { target, fields = [] } = this.options;\n const children = fields.concat(this.options.children || []);\n if (target && children.length) {\n this.context.database.table({\n name: target,\n fields: children,\n });\n }\n }\n\n public getAssociationType() {\n if (this instanceof HASONE) {\n return 'hasOne';\n }\n if (this instanceof HASMANY) {\n return 'hasMany';\n }\n if (this instanceof BELONGSTO) {\n return 'belongsTo';\n }\n if (this instanceof BELONGSTOMANY) {\n return 'belongsToMany';\n }\n }\n\n public getTarget() {\n const { target, name } = this.options;\n if (target) {\n return target;\n }\n if (this instanceof HASMANY) {\n return name;\n }\n if (this instanceof BELONGSTOMANY) {\n return name;\n }\n return Utils.pluralize(name);\n }\n\n public getTargetModel() {\n const { name } = this.options;\n const { sourceTable } = this.context;\n // @ts-ignore\n return sourceTable.getModel().associations[name].target;\n }\n\n public getAccessors() {\n const { name } = this.options;\n const { sourceTable } = this.context;\n // @ts-ignore\n return sourceTable.getModel().associations[name].accessors;\n }\n\n public getAssociationOptions(): any {\n const { name, ...restOptions } = this.options;\n return {\n as: name,\n ...restOptions,\n };\n }\n\n public getAssociationArguments() {\n return {\n target: this.getTarget(),\n type: this.getAssociationType(),\n options: this.getAssociationOptions(),\n };\n }\n}\n\nclass HasOneOrMany extends Relation {\n constructor(options: Options.HasOneOptions | Options.HasManyOptions, context: FieldContext) {\n const { sourceTable } = context;\n let { foreignKey, sourceKey } = options;\n\n const SourceModel = sourceTable.getModel();\n\n if (!sourceKey) {\n sourceKey = SourceModel.primaryKeyAttribute;\n }\n\n if (!SourceModel.rawAttributes[sourceKey]) {\n sourceTable.addField({\n type: 'integer',\n name: sourceKey,\n unique: true,\n });\n }\n\n if (!foreignKey) {\n foreignKey = Utils.underscoredIf(\n Utils.camelize([\n SourceModel.options.name.singular, sourceKey\n ].join('_')),\n SourceModel.options.underscored\n );\n }\n\n super({ sourceKey, foreignKey, ...options }, context);\n }\n}\n\nexport class HASONE extends HasOneOrMany {\n\n public readonly options: Options.HasOneOptions;\n\n constructor(options: Options.HasOneOptions, context: FieldContext) {\n let { name, target } = options;\n\n if (!target) {\n target = Utils.pluralize(name);\n }\n\n super({ target, ...options }, context);\n\n this.targetTableInit();\n }\n\n public getAccessors(): HasOneAccessors {\n return super.getAccessors();\n }\n\n public getAssociationOptions(): HasOneOptions {\n const { name, ...restOptions } = this.options;\n return {\n as: name,\n ...restOptions,\n }\n }\n}\n\nexport class HASMANY extends HasOneOrMany {\n\n public readonly options: Options.HasManyOptions;\n\n constructor(options: Options.HasManyOptions, context: FieldContext) {\n let { name, target } = options;\n\n if (!target) {\n target = name;\n }\n\n super({ target, ...options }, context);\n this.targetTableInit();\n }\n\n public getAssociationOptions(): HasManyOptions {\n const { name, ...restOptions } = this.options;\n return {\n as: name,\n ...restOptions,\n };\n }\n}\n\nexport class BELONGSTO extends Relation {\n\n public readonly options: Options.BelongsToOptions;\n\n constructor(options: Options.BelongsToOptions, context: FieldContext) {\n let { name, target } = options;\n\n if (!target) {\n target = Utils.pluralize(name);\n }\n\n super({ target, ...options }, context);\n\n this.targetTableInit();\n this.updateOptionsAfterTargetModelBeDefined();\n }\n\n public getAccessors(): BelongsToAccessors {\n return super.getAccessors();\n }\n\n public updateOptionsAfterTargetModelBeDefined() {\n let { name, target, targetKey, foreignKey } = this.options;\n const { database } = this.context;\n\n const TargetModel = database.getModel(target);\n\n if (!TargetModel) {\n return;\n }\n\n if (!targetKey) {\n targetKey = TargetModel.primaryKeyAttribute;\n this.options.targetKey = targetKey;\n }\n\n if (!foreignKey) {\n foreignKey = Utils.underscoredIf(\n Utils.camelize([\n name, targetKey\n ].join('_')),\n TargetModel.options.underscored\n );\n this.options.foreignKey = foreignKey;\n }\n }\n\n public getAssociationOptions(): BelongsToOptions {\n const { name, ...restOptions } = this.options;\n return {\n as: name,\n ...restOptions,\n }\n }\n}\n\nexport class BELONGSTOMANY extends Relation {\n\n public readonly options: Options.BelongsToManyOptions;\n\n constructor(options: Options.BelongsToManyOptions, context: FieldContext) {\n let { name, target, through, sourceKey, foreignKey, targetKey, otherKey } = options;\n const { database, sourceTable } = context;\n const SourceModel = sourceTable.getModel();\n\n if (!target) {\n target = name;\n }\n\n if (!through) {\n through = Utils.underscoredIf(\n Utils.camelize(\n [SourceModel.name, target]\n .map(name => name.toLowerCase())\n .sort()\n .join('_')\n ),\n SourceModel.options.underscored\n );\n }\n\n if (!sourceKey) {\n sourceKey = SourceModel.primaryKeyAttribute;\n }\n\n if (!foreignKey) {\n foreignKey = Utils.underscoredIf(\n Utils.camelize([\n SourceModel.options.name.singular, sourceKey\n ].join('_')),\n SourceModel.options.underscored\n );\n }\n\n super({\n target,\n through,\n sourceKey,\n foreignKey,\n ...options,\n }, context);\n\n this.targetTableInit();\n this.updateOptionsAfterTargetModelBeDefined();\n\n // through table 未特殊定义时,默认根据 through 信息配置 through table\n // database.tables 里不会有 through table,但 database.sequelize.models 有\n database.throughTables.set(this.getThroughName(), [sourceTable.getName(), target]);\n }\n\n public getAccessors(): BelongsToManyAccessors {\n return super.getAccessors();\n }\n\n public updateOptionsAfterTargetModelBeDefined() {\n const { database } = this.context;\n let { target, targetKey, otherKey } = this.options;\n\n const TargetModel = database.getModel(target);\n\n if (!TargetModel) {\n return;\n }\n\n if (!targetKey) {\n targetKey = TargetModel.primaryKeyAttribute;\n this.options.targetKey = targetKey;\n }\n\n if (!otherKey) {\n otherKey = Utils.underscoredIf(\n Utils.camelize([\n TargetModel.options.name.singular, targetKey\n ].join('_')),\n TargetModel.options.underscored\n );\n this.options.otherKey = otherKey;\n }\n }\n\n public getThroughName(): string {\n // TODO name 必须是字符串\n return this.options.through as string;\n }\n\n public getThroughModel(): ModelCtor<Model> {\n const { through, target } = this.options;\n const { database, sourceTable } = this.context;\n\n const throughName = this.getThroughName();\n\n if (database.sequelize.isDefined(throughName)) {\n return database.getModel(throughName);\n }\n\n // 如果不存在 Through Model,需要初始化一个,不能用 Sequelize.Model\n class ThroughModel extends Model { }\n\n // TODO:需要对接 through 的其他参数\n ThroughModel.init({}, {\n modelName: throughName,\n tableName: throughName,\n sequelize: database.sequelize,\n indexes: [],\n underscored: true,\n });\n\n return ThroughModel;\n }\n\n public getAssociationOptions(): BelongsToManyOptions {\n const { name, ...restOptions } = this.options;\n return {\n as: name,\n through: this.getThroughModel(),\n ...restOptions,\n }\n }\n}\n\nexport class SORT extends NUMBER {\n\n public readonly options: Options.SortOptions;\n\n static async beforeCreateHook(this: SORT, model, options) {\n const { name, scope = [] } = this.options;\n // 如果有值,跳过\n if (isNumber(model.get(name))) {\n return;\n }\n const extremum: number = await this.getNextValue({\n ...options,\n where: model.getValuesByFieldNames(scope)\n });\n model.set(name, extremum);\n }\n\n static async beforeBulkCreateHook(this: SORT, models, options) {\n const { transaction } = options;\n const { name, scope = [], next = 'max' } = this.options;\n // 如果未配置范围限定,则可以进行性能优化处理(常用情况)。\n if (!scope.length) {\n const extremum: number = await this.getNextValue({ where: {}, transaction });\n models.forEach((model, i: number) => {\n model.setDataValue(name, extremum + i * (next === 'max' ? 1 : -1));\n });\n return;\n }\n\n // 用于存放 where 条件与计算极值\n const groups = new Map<{ [key: string]: any }, number>();\n await models.reduce((promise, model) => promise.then(async () => {\n const where = model.getValuesByFieldNames(scope);\n\n let extremum: number;\n // 以 map 作为 key\n let combo;\n // 查找与 where 值相等的组合\n for (combo of groups.keys()) {\n if (whereCompare(combo, where)) {\n // 如果找到的话则以之前储存的值作为基础极值\n extremum = groups.get(combo) + (next === 'max' ? 1 : -1);\n break;\n }\n }\n // 如未找到组合\n if (typeof extremum === 'undefined') {\n // 则使用 where 条件查询极值\n extremum = await this.getNextValue({ where, transaction });\n // 且使用 where 条件创建组合\n combo = where;\n }\n const nextValue = extremum;\n // 设置数据行的排序值\n model.setDataValue(name, nextValue);\n // 保存新的排序值为对应 where 组合的极值,以供下次计算\n groups.set(combo, nextValue);\n }), Promise.resolve());\n }\n\n constructor(options: Options.SortOptions, context: FieldContext) {\n super(options, context);\n // const Model = context.sourceTable.getModel();\n // TODO(feature): 可考虑策略模式,以在需要时对外提供接口\n const { database, sourceTable } = context;\n const name = sourceTable.getName();\n database.on(`${name}.beforeCreate`, SORT.beforeCreateHook.bind(this));\n database.on(`${name}.beforeBulkCreate`, SORT.beforeBulkCreateHook.bind(this));\n // Model.addHook('beforeCreate', SORT.beforeCreateHook.bind(this));\n // Model.addHook('beforeBulkCreate', SORT.beforeBulkCreateHook.bind(this));\n }\n\n public getDataType(): Function {\n return DataTypes.INTEGER;\n }\n\n public async getNextValue(this: SORT, { where, transaction, next: n = 'max' }) {\n const table = this.context.sourceTable;\n const Model = table.getModel();\n const { name, next = n } = this.options;\n const extremum: number = await Model[next](name, { where, transaction }) || 0;\n return extremum + (next === 'max' ? 1 : -1);\n }\n}\n\nexport class Radio extends BOOLEAN {\n\n public readonly options: Options.RadioOptions;\n\n static async beforeCreateHook(this: Radio, model, options) {\n const { name, defaultValue = false, scope = [] } = this.options;\n const { transaction } = options;\n const value = model.get(name) || defaultValue;\n model.set(name, value);\n if (value) {\n const where = model.getValuesByFieldNames(scope);\n await this.setOthers({ where, transaction });\n }\n }\n\n static async beforeUpdateHook(this: Radio, model, options) {\n const { name, scope = [] } = this.options;\n const { transaction, association } = options;\n if (model.changed(name) && model.get(name) && !association) {\n const where = model.getValuesByFieldNames(scope);\n const { primaryKeyAttribute } = model.constructor;\n where[primaryKeyAttribute] = { [Op.ne]: model.get(primaryKeyAttribute) }\n await this.setOthers({ where, transaction });\n }\n }\n\n static async beforeBulkCreateHook(this: Radio, models, options) {\n const { scope = [] } = this.options;\n const { transaction } = options;\n\n // 如果未配置范围限定,则可以进行性能优化处理(常用情况)。\n if (!scope.length) {\n await this.makeGroup(models, { transaction });\n return;\n }\n\n const groups = new Map<{ [key: string]: any }, any[]>();\n // 按 scope 先分组\n models.forEach(model => {\n const where = model.getValuesByFieldNames(scope);\n // 以 map 作为 key\n let combo;\n let group;\n // 查找与 where 值相等的组合\n for (combo of groups.keys()) {\n if (whereCompare(combo, where)) {\n group = groups.get(combo);\n break;\n }\n }\n if (!group) {\n group = [];\n groups.set(where, group);\n }\n group.push(model);\n });\n\n for (const [where, group] of groups) {\n await this.makeGroup(group, { where, transaction });\n }\n }\n\n constructor({ type, ...options }: Options.RadioOptions, context: FieldContext) {\n super({ ...options, type: 'radio' }, context);\n // const Model = context.sourceTable.getModel();\n // TODO(feature): 可考虑策略模式,以在需要时对外提供接口\n // Model.addHook('beforeCreate', Radio.beforeCreateHook.bind(this));\n // Model.addHook('beforeUpdate', Radio.beforeUpdateHook.bind(this));\n // // Model.addHook('beforeUpsert', beforeSaveHook);\n // Model.addHook('beforeBulkCreate', Radio.beforeBulkCreateHook.bind(this));\n // TODO(optimize): bulkUpdate 的 hooks 参数不一样,没有对象列表,考虑到很少用,暂时不实现\n // Model.addHook('beforeBulkUpdate', beforeBulkCreateHook);\n const { database, sourceTable } = context;\n const name = sourceTable.getName();\n database.on(`${name}.beforeCreate`, Radio.beforeCreateHook.bind(this));\n database.on(`${name}.beforeUpdate`, Radio.beforeUpdateHook.bind(this));\n database.on(`${name}.beforeBulkCreate`, Radio.beforeBulkCreateHook.bind(this));\n }\n\n public getDataType() {\n return DataTypes.BOOLEAN;\n }\n\n public async setOthers(this: Radio, { where = {}, transaction }) {\n const { name } = this.options;\n const table = this.context.sourceTable;\n const Model = table.getModel();\n // 防止 beforeBulkUpdate hook 死循环,因外层 bulkUpdate 并不禁用,正常更新无影响。\n await Model.update({ [name]: false }, {\n where: {\n ...where,\n [name]: true\n },\n transaction,\n hooks: false\n });\n }\n\n async makeGroup(this: Radio, models, { where = {}, transaction }) {\n const { name, defaultValue = false } = this.options;\n let lastTrue;\n let lastNull;\n models.forEach(model => {\n const value = model.get(name);\n if (value) {\n lastTrue = model;\n } else if (value == null) {\n lastNull = model;\n }\n model.set(name, false);\n });\n if (lastTrue) {\n lastTrue.set(name, true);\n } else if (defaultValue && lastNull) {\n lastNull.set(name, true);\n }\n\n await this.setOthers({ where, transaction });\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["fields/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAiC9C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAa9B,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAEvD;AAOD,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,QAM7C;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,OAMnC;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM,CAchD;AAQD,wBAAgB,UAAU,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,YAAY,OAS7E","file":"index.d.ts","sourcesContent":["import * as Fields from './field-types';\nimport { IField, IFields } from './field-types';\nimport { FieldOptions } from './option-types';\nimport { Sequelize } from 'sequelize';\n\n/**\n * 字段统一都叫 Field,分 Column 和 Relation 两大类\n * \n * Column:\n * \n * - Boolean\n * - Number\n * - Integer\n * - Float\n * - Double\n * - Decimal\n * - Real\n * - String\n * - Text\n * - Array\n * - Json\n * - Jsonb\n * - Time\n * - Date\n * - Dateonly\n * - Virtual\n * - Formula\n * \n * Relation:\n * \n * - HasOne\n * - HasMany\n * - BelongsTo\n * - BelongsToMany\n */\nexport * from './option-types';\nexport * from './field-types';\n\n/**\n * 全局已注册字段\n */\nconst registeredFields = new Map<string, any>();\n\n/**\n * 字段注册\n *\n * @param key \n * @param field \n */\nexport function registerField(key: string, field: IField) {\n registeredFields.set(key.toUpperCase(), field);\n}\n\n/**\n * 字段批量注册\n * \n * @param fields \n */\nexport function registerFields(fields: IFields) {\n for (const key in fields) {\n if (fields.hasOwnProperty(key)) {\n registerField(key, fields[key]);\n }\n }\n}\n\nexport function getField(key: string) {\n key = key.toUpperCase();\n if (registeredFields.has(key)) {\n return registeredFields.get(key);\n }\n return Fields.Column;\n}\n\nexport function getDataTypeKey(type: any): string {\n if (typeof type === 'string') {\n return type.toUpperCase();\n }\n\n if (Object.prototype.hasOwnProperty.call(type, 'key')) {\n return type.key.toUpperCase();\n }\n // @ts-ignore\n if (type instanceof Sequelize.DataTypes.ABSTRACT) {\n return type.constructor.name.toUpperCase();\n }\n\n return type.toUpperCase();\n}\n\n/**\n * 字段配置初始化\n *\n * @param options \n * @param context \n */\nexport function buildField(options: FieldOptions, context: Fields.FieldContext) {\n let { type } = options;\n // @ts-ignore\n if (type instanceof Sequelize.DataTypes.ABSTRACT) {\n options = { ...type.options, ...options };\n }\n const dataType = getDataTypeKey(type);\n const Field = getField(dataType);\n return new Field({ type, ...options }, context);\n}\n\nregisterFields({\n ...Fields,\n // aliases\n INT: Fields.INTEGER,\n TINYINT: Fields.INTEGER,\n TINYINTEGER: Fields.INTEGER,\n SMALLINT: Fields.INTEGER,\n SMALLINTEGER: Fields.INTEGER,\n MEDIUMINT: Fields.INTEGER,\n MEDIUMINTEGER: Fields.INTEGER,\n BIGINT: Fields.INTEGER,\n BIGINTEGER: Fields.INTEGER,\n TIMESTAMP: Fields.DATE,\n});\n"]}
@@ -1,105 +0,0 @@
1
- import { DataType, DataTypes, ModelAttributeColumnOptions, StringDataTypeOptions, IntegerDataTypeOptions, TextDataTypeOptions, FloatDataTypeOptions, DecimalDataTypeOptions, DoubleDataTypeOptions, RealDataTypeOptions, DateDataTypeOptions, HasOneOptions as SequelizeHasOneOptions, HasManyOptions as SequelizeHasManyOptions, BelongsToOptions as SequelizeBelongsToOptions, BelongsToManyOptions as SequelizeBelongsToManyOptions, ModelIndexesOptions } from 'sequelize';
2
- export interface AbstractFieldOptions {
3
- name: string;
4
- [key: string]: any;
5
- }
6
- export interface AbstractColumnOptions extends AbstractFieldOptions, Omit<ModelAttributeColumnOptions, 'type'> {
7
- dataType?: DataType;
8
- index?: boolean | ModelIndexesOptions;
9
- }
10
- export interface AbstractRelationOptions extends AbstractFieldOptions {
11
- target?: string;
12
- }
13
- export interface BooleanOptions extends AbstractColumnOptions {
14
- type: 'boolean';
15
- }
16
- export interface NumberOptions extends AbstractColumnOptions {
17
- }
18
- export interface IntegerOptions extends IntegerDataTypeOptions, NumberOptions {
19
- type: 'int' | 'integer' | typeof DataTypes.INTEGER | 'tinyint' | 'tinyInteger' | typeof DataTypes.TINYINT | 'smallint' | 'smallInteger' | typeof DataTypes.SMALLINT | 'mediumint' | 'mediumInteger' | typeof DataTypes.MEDIUMINT | 'bigint' | 'bigInteger' | typeof DataTypes.BIGINT;
20
- }
21
- export interface FloatOptions extends FloatDataTypeOptions, NumberOptions {
22
- type: 'float' | typeof DataTypes.FLOAT;
23
- }
24
- export interface DoubleOptions extends DoubleDataTypeOptions, NumberOptions {
25
- type: 'double' | typeof DataTypes.DOUBLE;
26
- }
27
- export interface DecimalOptions extends DecimalDataTypeOptions, NumberOptions {
28
- type: 'decimal' | typeof DataTypes.DECIMAL;
29
- }
30
- export interface RealOptions extends RealDataTypeOptions, NumberOptions {
31
- type: 'real' | typeof DataTypes.REAL;
32
- }
33
- export interface StringOptions extends StringDataTypeOptions, AbstractColumnOptions {
34
- type: 'string' | typeof DataTypes.STRING;
35
- }
36
- export interface PasswordOptions extends Omit<StringOptions, 'type'> {
37
- type: 'password';
38
- }
39
- export interface TextOptions extends TextDataTypeOptions, AbstractColumnOptions {
40
- type: 'text' | typeof DataTypes.TEXT;
41
- }
42
- export interface TimeOptions extends DateDataTypeOptions, AbstractColumnOptions {
43
- type: 'time' | typeof DataTypes.TIME;
44
- }
45
- export interface DateOptions extends DateDataTypeOptions, AbstractColumnOptions {
46
- type: 'date' | typeof DataTypes.DATE;
47
- }
48
- export interface DateOnlyOptions extends AbstractColumnOptions {
49
- type: 'dateonly' | typeof DataTypes.DATEONLY;
50
- }
51
- export interface ArrayOptions extends AbstractColumnOptions {
52
- type: 'array' | typeof DataTypes.ARRAY;
53
- items?: any;
54
- }
55
- export interface JsonOptions extends AbstractColumnOptions {
56
- type: 'json' | 'jsonb' | typeof DataTypes.JSON | typeof DataTypes.JSONB;
57
- fields?: any;
58
- }
59
- export interface VirtualOptions extends AbstractColumnOptions {
60
- type: 'virtual';
61
- }
62
- export interface FormulaOptions extends AbstractColumnOptions {
63
- type: 'formula';
64
- formula: string;
65
- format: 'string' | 'number';
66
- }
67
- export interface ReferenceOptions extends AbstractColumnOptions {
68
- type: 'reference';
69
- source: string;
70
- dataIndex: string;
71
- }
72
- export interface HasOneOptions extends SequelizeHasOneOptions, AbstractRelationOptions {
73
- type: 'hasOne' | 'hasone';
74
- }
75
- export interface HasManyOptions extends SequelizeHasManyOptions, AbstractRelationOptions {
76
- type: 'hasMany' | 'hasmany';
77
- sourceKey?: string;
78
- foreignKey?: string;
79
- }
80
- export interface BelongsToOptions extends SequelizeBelongsToOptions, AbstractRelationOptions {
81
- type: 'belongsTo' | 'belongsto';
82
- targetKey?: string;
83
- foreignKey?: string;
84
- }
85
- export interface BelongsToManyOptions extends Omit<SequelizeBelongsToManyOptions, 'through'>, AbstractRelationOptions {
86
- type: 'belongsToMany' | 'belongstomany';
87
- through?: string;
88
- sourceKey?: string;
89
- foreignKey?: string;
90
- targetKey?: string;
91
- otherKey?: string;
92
- }
93
- export interface SortOptions extends NumberOptions {
94
- type: 'sort';
95
- scope?: string[];
96
- next?: 'min' | 'max';
97
- }
98
- export interface RadioOptions extends Omit<BooleanOptions, 'type'> {
99
- type: 'radio';
100
- scope?: string[];
101
- }
102
- export declare type ColumnOptions = AbstractFieldOptions | BooleanOptions | NumberOptions | IntegerOptions | FloatOptions | DoubleOptions | DecimalOptions | RealOptions | StringOptions | PasswordOptions | TextOptions | TimeOptions | DateOptions | DateOnlyOptions | ArrayOptions | JsonOptions | VirtualOptions | FormulaOptions | ReferenceOptions | SortOptions;
103
- export declare type ElementOptions = BooleanOptions | IntegerOptions | FloatOptions | DoubleOptions | DecimalOptions | RealOptions | StringOptions | TextOptions | TimeOptions | DateOptions | DateOnlyOptions | ArrayOptions | JsonOptions | VirtualOptions | SortOptions;
104
- export declare type RelationOptions = HasOneOptions | HasManyOptions | BelongsToOptions | BelongsToManyOptions;
105
- export declare type FieldOptions = ColumnOptions | RelationOptions;
@@ -1 +0,0 @@
1
- {"version":3,"sources":["fields/option-types.ts"],"names":[],"mappings":"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","file":"option-types.d.ts","sourcesContent":["import {\n Utils,\n DataType,\n DataTypes,\n Sequelize,\n ModelAttributeColumnOptions,\n ThroughOptions,\n StringDataTypeOptions,\n IntegerDataTypeOptions,\n NumberDataTypeOptions,\n TextDataTypeOptions,\n FloatDataTypeOptions,\n DecimalDataTypeOptions,\n DoubleDataTypeOptions,\n RealDataTypeOptions,\n DateDataTypeOptions,\n HasOneOptions as SequelizeHasOneOptions,\n HasManyOptions as SequelizeHasManyOptions,\n BelongsToOptions as SequelizeBelongsToOptions,\n BelongsToManyOptions as SequelizeBelongsToManyOptions,\n ModelIndexesOptions,\n} from 'sequelize';\n\nexport interface AbstractFieldOptions {\n name: string;\n [key: string]: any;\n}\n\nexport interface AbstractColumnOptions extends AbstractFieldOptions, Omit<ModelAttributeColumnOptions, 'type'> {\n dataType?: DataType;\n index?: boolean | ModelIndexesOptions;\n}\n\nexport interface AbstractRelationOptions extends AbstractFieldOptions {\n target?: string;\n}\n\nexport interface BooleanOptions extends AbstractColumnOptions {\n type: 'boolean';\n}\n\nexport interface NumberOptions extends AbstractColumnOptions {\n // type: 'number' | typeof DataTypes.NUMBER | string;\n}\n\nexport interface IntegerOptions extends IntegerDataTypeOptions, NumberOptions {\n type: 'int' | 'integer' | typeof DataTypes.INTEGER |\n 'tinyint' | 'tinyInteger' | typeof DataTypes.TINYINT |\n 'smallint' | 'smallInteger' | typeof DataTypes.SMALLINT |\n 'mediumint' | 'mediumInteger' | typeof DataTypes.MEDIUMINT |\n 'bigint' | 'bigInteger' | typeof DataTypes.BIGINT;\n}\n\nexport interface FloatOptions extends FloatDataTypeOptions, NumberOptions {\n type: 'float' | typeof DataTypes.FLOAT;\n}\n\nexport interface DoubleOptions extends DoubleDataTypeOptions, NumberOptions {\n type: 'double' | typeof DataTypes.DOUBLE;\n}\n\nexport interface DecimalOptions extends DecimalDataTypeOptions, NumberOptions {\n type: 'decimal' | typeof DataTypes.DECIMAL;\n}\n\nexport interface RealOptions extends RealDataTypeOptions, NumberOptions {\n type: 'real' | typeof DataTypes.REAL;\n}\n\nexport interface StringOptions extends StringDataTypeOptions, AbstractColumnOptions {\n type: 'string' | typeof DataTypes.STRING;\n}\n\nexport interface PasswordOptions extends Omit<StringOptions, 'type'> {\n type: 'password';\n}\n\nexport interface TextOptions extends TextDataTypeOptions, AbstractColumnOptions {\n type: 'text' | typeof DataTypes.TEXT;\n}\n\nexport interface TimeOptions extends DateDataTypeOptions, AbstractColumnOptions {\n type: 'time' | typeof DataTypes.TIME;\n}\n\nexport interface DateOptions extends DateDataTypeOptions, AbstractColumnOptions {\n type: 'date' | typeof DataTypes.DATE;\n}\n\nexport interface DateOnlyOptions extends AbstractColumnOptions {\n type: 'dateonly' | typeof DataTypes.DATEONLY;\n}\n\nexport interface ArrayOptions extends AbstractColumnOptions {\n type: 'array' | typeof DataTypes.ARRAY;\n items?: any;\n}\n\nexport interface JsonOptions extends AbstractColumnOptions {\n type: 'json' | 'jsonb' | typeof DataTypes.JSON | typeof DataTypes.JSONB;\n fields?: any;\n}\n\nexport interface VirtualOptions extends AbstractColumnOptions {\n type: 'virtual';\n}\n\nexport interface FormulaOptions extends AbstractColumnOptions {\n type: 'formula';\n formula: string;\n format: 'string' | 'number';\n}\n\nexport interface ReferenceOptions extends AbstractColumnOptions {\n type: 'reference';\n source: string;\n dataIndex: string;\n}\n\nexport interface HasOneOptions extends SequelizeHasOneOptions, AbstractRelationOptions {\n type: 'hasOne' | 'hasone';\n}\n\nexport interface HasManyOptions extends SequelizeHasManyOptions, AbstractRelationOptions {\n type: 'hasMany' | 'hasmany';\n /**\n * The name of the field to use as the key for the association in the source table. \n * Defaults to the primary key of the source table\n */\n sourceKey?: string;\n /**\n * Defaults to source singular name + sourceKey\n */\n foreignKey?: string;\n}\n\nexport interface BelongsToOptions extends SequelizeBelongsToOptions, AbstractRelationOptions {\n type: 'belongsTo' | 'belongsto';\n /**\n * The name of the field to use as the key for the association in the target table. \n * Defaults to the primary key of the target table\n */\n targetKey?: string;\n /**\n * Defaults to name + targetKey\n */\n foreignKey?: string;\n}\n\nexport interface BelongsToManyOptions extends Omit<SequelizeBelongsToManyOptions, 'through'>, AbstractRelationOptions {\n type: 'belongsToMany' | 'belongstomany';\n /**\n * Defaults to the name of source + the name of target\n * \n * 两个 name 按字母顺序排序之后连接,如:\n * users.belongsToMany(posts) -> through = posts_users\n */\n through?: string;\n /**\n * Defaults to the primary key of the source table\n */\n sourceKey?: string;\n /**\n * Defaults to the name of source + sourceKey\n */\n foreignKey?: string;\n /**\n * Defaults to the primary key of the target table\n */\n targetKey?: string;\n /**\n * Defaults to the name of target + targetKey\n */\n otherKey?: string;\n}\n\nexport interface SortOptions extends NumberOptions {\n type: 'sort';\n /**\n * 排序限定范围\n * \n * 在同表的限定范围内的字段值相等的数据行中排序\n */\n scope?: string[];\n /**\n * 新值创建策略\n * \n * max: 使用最大值\n * min: 使用最小值\n * \n * Defaults to 'max'\n */\n next?: 'min' | 'max';\n}\n\nexport interface RadioOptions extends Omit<BooleanOptions, 'type'> {\n type: 'radio';\n /**\n * 默认限定范围\n * \n * 在同表的限定范围内的字段值相等的数据行中设置默认\n */\n scope?: string[];\n}\n\nexport type ColumnOptions = AbstractFieldOptions\n | BooleanOptions\n | NumberOptions\n | IntegerOptions\n | FloatOptions\n | DoubleOptions\n | DecimalOptions\n | RealOptions\n | StringOptions\n | PasswordOptions\n | TextOptions\n | TimeOptions\n | DateOptions\n | DateOnlyOptions\n | ArrayOptions\n | JsonOptions\n | VirtualOptions\n | FormulaOptions\n | ReferenceOptions \n | SortOptions;\n\nexport type ElementOptions = BooleanOptions\n | IntegerOptions\n | FloatOptions\n | DoubleOptions\n | DecimalOptions\n | RealOptions\n | StringOptions\n | TextOptions\n | TimeOptions\n | DateOptions\n | DateOnlyOptions\n | ArrayOptions\n | JsonOptions\n | VirtualOptions\n | SortOptions;\n\nexport type RelationOptions = HasOneOptions | HasManyOptions | BelongsToOptions | BelongsToManyOptions;\n\nexport type FieldOptions = ColumnOptions | RelationOptions;\n"]}
@@ -1,18 +0,0 @@
1
- "use strict";
2
-
3
- function _react() {
4
- const data = _interopRequireDefault(require("react"));
5
-
6
- _react = function _react() {
7
- return data;
8
- };
9
-
10
- return data;
11
- }
12
-
13
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
14
-
15
- Object.defineProperty(exports, "__esModule", {
16
- value: true
17
- });
18
- //# sourceMappingURL=option-types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["fields/option-types.ts"],"names":[],"mappings":"","file":"option-types.js","sourcesContent":["import {\n Utils,\n DataType,\n DataTypes,\n Sequelize,\n ModelAttributeColumnOptions,\n ThroughOptions,\n StringDataTypeOptions,\n IntegerDataTypeOptions,\n NumberDataTypeOptions,\n TextDataTypeOptions,\n FloatDataTypeOptions,\n DecimalDataTypeOptions,\n DoubleDataTypeOptions,\n RealDataTypeOptions,\n DateDataTypeOptions,\n HasOneOptions as SequelizeHasOneOptions,\n HasManyOptions as SequelizeHasManyOptions,\n BelongsToOptions as SequelizeBelongsToOptions,\n BelongsToManyOptions as SequelizeBelongsToManyOptions,\n ModelIndexesOptions,\n} from 'sequelize';\n\nexport interface AbstractFieldOptions {\n name: string;\n [key: string]: any;\n}\n\nexport interface AbstractColumnOptions extends AbstractFieldOptions, Omit<ModelAttributeColumnOptions, 'type'> {\n dataType?: DataType;\n index?: boolean | ModelIndexesOptions;\n}\n\nexport interface AbstractRelationOptions extends AbstractFieldOptions {\n target?: string;\n}\n\nexport interface BooleanOptions extends AbstractColumnOptions {\n type: 'boolean';\n}\n\nexport interface NumberOptions extends AbstractColumnOptions {\n // type: 'number' | typeof DataTypes.NUMBER | string;\n}\n\nexport interface IntegerOptions extends IntegerDataTypeOptions, NumberOptions {\n type: 'int' | 'integer' | typeof DataTypes.INTEGER |\n 'tinyint' | 'tinyInteger' | typeof DataTypes.TINYINT |\n 'smallint' | 'smallInteger' | typeof DataTypes.SMALLINT |\n 'mediumint' | 'mediumInteger' | typeof DataTypes.MEDIUMINT |\n 'bigint' | 'bigInteger' | typeof DataTypes.BIGINT;\n}\n\nexport interface FloatOptions extends FloatDataTypeOptions, NumberOptions {\n type: 'float' | typeof DataTypes.FLOAT;\n}\n\nexport interface DoubleOptions extends DoubleDataTypeOptions, NumberOptions {\n type: 'double' | typeof DataTypes.DOUBLE;\n}\n\nexport interface DecimalOptions extends DecimalDataTypeOptions, NumberOptions {\n type: 'decimal' | typeof DataTypes.DECIMAL;\n}\n\nexport interface RealOptions extends RealDataTypeOptions, NumberOptions {\n type: 'real' | typeof DataTypes.REAL;\n}\n\nexport interface StringOptions extends StringDataTypeOptions, AbstractColumnOptions {\n type: 'string' | typeof DataTypes.STRING;\n}\n\nexport interface PasswordOptions extends Omit<StringOptions, 'type'> {\n type: 'password';\n}\n\nexport interface TextOptions extends TextDataTypeOptions, AbstractColumnOptions {\n type: 'text' | typeof DataTypes.TEXT;\n}\n\nexport interface TimeOptions extends DateDataTypeOptions, AbstractColumnOptions {\n type: 'time' | typeof DataTypes.TIME;\n}\n\nexport interface DateOptions extends DateDataTypeOptions, AbstractColumnOptions {\n type: 'date' | typeof DataTypes.DATE;\n}\n\nexport interface DateOnlyOptions extends AbstractColumnOptions {\n type: 'dateonly' | typeof DataTypes.DATEONLY;\n}\n\nexport interface ArrayOptions extends AbstractColumnOptions {\n type: 'array' | typeof DataTypes.ARRAY;\n items?: any;\n}\n\nexport interface JsonOptions extends AbstractColumnOptions {\n type: 'json' | 'jsonb' | typeof DataTypes.JSON | typeof DataTypes.JSONB;\n fields?: any;\n}\n\nexport interface VirtualOptions extends AbstractColumnOptions {\n type: 'virtual';\n}\n\nexport interface FormulaOptions extends AbstractColumnOptions {\n type: 'formula';\n formula: string;\n format: 'string' | 'number';\n}\n\nexport interface ReferenceOptions extends AbstractColumnOptions {\n type: 'reference';\n source: string;\n dataIndex: string;\n}\n\nexport interface HasOneOptions extends SequelizeHasOneOptions, AbstractRelationOptions {\n type: 'hasOne' | 'hasone';\n}\n\nexport interface HasManyOptions extends SequelizeHasManyOptions, AbstractRelationOptions {\n type: 'hasMany' | 'hasmany';\n /**\n * The name of the field to use as the key for the association in the source table. \n * Defaults to the primary key of the source table\n */\n sourceKey?: string;\n /**\n * Defaults to source singular name + sourceKey\n */\n foreignKey?: string;\n}\n\nexport interface BelongsToOptions extends SequelizeBelongsToOptions, AbstractRelationOptions {\n type: 'belongsTo' | 'belongsto';\n /**\n * The name of the field to use as the key for the association in the target table. \n * Defaults to the primary key of the target table\n */\n targetKey?: string;\n /**\n * Defaults to name + targetKey\n */\n foreignKey?: string;\n}\n\nexport interface BelongsToManyOptions extends Omit<SequelizeBelongsToManyOptions, 'through'>, AbstractRelationOptions {\n type: 'belongsToMany' | 'belongstomany';\n /**\n * Defaults to the name of source + the name of target\n * \n * 两个 name 按字母顺序排序之后连接,如:\n * users.belongsToMany(posts) -> through = posts_users\n */\n through?: string;\n /**\n * Defaults to the primary key of the source table\n */\n sourceKey?: string;\n /**\n * Defaults to the name of source + sourceKey\n */\n foreignKey?: string;\n /**\n * Defaults to the primary key of the target table\n */\n targetKey?: string;\n /**\n * Defaults to the name of target + targetKey\n */\n otherKey?: string;\n}\n\nexport interface SortOptions extends NumberOptions {\n type: 'sort';\n /**\n * 排序限定范围\n * \n * 在同表的限定范围内的字段值相等的数据行中排序\n */\n scope?: string[];\n /**\n * 新值创建策略\n * \n * max: 使用最大值\n * min: 使用最小值\n * \n * Defaults to 'max'\n */\n next?: 'min' | 'max';\n}\n\nexport interface RadioOptions extends Omit<BooleanOptions, 'type'> {\n type: 'radio';\n /**\n * 默认限定范围\n * \n * 在同表的限定范围内的字段值相等的数据行中设置默认\n */\n scope?: string[];\n}\n\nexport type ColumnOptions = AbstractFieldOptions\n | BooleanOptions\n | NumberOptions\n | IntegerOptions\n | FloatOptions\n | DoubleOptions\n | DecimalOptions\n | RealOptions\n | StringOptions\n | PasswordOptions\n | TextOptions\n | TimeOptions\n | DateOptions\n | DateOnlyOptions\n | ArrayOptions\n | JsonOptions\n | VirtualOptions\n | FormulaOptions\n | ReferenceOptions \n | SortOptions;\n\nexport type ElementOptions = BooleanOptions\n | IntegerOptions\n | FloatOptions\n | DoubleOptions\n | DecimalOptions\n | RealOptions\n | StringOptions\n | TextOptions\n | TimeOptions\n | DateOptions\n | DateOnlyOptions\n | ArrayOptions\n | JsonOptions\n | VirtualOptions\n | SortOptions;\n\nexport type RelationOptions = HasOneOptions | HasManyOptions | BelongsToOptions | BelongsToManyOptions;\n\nexport type FieldOptions = ColumnOptions | RelationOptions;\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,YAAY,CAAC;AAElC,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,MAAM,CAAC;AAE3C,eAAe,QAAQ,CAAC","file":"index.d.ts","sourcesContent":["import Database from './database';\n\nexport * from './database';\nexport * from './model';\nexport * from './table';\nexport * from './fields';\nexport * from './utils';\nexport { default as Operator } from './op';\n\nexport default Database;\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["model.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,IAAI,cAAc,EAGvB,eAAe,EAEf,WAAW,EACZ,MAAM,WAAW,CAAC;AACnB,OAAO,QAAQ,MAAM,YAAY,CAAC;AAUlC,MAAM,WAAW,cAAc;IAmB7B,MAAM,CAAC,EACH,MAAM,EAAE,GACR;QACE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;KACpB,GACD;QACE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IAwCN,MAAM,CAAC,EAAE,GAAG,CAAC;IASb,IAAI,CAAC,EAAE,GAAG,CAAC;IAKX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,OAAO,CAAC,EAAE,GAAG,CAAC;IAEd,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,yBAAyB;IAIxC,WAAW,EAAE,MAAM,CAAC;IAiBpB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,KAAK,CAAC,EAAE,GAAG,CAAC;IAKZ,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,eAAO,MAAM,cAAc,IAAI,CAAC;AAChC,eAAO,MAAM,aAAa,MAAM,CAAC;AACjC,eAAO,MAAM,SAAS,MAAM,CAAC;AAE7B,MAAM,WAAW,wBAAyB,SAAQ,WAAW;IAC3D,OAAO,CAAC,EAAE,GAAG,CAAC;CACf;AAQD,8BAAsB,KAAM,SAAQ,cAAc;IAIhD,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;IAOnB,OAAc,QAAQ,EAAE,QAAQ,CAAC;IAKjC,IAAI,QAAQ,IAAI,QAAQ,CAGvB;IASD,MAAM,CAAC,kBAAkB,CACvB,OAAO,CAAC,EAAE,MAAM,GAAG,yBAAyB,GAC3C,MAAM,GAAG,eAAe;IAuE3B,MAAM,CAAC,WAAW,CAAC,OAAO,KAAK,GAAG,MAAM;IAOxC,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,cAAc;IAyB3C,qBAAqB,CAAC,KAAK,QAAK;IAsB1B,uBAAuB,CAC3B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,GAAG,EACT,OAAO,GAAE,wBAA6B;IA0DlC,yBAAyB,CAC7B,eAAe,EAAE,MAAM,EACvB,IAAI,EAAE,GAAG,EACT,OAAO,GAAE,wBAA6B;IAyKlC,iBAAiB,CACrB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,GAAG,EACT,OAAO,GAAE,wBAA6B;IAmBlC,kBAAkB,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,GAAE,wBAA6B;CAuB3E;AAKD,oBAAY,SAAS,CAAC,CAAC,SAAS,KAAK,IAAI,OAAO,KAAK,GAAG;IAAE,QAAQ,CAAC,CAAA;CAAE,GAAG;IACtE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB,CAAC;AAEF,eAAe,KAAK,CAAC","file":"model.d.ts","sourcesContent":["import {\n Model as SequelizeModel,\n Op,\n Sequelize,\n ProjectionAlias,\n Utils,\n SaveOptions,\n} from 'sequelize';\nimport Database from './database';\nimport {\n getDataTypeKey,\n HASONE,\n HASMANY,\n BELONGSTO,\n BELONGSTOMANY,\n} from './fields';\nimport { toInclude } from './utils';\n\nexport interface ApiJsonOptions {\n /**\n * 字段\n *\n * 数组式:\n * ['col', 'association.col1', 'association_count'],\n *\n * 白名单:\n * {\n * only: ['col1'],\n * appends: ['association_count'],\n * }\n *\n * 黑名单:\n * {\n * except: ['col1'],\n * appends: ['association_count'],\n * }\n */\n fields?:\n | string[]\n | {\n only?: string[];\n appends?: string[];\n }\n | {\n except?: string[];\n appends?: string[];\n };\n\n /**\n * 过滤\n *\n * 常规用法:\n * {\n * col1: {\n * $eq: 'val1'\n * },\n * }\n *\n * scope 的用法(如果 scope 与 col 同名,只会执行 scope):\n * {\n * scope1: value\n * }\n *\n * json 数据 & 关系数据,可以用点号:\n * {\n * 'association.col1': {\n * $eq: 'val1'\n * },\n * }\n *\n * meta 为 json 字段时\n * {\n * 'meta.key': {\n * $eq: 'val1'\n * },\n * }\n *\n * json 数据 & 关系数据的查询也可以不用点号:\n * {\n * association: {\n * col1: {\n * $eq: 'val1'\n * },\n * },\n * }\n */\n filter?: any;\n\n /**\n * 排序\n *\n * TODO\n *\n * ['col1', '-col2', 'association.col1', '-association.col2']\n */\n sort?: any;\n\n /**\n * 页码\n */\n page?: number;\n perPage?: number;\n\n context?: any;\n\n [key: string]: any;\n}\n\nexport interface WithCountAttributeOptions {\n /**\n * 关系名\n */\n association: string;\n\n /**\n * SourceModel 别名\n *\n * 在 include 里使用时,需要指定,一般与 include 的 association 同名\n *\n * include: {\n * association: 'user', // Post.belongsTo(User)\n * attributes: [\n * User.withCountAttribute({\n * association: 'posts',\n * sourceAlias: 'user', // 内嵌时,需要指定 source 别名\n * })\n * ]\n * }\n */\n sourceAlias?: string;\n\n where?: any;\n\n /**\n * 别名,默认为 association_count\n */\n alias?: string;\n\n [key: string]: any;\n}\n\nexport const DEFAULT_OFFSET = 0;\nexport const DEFAULT_LIMIT = 100;\nexport const MAX_LIMIT = 500;\n\nexport interface UpdateAssociationOptions extends SaveOptions {\n context?: any;\n}\n\n/**\n * Model 相关\n *\n * TODO: 自定义 model 时的提示问题\n */\n// @ts-ignore\nexport abstract class Model extends SequelizeModel {\n /**\n * 防止 ts 报错提示\n */\n [key: string]: any;\n\n /**\n * 当前 Model 的 database\n *\n * 与 Model.sequelize 对应,database 也用了 public static readonly\n */\n public static database: Database;\n\n /**\n * 供 model 实例访问的 database\n */\n get database(): Database {\n // @ts-ignore\n return this.constructor.database;\n }\n\n /**\n * sub query 关联数据的数量\n *\n * TODO: 关联字段暂不支持主键以外的字段\n *\n * @param options\n */\n static withCountAttribute(\n options?: string | WithCountAttributeOptions,\n ): string | ProjectionAlias {\n if (typeof options === 'string') {\n options = { association: options };\n }\n\n const {\n sourceAlias,\n association,\n where = {},\n alias,\n ...restOptions\n } = options;\n const associator = this.associations[association];\n const table = this.database.getTable(this.name);\n const field = table.getField(association);\n const { targetKey, otherKey, foreignKey, sourceKey } = field.options as any;\n\n if (associator.associationType === 'HasMany') {\n where[foreignKey as string] = {\n [Op.eq]: Sequelize.col(`${sourceAlias || this.name}.${sourceKey}`),\n };\n } else if (associator.associationType === 'BelongsToMany') {\n where[targetKey] = {\n [Op.in]: Sequelize.literal(\n `(${(associator as any).through.model.selectQuery({\n attributes: [otherKey],\n where: {\n [foreignKey]: {\n [Op.eq]: Sequelize.col(\n `${sourceAlias || this.name}.${sourceKey}`,\n ),\n },\n // @ts-ignore\n ...(associator.through.scope || {}),\n },\n })})`,\n ),\n };\n }\n\n let countLiteral = 'count(*)';\n\n if (this.database.sequelize.getDialect() === 'postgres') {\n countLiteral = 'cast(count(*) as integer)';\n }\n\n const attribute = [\n Sequelize.literal(\n // @ts-ignore\n `(${associator.target.selectQuery({\n ...restOptions,\n attributes: [[Sequelize.literal(countLiteral), 'count']],\n where: {\n // @ts-ignore\n ...where,\n ...((associator as any).scope || {}),\n },\n })})`,\n ),\n alias ||\n Utils.underscoredIf(`${association}Count`, this.options.underscored),\n ].filter(Boolean);\n\n return (attribute as unknown) as ProjectionAlias;\n }\n\n /**\n * 当前 Model 的 SQL\n *\n * @param options\n */\n static selectQuery(options = {}): string {\n // @ts-ignore\n return this.queryGenerator\n .selectQuery(this.getTableName(), options, this)\n .replace(/;$/, '');\n }\n\n static parseApiJson(options: ApiJsonOptions) {\n const { fields, filter, sort, context, page, perPage } = options;\n const data = toInclude(\n { fields, filter, sort },\n {\n model: this,\n associations: this.associations,\n dialect: this.sequelize.getDialect(),\n ctx: context,\n database: this.database,\n },\n );\n if (page || perPage) {\n data.limit =\n perPage === -1\n ? MAX_LIMIT\n : Math.min(perPage || DEFAULT_LIMIT, MAX_LIMIT);\n data.offset = data.limit * (page > 0 ? page - 1 : DEFAULT_OFFSET);\n }\n if (data.attributes && data.attributes.length === 0) {\n delete data.attributes;\n }\n return data;\n }\n\n getValuesByFieldNames(scope = []) {\n const table = this.database.getTable(this.constructor.name);\n const Model = table.getModel();\n const associations = table.getAssociations();\n const where = {};\n scope.forEach((col) => {\n const association = associations.get(col);\n const dataKey =\n association && association instanceof BELONGSTO\n ? association.options.foreignKey\n : col;\n if (!Model.rawAttributes[dataKey]) {\n return;\n }\n const value = this.getDataValue(dataKey);\n if (typeof value !== 'undefined') {\n where[dataKey] = value;\n }\n });\n return where;\n }\n\n async updateSingleAssociation(\n key: string,\n data: any,\n options: UpdateAssociationOptions = {},\n ) {\n const {\n fields,\n transaction = await this.sequelize.transaction(),\n ...opts\n } = options;\n Object.assign(opts, { transaction });\n\n const table = this.database.getTable(this.constructor.name);\n const association = table.getAssociations().get(key);\n const accessors = association.getAccessors();\n\n if (data == null) {\n await this[accessors.set](null, opts);\n return;\n }\n\n if (\n typeof data === 'number' ||\n typeof data === 'string' ||\n data instanceof SequelizeModel\n ) {\n await this[accessors.set](data, opts);\n } else if (typeof data === 'object') {\n const Target = association.getTargetModel();\n const targetAttribute =\n association instanceof BELONGSTO\n ? association.options.targetKey\n : association.options.sourceKey;\n if (data[targetAttribute]) {\n if (Object.keys(data).length > 0) {\n const target = await Target.findOne({\n where: {\n [targetAttribute]: data[targetAttribute],\n },\n transaction,\n });\n if (target) {\n await this[accessors.set](data[targetAttribute], opts);\n await target.update(data, opts);\n // @ts-ignore\n await target.updateAssociations(data, opts);\n } else {\n const t = await this[accessors.create](data, opts);\n await t.updateAssociations(data, opts);\n }\n }\n } else {\n const t = await this[accessors.create](data, opts);\n await t.updateAssociations(data, opts);\n }\n }\n if (!options.transaction) {\n await transaction.commit();\n }\n }\n\n async updateMultipleAssociation(\n associationName: string,\n data: any,\n options: UpdateAssociationOptions = {},\n ) {\n const items = Array.isArray(data) ? data : data == null ? [] : [data];\n\n const {\n fields,\n transaction = await this.sequelize.transaction(),\n ...opts\n } = options;\n Object.assign(opts, { transaction });\n\n const table = this.database.getTable(this.constructor.name);\n const association = table.getAssociations().get(associationName);\n const accessors = association.getAccessors();\n\n if (!items.length) {\n await this[accessors.set](null, opts);\n return;\n }\n\n const Target = association.getTargetModel();\n // 当前表关联 target 表的外键(大部分情况与 target 表主键相同,但可以设置为不同的,要考虑)\n const { targetKey = Target.primaryKeyAttribute } = association.options;\n // target 表的主键\n const targetPk = Target.primaryKeyAttribute;\n const targetKeyIsPk = targetKey === targetPk;\n // 准备设置的关联主键\n const toSetPks = new Set();\n const toSetUks = new Set();\n // 筛选后准备设置的关联主键\n const toSetItems = new Set();\n // 准备添加的关联对象\n const toUpsertObjects = [];\n\n // 遍历所有值成员准备数据\n items.forEach((item) => {\n if (item instanceof SequelizeModel) {\n if (targetKeyIsPk) {\n toSetPks.add(item.getDataValue(targetPk));\n } else {\n toSetUks.add(item.getDataValue(targetKey));\n }\n return;\n }\n if (typeof item === 'number' || typeof item === 'string') {\n let targetKeyType = getDataTypeKey(\n Target.rawAttributes[targetKey].type,\n ).toLocaleLowerCase();\n if (targetKeyType === 'integer') {\n targetKeyType = 'number';\n }\n // 如果传值类型与之前在 Model 上定义的 targetKey 不同,则报错。\n // 不应兼容定义的 targetKey 不是 primaryKey 却传了 primaryKey 的值的情况。\n if (typeof item !== targetKeyType) {\n throw new Error(\n `target key type [${typeof item}] does not match to [${targetKeyType}]`,\n );\n }\n if (targetKeyIsPk) {\n toSetPks.add(item);\n } else {\n toSetUks.add(item);\n }\n return;\n }\n if (typeof item === 'object') {\n toUpsertObjects.push(item);\n }\n });\n\n /* 仅传关联键处理开始 */\n // 查找已存在的数据\n const byPkExistItems = toSetPks.size\n ? await Target.findAll({\n ...opts,\n // @ts-ignore\n where: {\n [targetPk]: {\n [Op.in]: Array.from(toSetPks),\n },\n },\n attributes: [targetPk],\n })\n : [];\n byPkExistItems.forEach((item) => {\n toSetItems.add(item);\n });\n\n const byUkExistItems = toSetUks.size\n ? await Target.findAll({\n ...opts,\n // @ts-ignore\n where: {\n [targetKey]: {\n [Op.in]: Array.from(toSetUks),\n },\n },\n attributes: [targetPk, targetKey],\n })\n : [];\n byUkExistItems.forEach((item) => {\n toSetItems.add(item);\n });\n /* 仅传关联键处理结束 */\n\n const belongsToManyList = [];\n /* 值为对象处理开始 */\n for (const item of toUpsertObjects) {\n let target;\n if (typeof item[targetKey] === 'undefined') {\n target = await this[accessors.create](item, opts);\n } else {\n target = await Target.findOne({\n ...opts,\n where: { [targetKey]: item[targetKey] },\n });\n if (!target) {\n target = await this[accessors.create](item, opts);\n } else {\n await target.update(item, opts);\n }\n }\n // TODO(optimize): 此处添加的对象其实已经创建了关联,\n // 但考虑到单条 create 的 hook 要求带上关联键,且后面的 set,\n // 所以仍然交给 set 再调用关联一次。\n toSetItems.add(target);\n\n if (association instanceof BELONGSTOMANY) {\n belongsToManyList.push({\n item,\n target,\n });\n }\n\n await target.updateAssociations(item, opts);\n }\n /* 值为对象处理结束 */\n\n // 添加所有计算后的关联\n await this[accessors.set](Array.from(toSetItems), opts);\n\n // 后处理 belongsToMany 的更新内容\n if (belongsToManyList.length) {\n const ThroughModel = (association as BELONGSTOMANY).getThroughModel();\n const throughName = (association as BELONGSTOMANY).getThroughName();\n\n for (const { item, target } of belongsToManyList) {\n const throughValues = item[throughName];\n if (throughValues && typeof throughValues === 'object') {\n const { foreignKey, sourceKey, otherKey } = association.options;\n const through = await ThroughModel.findOne({\n where: {\n [foreignKey]: this.get(sourceKey),\n [otherKey]: target.get(targetKey),\n },\n transaction,\n });\n await through.update(throughValues, opts);\n // TODO:有 BUG,未知\n // await through.updateAssociations(throughValues, opts);\n }\n }\n }\n\n if (!options.transaction) {\n await transaction.commit();\n }\n }\n\n async updateAssociation(\n key: string,\n data: any,\n options: UpdateAssociationOptions = {},\n ) {\n const table = this.database.getTable(this.constructor.name);\n const association = table.getAssociations().get(key);\n switch (true) {\n case association instanceof BELONGSTO:\n case association instanceof HASONE:\n return this.updateSingleAssociation(key, data, options);\n case association instanceof HASMANY:\n case association instanceof BELONGSTOMANY:\n return this.updateMultipleAssociation(key, data, options);\n }\n }\n\n /**\n * 关联数据的更新\n *\n * @param data\n */\n async updateAssociations(data: any, options: UpdateAssociationOptions = {}) {\n const { transaction = await this.sequelize.transaction() } = options;\n // @ts-ignore 判断 Model.associations 更准确\n for (const key of Object.keys(this.constructor.associations)) {\n // 如果 key 不存在才跳过\n if (!Object.keys(data).includes(key)) {\n continue;\n }\n await this.updateAssociation(key, data[key], {\n ...options,\n transaction,\n });\n }\n\n await this.database.emitAsync('afterUpdateAssociations', this, {\n ...options,\n transaction,\n });\n\n if (!options.transaction) {\n await transaction.commit();\n }\n }\n}\n\n/**\n * ModelCtor 需要为当前 Model 的\n */\nexport type ModelCtor<M extends Model> = typeof Model & { new (): M } & {\n [key: string]: any;\n};\n\nexport default Model;\n"]}
package/lib/op.d.ts DELETED
@@ -1,45 +0,0 @@
1
- import { Op } from 'sequelize';
2
- export default class Operator {
3
- static get(key: string): Function | {
4
- readonly adjacent: typeof Op.adjacent;
5
- readonly all: typeof Op.all;
6
- readonly and: typeof Op.and;
7
- readonly any: typeof Op.any;
8
- readonly between: typeof Op.between;
9
- readonly col: typeof Op.col;
10
- readonly contained: typeof Op.contained;
11
- readonly contains: typeof Op.contains;
12
- readonly endsWith: typeof Op.endsWith;
13
- readonly eq: typeof Op.eq;
14
- readonly gt: typeof Op.gt;
15
- readonly gte: typeof Op.gte;
16
- readonly iLike: typeof Op.iLike;
17
- readonly in: typeof Op.in;
18
- readonly iRegexp: typeof Op.iRegexp;
19
- readonly is: typeof Op.is;
20
- readonly like: typeof Op.like;
21
- readonly lt: typeof Op.lt;
22
- readonly lte: typeof Op.lte;
23
- readonly ne: typeof Op.ne;
24
- readonly noExtendLeft: typeof Op.noExtendLeft;
25
- readonly noExtendRight: typeof Op.noExtendRight;
26
- readonly not: typeof Op.not;
27
- readonly notBetween: typeof Op.notBetween;
28
- readonly notILike: typeof Op.notILike;
29
- readonly notIn: typeof Op.notIn;
30
- readonly notIRegexp: typeof Op.notIRegexp;
31
- readonly notLike: typeof Op.notLike;
32
- readonly notRegexp: typeof Op.notRegexp;
33
- readonly or: typeof Op.or;
34
- readonly overlap: typeof Op.overlap;
35
- readonly placeholder: typeof Op.placeholder;
36
- readonly regexp: typeof Op.regexp;
37
- readonly startsWith: typeof Op.startsWith;
38
- readonly strictLeft: typeof Op.strictLeft;
39
- readonly strictRight: typeof Op.strictRight;
40
- readonly substring: typeof Op.substring;
41
- readonly values: typeof Op.values;
42
- };
43
- static has(key: string): boolean;
44
- static register(key: string, fn: Function): void;
45
- }
package/lib/op.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["op.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAoB,MAAM,WAAW,CAAC;AAuLjD,MAAM,CAAC,OAAO,OAAO,QAAQ;WACb,GAAG,CAAC,GAAG,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAIf,GAAG,CAAC,GAAG,EAAE,MAAM;WAIf,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ;CAGjD","file":"op.d.ts","sourcesContent":["import { Op, Utils, Sequelize } from 'sequelize';\nimport moment, { MomentInput } from 'moment';\n\nfunction toArray(value: any): any[] {\n if (value == null) {\n return [];\n }\n return Array.isArray(value) ? value : [value];\n}\n\nfunction stringToDate(value: string): Date {\n return moment(value).toDate();\n}\n\nfunction getNextDay(value: MomentInput): Date {\n return moment(value).add(1, 'd').toDate();\n}\n\nconst op = new Map<string, typeof Op | Function>();\n\n// Sequelize 内置\nfor (const key in Op) {\n op.set(key, Op[key]);\n const val = Utils.underscoredIf(key, true);\n op.set(val, Op[key]);\n op.set(val.replace(/_/g, ''), Op[key]);\n}\n\n// 通用\n\n// 是否为空:数据库意义的 null\nop.set('$null', (value, { fieldPath, database }) => {\n // const field = database.getFieldByPath(fieldPath);\n // console.log({field});\n return { [Op.is]: null };\n});\nop.set('$notNull', () => ({ [Op.not]: null }));\n\nop.set('$isTruly', () => ({\n [Op.eq]: true,\n}));\nop.set('$isFalsy', () => ({\n [Op.or]: [\n {\n [Op.eq]: false,\n },\n {\n [Op.is]: null,\n },\n ],\n}));\n\n// 字符串\n\n// 包含:指对应字段的值包含某个子串\nop.set('$includes', (value: string, { dialect }) => ({\n [dialect === 'postgres' ? Op.iLike : Op.like]: `%${value}%`,\n}));\n// 不包含:指对应字段的值不包含某个子串(慎用:性能问题)\nop.set('$notIncludes', (value: string, { dialect }) => ({\n [dialect === 'postgres' ? Op.notILike : Op.notLike]: `%${value}%`,\n}));\n// 以之起始\nop.set('$startsWith', (value: string, { dialect }) => ({\n [dialect === 'postgres' ? Op.iLike : Op.like]: `${value}%`,\n}));\n// 不以之起始\nop.set('$notStartsWith', (value: string, { dialect }) => ({\n [dialect === 'postgres' ? Op.notILike : Op.notLike]: `${value}%`,\n}));\n// 以之结束\nop.set('$endsWith', (value: string, { dialect }) => ({\n [dialect === 'postgres' ? Op.iLike : Op.like]: `%${value}`,\n}));\n// 不以之结束\nop.set('$notEndsWith', (value: string, { dialect }) => ({\n [dialect === 'postgres' ? Op.notILike : Op.notLike]: `%${value}`,\n}));\n\n// 仅日期\n\n// 在某日\nop.set('$dateOn', (value: string) => ({\n [Op.and]: [{ [Op.gte]: stringToDate(value) }, { [Op.lt]: getNextDay(value) }],\n}));\n// 不在某日\nop.set('$dateNotOn', (value: string) => ({\n [Op.or]: [{ [Op.lt]: stringToDate(value) }, { [Op.gte]: getNextDay(value) }],\n}));\n// 某日前\nop.set('$dateBefore', (value: string) => ({ [Op.lt]: stringToDate(value) }));\n// 某日后\nop.set('$dateAfter', (value: string) => ({ [Op.gte]: getNextDay(value) }));\n// 不早于(含当天)\nop.set('$dateNotBefore', (value: string) => ({\n [Op.gte]: stringToDate(value),\n}));\n// 不晚于(含当天)\nop.set('$dateNotAfter', (value: string) => ({ [Op.lt]: getNextDay(value) }));\n// 在期间\nop.set('$dateBetween', ([from, to]: string[]) => ({\n [Op.and]: [{ [Op.gte]: stringToDate(from) }, { [Op.lt]: getNextDay(to) }],\n}));\n// 不在期间\nop.set('$dateNotBetween', ([from, to]: string[]) => ({\n [Op.or]: [{ [Op.lt]: stringToDate(from) }, { [Op.gte]: getNextDay(to) }],\n}));\n\n// 多选(JSON)类型\n\n// 包含组中任意值(命名来源:`Array.prototype.some`)\nop.set('$anyOf', (values: any[], options) => {\n if (!values) {\n return Sequelize.literal('');\n }\n values = Array.isArray(values) ? values : [values];\n if (values.length === 0) {\n return Sequelize.literal('');\n }\n const { field, fieldPath } = options;\n const column = fieldPath\n .split('.')\n .map((name) => `\"${name}\"`)\n .join('.');\n const sql = values\n .map((value) => `(${column})::jsonb @> '${JSON.stringify(value)}'`)\n .join(' OR ');\n return Sequelize.literal(sql);\n});\n// 包含组中所有值\nop.set('$allOf', (values: any) => ({ [Op.contains]: toArray(values) }));\n// TODO(bug): 不包含组中任意值\nop.set('$noneOf', (values: any[], options) => {\n if (!values) {\n return Sequelize.literal('');\n }\n values = Array.isArray(values) ? values : [values];\n if (values.length === 0) {\n return Sequelize.literal('');\n }\n const { field, fieldPath } = options;\n const column = fieldPath\n .split('.')\n .map((name) => `\"${name}\"`)\n .join('.');\n const sql = values\n .map((value) => `(${column})::jsonb @> '${JSON.stringify(value)}'`)\n .join(' OR ');\n return Sequelize.literal(`not (${sql})`);\n});\n// 与组中值匹配\nop.set('$match', (values: any[], options) => {\n const array = toArray(values);\n if (values.length === 0) {\n return Sequelize.literal('');\n }\n const { field, fieldPath } = options;\n const column = fieldPath\n .split('.')\n .map((name) => `\"${name}\"`)\n .join('.');\n const sql = `(${column})::jsonb @> '${JSON.stringify(\n array,\n )}' AND (${column})::jsonb <@ '${JSON.stringify(array)}'`;\n return Sequelize.literal(sql);\n});\nop.set('$notMatch', (values: any[], options) => {\n const array = toArray(values);\n if (values.length === 0) {\n return Sequelize.literal('');\n }\n const { field, fieldPath } = options;\n const column = fieldPath\n .split('.')\n .map((name) => `\"${name}\"`)\n .join('.');\n const sql = `(${column})::jsonb @> '${JSON.stringify(\n array,\n )}' AND (${column})::jsonb <@ '${JSON.stringify(array)}'`;\n return Sequelize.literal(`not (${sql})`);\n // return Sequelize.literal(`(not (${sql})) AND ${column} IS NULL`);\n});\n\nexport default class Operator {\n public static get(key: string) {\n return op.get(key);\n }\n\n public static has(key: string) {\n return op.has(key);\n }\n\n public static register(key: string, fn: Function) {\n op.set(key, fn);\n }\n}\n"]}
package/lib/op.js DELETED
@@ -1,225 +0,0 @@
1
- "use strict";
2
-
3
- function _react() {
4
- const data = _interopRequireDefault(require("react"));
5
-
6
- _react = function _react() {
7
- return data;
8
- };
9
-
10
- return data;
11
- }
12
-
13
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
14
-
15
- var __importDefault = void 0 && (void 0).__importDefault || function (mod) {
16
- return mod && mod.__esModule ? mod : {
17
- "default": mod
18
- };
19
- };
20
-
21
- Object.defineProperty(exports, "__esModule", {
22
- value: true
23
- });
24
-
25
- const sequelize_1 = require("sequelize");
26
-
27
- const moment_1 = __importDefault(require("moment"));
28
-
29
- function toArray(value) {
30
- if (value == null) {
31
- return [];
32
- }
33
-
34
- return Array.isArray(value) ? value : [value];
35
- }
36
-
37
- function stringToDate(value) {
38
- return (0, moment_1.default)(value).toDate();
39
- }
40
-
41
- function getNextDay(value) {
42
- return (0, moment_1.default)(value).add(1, 'd').toDate();
43
- }
44
-
45
- const op = new Map();
46
-
47
- for (const key in sequelize_1.Op) {
48
- op.set(key, sequelize_1.Op[key]);
49
- const val = sequelize_1.Utils.underscoredIf(key, true);
50
- op.set(val, sequelize_1.Op[key]);
51
- op.set(val.replace(/_/g, ''), sequelize_1.Op[key]);
52
- }
53
-
54
- op.set('$null', (value, {
55
- fieldPath,
56
- database
57
- }) => {
58
- return {
59
- [sequelize_1.Op.is]: null
60
- };
61
- });
62
- op.set('$notNull', () => ({
63
- [sequelize_1.Op.not]: null
64
- }));
65
- op.set('$isTruly', () => ({
66
- [sequelize_1.Op.eq]: true
67
- }));
68
- op.set('$isFalsy', () => ({
69
- [sequelize_1.Op.or]: [{
70
- [sequelize_1.Op.eq]: false
71
- }, {
72
- [sequelize_1.Op.is]: null
73
- }]
74
- }));
75
- op.set('$includes', (value, {
76
- dialect
77
- }) => ({
78
- [dialect === 'postgres' ? sequelize_1.Op.iLike : sequelize_1.Op.like]: `%${value}%`
79
- }));
80
- op.set('$notIncludes', (value, {
81
- dialect
82
- }) => ({
83
- [dialect === 'postgres' ? sequelize_1.Op.notILike : sequelize_1.Op.notLike]: `%${value}%`
84
- }));
85
- op.set('$startsWith', (value, {
86
- dialect
87
- }) => ({
88
- [dialect === 'postgres' ? sequelize_1.Op.iLike : sequelize_1.Op.like]: `${value}%`
89
- }));
90
- op.set('$notStartsWith', (value, {
91
- dialect
92
- }) => ({
93
- [dialect === 'postgres' ? sequelize_1.Op.notILike : sequelize_1.Op.notLike]: `${value}%`
94
- }));
95
- op.set('$endsWith', (value, {
96
- dialect
97
- }) => ({
98
- [dialect === 'postgres' ? sequelize_1.Op.iLike : sequelize_1.Op.like]: `%${value}`
99
- }));
100
- op.set('$notEndsWith', (value, {
101
- dialect
102
- }) => ({
103
- [dialect === 'postgres' ? sequelize_1.Op.notILike : sequelize_1.Op.notLike]: `%${value}`
104
- }));
105
- op.set('$dateOn', value => ({
106
- [sequelize_1.Op.and]: [{
107
- [sequelize_1.Op.gte]: stringToDate(value)
108
- }, {
109
- [sequelize_1.Op.lt]: getNextDay(value)
110
- }]
111
- }));
112
- op.set('$dateNotOn', value => ({
113
- [sequelize_1.Op.or]: [{
114
- [sequelize_1.Op.lt]: stringToDate(value)
115
- }, {
116
- [sequelize_1.Op.gte]: getNextDay(value)
117
- }]
118
- }));
119
- op.set('$dateBefore', value => ({
120
- [sequelize_1.Op.lt]: stringToDate(value)
121
- }));
122
- op.set('$dateAfter', value => ({
123
- [sequelize_1.Op.gte]: getNextDay(value)
124
- }));
125
- op.set('$dateNotBefore', value => ({
126
- [sequelize_1.Op.gte]: stringToDate(value)
127
- }));
128
- op.set('$dateNotAfter', value => ({
129
- [sequelize_1.Op.lt]: getNextDay(value)
130
- }));
131
- op.set('$dateBetween', ([from, to]) => ({
132
- [sequelize_1.Op.and]: [{
133
- [sequelize_1.Op.gte]: stringToDate(from)
134
- }, {
135
- [sequelize_1.Op.lt]: getNextDay(to)
136
- }]
137
- }));
138
- op.set('$dateNotBetween', ([from, to]) => ({
139
- [sequelize_1.Op.or]: [{
140
- [sequelize_1.Op.lt]: stringToDate(from)
141
- }, {
142
- [sequelize_1.Op.gte]: getNextDay(to)
143
- }]
144
- }));
145
- op.set('$anyOf', (values, options) => {
146
- if (!values) {
147
- return sequelize_1.Sequelize.literal('');
148
- }
149
-
150
- values = Array.isArray(values) ? values : [values];
151
-
152
- if (values.length === 0) {
153
- return sequelize_1.Sequelize.literal('');
154
- }
155
-
156
- const field = options.field,
157
- fieldPath = options.fieldPath;
158
- const column = fieldPath.split('.').map(name => `"${name}"`).join('.');
159
- const sql = values.map(value => `(${column})::jsonb @> '${JSON.stringify(value)}'`).join(' OR ');
160
- return sequelize_1.Sequelize.literal(sql);
161
- });
162
- op.set('$allOf', values => ({
163
- [sequelize_1.Op.contains]: toArray(values)
164
- }));
165
- op.set('$noneOf', (values, options) => {
166
- if (!values) {
167
- return sequelize_1.Sequelize.literal('');
168
- }
169
-
170
- values = Array.isArray(values) ? values : [values];
171
-
172
- if (values.length === 0) {
173
- return sequelize_1.Sequelize.literal('');
174
- }
175
-
176
- const field = options.field,
177
- fieldPath = options.fieldPath;
178
- const column = fieldPath.split('.').map(name => `"${name}"`).join('.');
179
- const sql = values.map(value => `(${column})::jsonb @> '${JSON.stringify(value)}'`).join(' OR ');
180
- return sequelize_1.Sequelize.literal(`not (${sql})`);
181
- });
182
- op.set('$match', (values, options) => {
183
- const array = toArray(values);
184
-
185
- if (values.length === 0) {
186
- return sequelize_1.Sequelize.literal('');
187
- }
188
-
189
- const field = options.field,
190
- fieldPath = options.fieldPath;
191
- const column = fieldPath.split('.').map(name => `"${name}"`).join('.');
192
- const sql = `(${column})::jsonb @> '${JSON.stringify(array)}' AND (${column})::jsonb <@ '${JSON.stringify(array)}'`;
193
- return sequelize_1.Sequelize.literal(sql);
194
- });
195
- op.set('$notMatch', (values, options) => {
196
- const array = toArray(values);
197
-
198
- if (values.length === 0) {
199
- return sequelize_1.Sequelize.literal('');
200
- }
201
-
202
- const field = options.field,
203
- fieldPath = options.fieldPath;
204
- const column = fieldPath.split('.').map(name => `"${name}"`).join('.');
205
- const sql = `(${column})::jsonb @> '${JSON.stringify(array)}' AND (${column})::jsonb <@ '${JSON.stringify(array)}'`;
206
- return sequelize_1.Sequelize.literal(`not (${sql})`);
207
- });
208
-
209
- class Operator {
210
- static get(key) {
211
- return op.get(key);
212
- }
213
-
214
- static has(key) {
215
- return op.has(key);
216
- }
217
-
218
- static register(key, fn) {
219
- op.set(key, fn);
220
- }
221
-
222
- }
223
-
224
- exports.default = Operator;
225
- //# sourceMappingURL=op.js.map