@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
@@ -0,0 +1,185 @@
1
+ import { flatten, unflatten } from 'flat';
2
+ import { default as lodash, default as _ } from 'lodash';
3
+ const debug = require('debug')('noco-database');
4
+ export default class FilterParser {
5
+ constructor(filter, context) {
6
+ const { collection } = context;
7
+ this.collection = collection;
8
+ this.context = context;
9
+ this.model = collection.model;
10
+ this.filter = this.prepareFilter(filter);
11
+ this.database = collection.context.database;
12
+ }
13
+ prepareFilter(filter) {
14
+ if (lodash.isPlainObject(filter)) {
15
+ const renamedKey = {};
16
+ for (const key of Object.keys(filter)) {
17
+ if (key.endsWith('.$exists') || key.endsWith('.$notExists')) {
18
+ const keyArr = key.split('.');
19
+ if (keyArr[keyArr.length - 2] == 'id') {
20
+ continue;
21
+ }
22
+ keyArr.splice(keyArr.length - 1, 0, 'id');
23
+ renamedKey[key] = keyArr.join('.');
24
+ }
25
+ }
26
+ for (const [oldKey, newKey] of Object.entries(renamedKey)) {
27
+ // @ts-ignore
28
+ filter[newKey] = filter[oldKey];
29
+ delete filter[oldKey];
30
+ }
31
+ }
32
+ return filter;
33
+ }
34
+ toSequelizeParams() {
35
+ debug('filter %o', this.filter);
36
+ if (!this.filter) {
37
+ return {};
38
+ }
39
+ const filter = this.filter;
40
+ const model = this.model;
41
+ // supported operators
42
+ const operators = this.database.operators;
43
+ const originalFiler = lodash.cloneDeep(filter || {});
44
+ const flattenedFilter = flatten(filter || {});
45
+ debug('flattened filter %o', flattenedFilter);
46
+ const include = {};
47
+ const where = {};
48
+ const filter2 = lodash.cloneDeep(flattenedFilter);
49
+ let skipPrefix = null;
50
+ const associations = model.associations;
51
+ debug('associations %O', associations);
52
+ for (let [key, value] of Object.entries(flattenedFilter)) {
53
+ // 处理 filter 条件
54
+ if (skipPrefix && key.startsWith(skipPrefix)) {
55
+ continue;
56
+ }
57
+ debug('handle filter key "%s: "%s"', key, value);
58
+ let keys = key.split('.');
59
+ // paths ?
60
+ const paths = [];
61
+ // origins ?
62
+ const origins = [];
63
+ while (keys.length) {
64
+ debug('keys: %o, paths: %o, origins: %o', keys, paths, origins);
65
+ // move key from keys to origins
66
+ const firstKey = keys.shift();
67
+ origins.push(firstKey);
68
+ debug('origins: %o', origins);
69
+ if (firstKey.startsWith('$')) {
70
+ if (operators.has(firstKey)) {
71
+ debug('%s is operator', firstKey);
72
+ // if firstKey is operator
73
+ const opKey = operators.get(firstKey);
74
+ debug('operator key %s, operator: %o', firstKey, opKey);
75
+ // 默认操作符
76
+ if (typeof opKey === 'symbol') {
77
+ paths.push(opKey);
78
+ continue;
79
+ }
80
+ else if (typeof opKey === 'function') {
81
+ skipPrefix = origins.join('.');
82
+ const queryValue = lodash.get(unflatten(originalFiler), skipPrefix);
83
+ value = opKey(queryValue, {
84
+ app: this.context.app,
85
+ db: this.database,
86
+ path: skipPrefix,
87
+ fieldName: this.getFieldNameFromQueryPath(skipPrefix),
88
+ model: this.model,
89
+ });
90
+ break;
91
+ }
92
+ }
93
+ else {
94
+ paths.push(firstKey);
95
+ continue;
96
+ }
97
+ }
98
+ // firstKey is number
99
+ if (!lodash.isNaN(parseInt(firstKey))) {
100
+ paths.push(firstKey);
101
+ continue;
102
+ }
103
+ // firstKey is not association
104
+ if (!associations[firstKey]) {
105
+ paths.push(firstKey);
106
+ continue;
107
+ }
108
+ const associationKeys = [];
109
+ associationKeys.push(firstKey);
110
+ debug('associationKeys %o', associationKeys);
111
+ // set sequelize include option
112
+ _.set(include, firstKey, {
113
+ association: firstKey,
114
+ attributes: [], // out put empty fields by default
115
+ });
116
+ // association target model
117
+ let target = associations[firstKey].target;
118
+ debug('association target %o', target);
119
+ while (target) {
120
+ const attr = keys.shift();
121
+ origins.push(attr);
122
+ // if it is target model attribute
123
+ if (target.rawAttributes[attr]) {
124
+ associationKeys.push(attr);
125
+ target = null;
126
+ }
127
+ else if (target.associations[attr]) {
128
+ // if it is target model association (nested association filter)
129
+ associationKeys.push(attr);
130
+ const assoc = [];
131
+ associationKeys.forEach((associationKey, index) => {
132
+ if (index > 0) {
133
+ assoc.push('include');
134
+ }
135
+ assoc.push(associationKey);
136
+ });
137
+ _.set(include, assoc, {
138
+ association: attr,
139
+ attributes: [],
140
+ });
141
+ target = target.associations[attr].target;
142
+ }
143
+ else {
144
+ throw new Error(`${attr} neither ${firstKey}'s association nor ${firstKey}'s attribute`);
145
+ }
146
+ }
147
+ debug('associationKeys %o', associationKeys);
148
+ if (associationKeys.length > 1) {
149
+ paths.push(`$${associationKeys.join('.')}$`);
150
+ }
151
+ else {
152
+ paths.push(firstKey);
153
+ }
154
+ }
155
+ debug('where %o, paths %o, value, %o', where, paths, value);
156
+ const values = _.get(where, paths);
157
+ if (values && typeof values === 'object' && value && typeof value === 'object') {
158
+ value = Object.assign(Object.assign({}, value), values);
159
+ }
160
+ _.set(where, paths, value);
161
+ }
162
+ const toInclude = (items) => {
163
+ return Object.values(items).map((item) => {
164
+ if (item.include) {
165
+ item.include = toInclude(item.include);
166
+ }
167
+ return item;
168
+ });
169
+ };
170
+ debug('where %o, include %o', where, include);
171
+ return { where, include: toInclude(include) };
172
+ }
173
+ getFieldNameFromQueryPath(queryPath) {
174
+ const paths = queryPath.split('.');
175
+ let fieldName;
176
+ for (const path of paths) {
177
+ if (path.startsWith('$') || !lodash.isNaN(parseInt(path))) {
178
+ continue;
179
+ }
180
+ fieldName = path;
181
+ }
182
+ return fieldName;
183
+ }
184
+ }
185
+ //# sourceMappingURL=filter-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-parser.js","sourceRoot":"","sources":["../src/filter-parser.ts"],"names":[],"mappings":"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","sourcesContent":["import { flatten, unflatten } from 'flat';\nimport { default as lodash, default as _ } from 'lodash';\nimport { ModelCtor } from 'sequelize';\nimport { Collection } from './collection';\nimport { Database } from './database';\nimport { Model } from './model';\n\nconst debug = require('debug')('noco-database');\n\ntype FilterType = any;\n\ninterface FilterParserContext {\n collection: Collection;\n app?: any;\n}\n\nexport default class FilterParser {\n collection: Collection;\n database: Database;\n model: ModelCtor<Model>;\n filter: FilterType;\n context: FilterParserContext;\n\n constructor(filter: FilterType, context: FilterParserContext) {\n const { collection } = context;\n this.collection = collection;\n this.context = context;\n this.model = collection.model;\n this.filter = this.prepareFilter(filter);\n this.database = collection.context.database;\n }\n\n prepareFilter(filter: FilterType) {\n if (lodash.isPlainObject(filter)) {\n const renamedKey = {};\n\n for (const key of Object.keys(filter)) {\n if (key.endsWith('.$exists') || key.endsWith('.$notExists')) {\n const keyArr = key.split('.');\n if (keyArr[keyArr.length - 2] == 'id') {\n continue;\n }\n\n keyArr.splice(keyArr.length - 1, 0, 'id');\n renamedKey[key] = keyArr.join('.');\n }\n }\n\n for (const [oldKey, newKey] of Object.entries(renamedKey)) {\n // @ts-ignore\n filter[newKey] = filter[oldKey];\n delete filter[oldKey];\n }\n }\n\n return filter;\n }\n\n toSequelizeParams() {\n debug('filter %o', this.filter);\n\n if (!this.filter) {\n return {};\n }\n\n const filter = this.filter;\n\n const model = this.model;\n\n // supported operators\n const operators = this.database.operators;\n\n const originalFiler = lodash.cloneDeep(filter || {});\n\n const flattenedFilter = flatten(filter || {});\n\n debug('flattened filter %o', flattenedFilter);\n\n const include = {};\n const where = {};\n const filter2 = lodash.cloneDeep(flattenedFilter);\n\n let skipPrefix = null;\n const associations = model.associations;\n\n debug('associations %O', associations);\n\n for (let [key, value] of Object.entries(flattenedFilter)) {\n // 处理 filter 条件\n if (skipPrefix && key.startsWith(skipPrefix)) {\n continue;\n }\n\n debug('handle filter key \"%s: \"%s\"', key, value);\n let keys = key.split('.');\n\n // paths ?\n const paths = [];\n\n // origins ?\n const origins = [];\n\n while (keys.length) {\n debug('keys: %o, paths: %o, origins: %o', keys, paths, origins);\n\n // move key from keys to origins\n const firstKey = keys.shift();\n origins.push(firstKey);\n\n debug('origins: %o', origins);\n\n if (firstKey.startsWith('$')) {\n if (operators.has(firstKey)) {\n debug('%s is operator', firstKey);\n // if firstKey is operator\n const opKey = operators.get(firstKey);\n debug('operator key %s, operator: %o', firstKey, opKey);\n\n // 默认操作符\n if (typeof opKey === 'symbol') {\n paths.push(opKey);\n continue;\n } else if (typeof opKey === 'function') {\n skipPrefix = origins.join('.');\n\n const queryValue = lodash.get(unflatten(originalFiler), skipPrefix);\n\n value = opKey(queryValue, {\n app: this.context.app,\n db: this.database,\n path: skipPrefix,\n fieldName: this.getFieldNameFromQueryPath(skipPrefix),\n model: this.model,\n });\n break;\n }\n } else {\n paths.push(firstKey);\n continue;\n }\n }\n\n // firstKey is number\n if (!lodash.isNaN(parseInt(firstKey))) {\n paths.push(firstKey);\n continue;\n }\n\n // firstKey is not association\n if (!associations[firstKey]) {\n paths.push(firstKey);\n continue;\n }\n\n const associationKeys = [];\n\n associationKeys.push(firstKey);\n\n debug('associationKeys %o', associationKeys);\n\n // set sequelize include option\n _.set(include, firstKey, {\n association: firstKey,\n attributes: [], // out put empty fields by default\n });\n\n // association target model\n let target = associations[firstKey].target;\n debug('association target %o', target);\n\n while (target) {\n const attr = keys.shift();\n origins.push(attr);\n // if it is target model attribute\n if (target.rawAttributes[attr]) {\n associationKeys.push(attr);\n target = null;\n } else if (target.associations[attr]) {\n // if it is target model association (nested association filter)\n associationKeys.push(attr);\n const assoc = [];\n associationKeys.forEach((associationKey, index) => {\n if (index > 0) {\n assoc.push('include');\n }\n assoc.push(associationKey);\n });\n\n _.set(include, assoc, {\n association: attr,\n attributes: [],\n });\n target = target.associations[attr].target;\n } else {\n throw new Error(`${attr} neither ${firstKey}'s association nor ${firstKey}'s attribute`);\n }\n }\n\n debug('associationKeys %o', associationKeys);\n\n if (associationKeys.length > 1) {\n paths.push(`$${associationKeys.join('.')}$`);\n } else {\n paths.push(firstKey);\n }\n }\n\n debug('where %o, paths %o, value, %o', where, paths, value);\n\n const values = _.get(where, paths);\n\n if (values && typeof values === 'object' && value && typeof value === 'object') {\n value = { ...value, ...values };\n }\n _.set(where, paths, value);\n }\n\n const toInclude = (items) => {\n return Object.values(items).map((item: any) => {\n if (item.include) {\n item.include = toInclude(item.include);\n }\n return item;\n });\n };\n debug('where %o, include %o', where, include);\n return { where, include: toInclude(include) };\n }\n\n private getFieldNameFromQueryPath(queryPath: string) {\n const paths = queryPath.split('.');\n let fieldName;\n for (const path of paths) {\n if (path.startsWith('$') || !lodash.isNaN(parseInt(path))) {\n continue;\n }\n\n fieldName = path;\n }\n\n return fieldName;\n }\n}\n"]}
package/esm/index.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ export { ModelCtor, Op, SyncOptions } from 'sequelize';
2
+ export * from './collection';
3
+ export * from './database';
4
+ export { Database as default } from './database';
5
+ export * from './fields';
6
+ export * from './magic-attribute-model';
7
+ export * from './mock-database';
8
+ export * from './model';
9
+ export * from './relation-repository/belongs-to-many-repository';
10
+ export * from './relation-repository/belongs-to-repository';
11
+ export * from './relation-repository/hasmany-repository';
12
+ export * from './relation-repository/multiple-relation-repository';
13
+ export * from './relation-repository/single-relation-repository';
14
+ export * from './repository';
15
+ export * from './update-associations';
package/esm/index.js ADDED
@@ -0,0 +1,16 @@
1
+ export { Op } from 'sequelize';
2
+ export * from './collection';
3
+ export * from './database';
4
+ export { Database as default } from './database';
5
+ export * from './fields';
6
+ export * from './magic-attribute-model';
7
+ export * from './mock-database';
8
+ export * from './model';
9
+ export * from './relation-repository/belongs-to-many-repository';
10
+ export * from './relation-repository/belongs-to-repository';
11
+ export * from './relation-repository/hasmany-repository';
12
+ export * from './relation-repository/multiple-relation-repository';
13
+ export * from './relation-repository/single-relation-repository';
14
+ export * from './repository';
15
+ export * from './update-associations';
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,EAAE,EAAe,MAAM,WAAW,CAAC;AACvD,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,QAAQ,IAAI,OAAO,EAAE,MAAM,YAAY,CAAC;AACjD,cAAc,UAAU,CAAC;AACzB,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC;AACxB,cAAc,kDAAkD,CAAC;AACjE,cAAc,6CAA6C,CAAC;AAC5D,cAAc,0CAA0C,CAAC;AACzD,cAAc,oDAAoD,CAAC;AACnE,cAAc,kDAAkD,CAAC;AACjE,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC","sourcesContent":["export { ModelCtor, Op, SyncOptions } from 'sequelize';\nexport * from './collection';\nexport * from './database';\nexport { Database as default } from './database';\nexport * from './fields';\nexport * from './magic-attribute-model';\nexport * from './mock-database';\nexport * from './model';\nexport * from './relation-repository/belongs-to-many-repository';\nexport * from './relation-repository/belongs-to-repository';\nexport * from './relation-repository/hasmany-repository';\nexport * from './relation-repository/multiple-relation-repository';\nexport * from './relation-repository/single-relation-repository';\nexport * from './repository';\nexport * from './update-associations';\n\n"]}
@@ -0,0 +1,7 @@
1
+ import { Model } from './model';
2
+ export declare class MagicAttributeModel extends Model {
3
+ get magicAttribute(): string;
4
+ set(key: any, value?: any, options?: any): this;
5
+ get(key?: any, value?: any): any;
6
+ update(values?: any, options?: any): Promise<this>;
7
+ }
@@ -0,0 +1,70 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { merge } from '@nocobase/utils';
11
+ import _ from 'lodash';
12
+ import { Model } from './model';
13
+ export class MagicAttributeModel extends Model {
14
+ get magicAttribute() {
15
+ const db = this.constructor.database;
16
+ const collection = db.getCollection(this.constructor.name);
17
+ return collection.options.magicAttribute || 'options';
18
+ }
19
+ set(key, value, options) {
20
+ if (typeof key === 'string') {
21
+ const [column] = key.split('.');
22
+ if (this.constructor.hasAlias(column)) {
23
+ return super.set(key, value, options);
24
+ }
25
+ if (this.constructor.rawAttributes[column]) {
26
+ return super.set(key, value, options);
27
+ }
28
+ if (_.isPlainObject(value)) {
29
+ const opts = super.get(this.magicAttribute) || {};
30
+ return super.set(`${this.magicAttribute}.${key}`, merge(opts === null || opts === void 0 ? void 0 : opts[key], value), options);
31
+ }
32
+ return super.set(`${this.magicAttribute}.${key}`, value, options);
33
+ }
34
+ else {
35
+ if (!key) {
36
+ return;
37
+ }
38
+ Object.keys(key).forEach((k) => {
39
+ this.set(k, key[k], options);
40
+ });
41
+ }
42
+ return super.set(key, value, options);
43
+ }
44
+ get(key, value) {
45
+ if (typeof key === 'string') {
46
+ const [column] = key.split('.');
47
+ if (this.constructor.hasAlias(column)) {
48
+ return super.get(key, value);
49
+ }
50
+ if (this.constructor.rawAttributes[column]) {
51
+ return super.get(key, value);
52
+ }
53
+ const options = super.get(this.magicAttribute, value);
54
+ return _.get(options, key);
55
+ }
56
+ const data = super.get(key, value);
57
+ return Object.assign(Object.assign({}, _.omit(data, this.magicAttribute)), data[this.magicAttribute]);
58
+ }
59
+ update(values, options) {
60
+ const _super = Object.create(null, {
61
+ update: { get: () => super.update }
62
+ });
63
+ return __awaiter(this, void 0, void 0, function* () {
64
+ // @ts-ignore
65
+ this._changed = new Set();
66
+ return _super.update.call(this, values, options);
67
+ });
68
+ }
69
+ }
70
+ //# sourceMappingURL=magic-attribute-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"magic-attribute-model.js","sourceRoot":"","sources":["../src/magic-attribute-model.ts"],"names":[],"mappings":"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","sourcesContent":["import { merge } from '@nocobase/utils';\nimport _ from 'lodash';\nimport Database from './database';\nimport { Model } from './model';\n\nexport class MagicAttributeModel extends Model {\n get magicAttribute() {\n const db: Database = (<any>this.constructor).database;\n const collection = db.getCollection(this.constructor.name);\n return collection.options.magicAttribute || 'options';\n }\n\n set(key: any, value?: any, options?: any) {\n if (typeof key === 'string') {\n const [column] = key.split('.');\n if ((this.constructor as any).hasAlias(column)) {\n return super.set(key, value, options);\n }\n if ((this.constructor as any).rawAttributes[column]) {\n return super.set(key, value, options);\n }\n if (_.isPlainObject(value)) {\n const opts = super.get(this.magicAttribute) || {};\n return super.set(`${this.magicAttribute}.${key}`, merge(opts?.[key], value), options);\n }\n return super.set(`${this.magicAttribute}.${key}`, value, options);\n } else {\n if (!key) {\n return;\n }\n Object.keys(key).forEach((k) => {\n this.set(k, key[k], options);\n });\n }\n return super.set(key, value, options);\n }\n\n get(key?: any, value?: any): any {\n if (typeof key === 'string') {\n const [column] = key.split('.');\n if ((this.constructor as any).hasAlias(column)) {\n return super.get(key, value);\n }\n if ((this.constructor as any).rawAttributes[column]) {\n return super.get(key, value);\n }\n const options = super.get(this.magicAttribute, value);\n return _.get(options, key);\n }\n const data = super.get(key, value);\n return {\n ..._.omit(data, this.magicAttribute),\n ...data[this.magicAttribute],\n };\n }\n\n async update(values?: any, options?: any) {\n // @ts-ignore\n this._changed = new Set();\n return super.update(values, options);\n }\n}\n"]}
@@ -0,0 +1,22 @@
1
+ import { Database, IDatabaseOptions } from './database';
2
+ export declare class MockDatabase extends Database {
3
+ constructor(options: IDatabaseOptions);
4
+ }
5
+ export declare function getConfigByEnv(): {
6
+ username: string;
7
+ password: string;
8
+ database: string;
9
+ host: string;
10
+ port: string;
11
+ dialect: string;
12
+ logging: boolean | {
13
+ (...data: any[]): void;
14
+ (message?: any, ...optionalParams: any[]): void;
15
+ };
16
+ storage: string;
17
+ define: {
18
+ charset: string;
19
+ collate: string;
20
+ };
21
+ };
22
+ export declare function mockDatabase(options?: IDatabaseOptions): MockDatabase;
@@ -0,0 +1,34 @@
1
+ import { merge, uid } from '@nocobase/utils';
2
+ import { resolve } from 'path';
3
+ import { Database } from './database';
4
+ export class MockDatabase extends Database {
5
+ constructor(options) {
6
+ super(Object.assign({ storage: ':memory:', tablePrefix: `mock_${uid(6)}_`, dialect: 'sqlite' }, options));
7
+ this.sequelize.beforeDefine((model, opts) => {
8
+ opts.tableName = `${this.getTablePrefix()}${opts.tableName || opts.modelName || opts.name.plural}`;
9
+ });
10
+ }
11
+ }
12
+ export function getConfigByEnv() {
13
+ return {
14
+ username: process.env.DB_USER,
15
+ password: process.env.DB_PASSWORD,
16
+ database: process.env.DB_DATABASE,
17
+ host: process.env.DB_HOST,
18
+ port: process.env.DB_PORT,
19
+ dialect: process.env.DB_DIALECT,
20
+ logging: process.env.DB_LOG_SQL === 'on' ? console.log : false,
21
+ storage: process.env.DB_STORAGE && process.env.DB_STORAGE !== ':memory:'
22
+ ? resolve(process.cwd(), process.env.DB_STORAGE)
23
+ : ':memory:',
24
+ define: {
25
+ charset: 'utf8mb4',
26
+ collate: 'utf8mb4_unicode_ci',
27
+ },
28
+ };
29
+ }
30
+ export function mockDatabase(options = {}) {
31
+ const dbOptions = merge(getConfigByEnv(), options);
32
+ return new MockDatabase(dbOptions);
33
+ }
34
+ //# sourceMappingURL=mock-database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-database.js","sourceRoot":"","sources":["../src/mock-database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAoB,MAAM,YAAY,CAAC;AAExD,MAAM,OAAO,YAAa,SAAQ,QAAQ;IACxC,YAAY,OAAyB;QACnC,KAAK,iBACH,OAAO,EAAE,UAAU,EACnB,WAAW,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC,GAAG,EAC9B,OAAO,EAAE,QAAQ,IACd,OAAO,EACV,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAC1C,IAAI,CAAC,SAAS,GAAG,GAAG,IAAI,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACrG,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO;QAC7B,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW;QACjC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW;QACjC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO;QACzB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO;QACzB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;QAC/B,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK;QAC9D,OAAO,EACL,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,UAAU;YAC7D,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;YAChD,CAAC,CAAC,UAAU;QAChB,MAAM,EAAE;YACN,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE,oBAAoB;SAC9B;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,UAA4B,EAAE;IACzD,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,EAAE,EAAE,OAAO,CAAC,CAAC;IACnD,OAAO,IAAI,YAAY,CAAC,SAAS,CAAC,CAAC;AACrC,CAAC","sourcesContent":["import { merge, uid } from '@nocobase/utils';\nimport { resolve } from 'path';\nimport { Database, IDatabaseOptions } from './database';\n\nexport class MockDatabase extends Database {\n constructor(options: IDatabaseOptions) {\n super({\n storage: ':memory:',\n tablePrefix: `mock_${uid(6)}_`,\n dialect: 'sqlite',\n ...options,\n });\n this.sequelize.beforeDefine((model, opts) => {\n opts.tableName = `${this.getTablePrefix()}${opts.tableName || opts.modelName || opts.name.plural}`;\n });\n }\n}\n\nexport function getConfigByEnv() {\n return {\n username: process.env.DB_USER,\n password: process.env.DB_PASSWORD,\n database: process.env.DB_DATABASE,\n host: process.env.DB_HOST,\n port: process.env.DB_PORT,\n dialect: process.env.DB_DIALECT,\n logging: process.env.DB_LOG_SQL === 'on' ? console.log : false,\n storage:\n process.env.DB_STORAGE && process.env.DB_STORAGE !== ':memory:'\n ? resolve(process.cwd(), process.env.DB_STORAGE)\n : ':memory:',\n define: {\n charset: 'utf8mb4',\n collate: 'utf8mb4_unicode_ci',\n },\n };\n}\n\nexport function mockDatabase(options: IDatabaseOptions = {}): MockDatabase {\n const dbOptions = merge(getConfigByEnv(), options);\n return new MockDatabase(dbOptions);\n}\n"]}
@@ -0,0 +1,12 @@
1
+ import type { SequelizeHooks } from 'sequelize/types/lib/hooks';
2
+ import Database from './database';
3
+ export declare class ModelHook {
4
+ database: Database;
5
+ boundEvent: Set<string>;
6
+ constructor(database: Database);
7
+ isModelHook(eventName: string | symbol): keyof SequelizeHooks | false;
8
+ findModelName(hookArgs: any): any;
9
+ bindEvent(eventName: any): void;
10
+ hasBindEvent(eventName: any): boolean;
11
+ sequelizeHookBuilder(eventName: any): (...args: any[]) => Promise<void>;
12
+ }
@@ -0,0 +1,61 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import lodash from 'lodash';
11
+ import { Model } from './model';
12
+ const { hooks } = require('sequelize/lib/hooks');
13
+ export class ModelHook {
14
+ constructor(database) {
15
+ this.boundEvent = new Set();
16
+ this.database = database;
17
+ }
18
+ isModelHook(eventName) {
19
+ if (lodash.isString(eventName)) {
20
+ const hookType = eventName.split('.').pop();
21
+ if (hooks[hookType]) {
22
+ return hookType;
23
+ }
24
+ }
25
+ return false;
26
+ }
27
+ findModelName(hookArgs) {
28
+ for (const arg of hookArgs) {
29
+ if (arg instanceof Model) {
30
+ return arg.constructor.name;
31
+ }
32
+ if (lodash.isPlainObject(arg)) {
33
+ if (arg['model']) {
34
+ return arg['model'].name;
35
+ }
36
+ if (lodash.get(arg, 'name.plural')) {
37
+ return lodash.get(arg, 'name.plural');
38
+ }
39
+ }
40
+ }
41
+ return null;
42
+ }
43
+ bindEvent(eventName) {
44
+ this.boundEvent.add(eventName);
45
+ }
46
+ hasBindEvent(eventName) {
47
+ return this.boundEvent.has(eventName);
48
+ }
49
+ sequelizeHookBuilder(eventName) {
50
+ return (...args) => __awaiter(this, void 0, void 0, function* () {
51
+ const modelName = this.findModelName(args);
52
+ if (modelName) {
53
+ // emit model event
54
+ yield this.database.emitAsync(`${modelName}.${eventName}`, ...args);
55
+ }
56
+ // emit sequelize global event
57
+ yield this.database.emitAsync(eventName, ...args);
58
+ });
59
+ }
60
+ }
61
+ //# sourceMappingURL=model-hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-hook.js","sourceRoot":"","sources":["../src/model-hook.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAG5B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAEjD,MAAM,OAAO,SAAS;IAIpB,YAAY,QAAkB;QAF9B,eAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QAG7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,WAAW,CAAC,SAA0B;QACpC,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;YAC9B,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAE5C,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE;gBACnB,OAA6B,QAAQ,CAAC;aACvC;SACF;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,aAAa,CAAC,QAAQ;QACpB,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE;YAC1B,IAAI,GAAG,YAAY,KAAK,EAAE;gBACxB,OAAe,GAAI,CAAC,WAAW,CAAC,IAAI,CAAC;aACtC;YAED,IAAI,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE;gBAC7B,IAAI,GAAG,CAAC,OAAO,CAAC,EAAE;oBAChB,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;iBAC1B;gBAED,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE;oBAClC,OAAO,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;iBACvC;aACF;SACF;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,CAAC,SAAS;QACjB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IAED,YAAY,CAAC,SAAS;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,oBAAoB,CAAC,SAAS;QAC5B,OAAO,CAAO,GAAG,IAAW,EAAE,EAAE;YAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAE3C,IAAI,SAAS,EAAE;gBACb,mBAAmB;gBACnB,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,SAAS,IAAI,SAAS,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;aACrE;YAED,8BAA8B;YAC9B,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;QACpD,CAAC,CAAA,CAAC;IACJ,CAAC;CACF","sourcesContent":["import lodash from 'lodash';\nimport type { SequelizeHooks } from 'sequelize/types/lib/hooks';\nimport Database from './database';\nimport { Model } from './model';\n\nconst { hooks } = require('sequelize/lib/hooks');\n\nexport class ModelHook {\n database: Database;\n boundEvent = new Set<string>();\n\n constructor(database: Database) {\n this.database = database;\n }\n\n isModelHook(eventName: string | symbol): keyof SequelizeHooks | false {\n if (lodash.isString(eventName)) {\n const hookType = eventName.split('.').pop();\n\n if (hooks[hookType]) {\n return <keyof SequelizeHooks>hookType;\n }\n }\n\n return false;\n }\n\n findModelName(hookArgs) {\n for (const arg of hookArgs) {\n if (arg instanceof Model) {\n return (<Model>arg).constructor.name;\n }\n\n if (lodash.isPlainObject(arg)) {\n if (arg['model']) {\n return arg['model'].name;\n }\n\n if (lodash.get(arg, 'name.plural')) {\n return lodash.get(arg, 'name.plural');\n }\n }\n }\n\n return null;\n }\n\n bindEvent(eventName) {\n this.boundEvent.add(eventName);\n }\n\n hasBindEvent(eventName) {\n return this.boundEvent.has(eventName);\n }\n\n sequelizeHookBuilder(eventName) {\n return async (...args: any[]) => {\n const modelName = this.findModelName(args);\n\n if (modelName) {\n // emit model event\n await this.database.emitAsync(`${modelName}.${eventName}`, ...args);\n }\n\n // emit sequelize global event\n await this.database.emitAsync(eventName, ...args);\n };\n }\n}\n"]}
package/esm/model.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ import { Model as SequelizeModel } from 'sequelize';
2
+ import { Collection } from './collection';
3
+ import { Database } from './database';
4
+ interface IModel {
5
+ [key: string]: any;
6
+ }
7
+ export declare class Model<TModelAttributes extends {} = any, TCreationAttributes extends {} = TModelAttributes> extends SequelizeModel<TModelAttributes, TCreationAttributes> implements IModel {
8
+ static database: Database;
9
+ static collection: Collection;
10
+ toJSON<T extends TModelAttributes>(): T;
11
+ private hiddenObjKey;
12
+ private sortAssociations;
13
+ private sortArray;
14
+ }
15
+ export {};
package/esm/model.js ADDED
@@ -0,0 +1,80 @@
1
+ import { Model as SequelizeModel } from 'sequelize';
2
+ import lodash from 'lodash';
3
+ export class Model extends SequelizeModel {
4
+ toJSON() {
5
+ const handleObj = (obj, options) => {
6
+ const handles = [
7
+ (data) => {
8
+ if (data instanceof Model) {
9
+ return data.toJSON();
10
+ }
11
+ return data;
12
+ },
13
+ this.hiddenObjKey,
14
+ ];
15
+ return handles.reduce((carry, fn) => fn.apply(this, [carry, options]), obj);
16
+ };
17
+ const handleArray = (arrayOfObj, options) => {
18
+ const handles = [this.sortAssociations];
19
+ return handles.reduce((carry, fn) => fn.apply(this, [carry, options]), arrayOfObj || []);
20
+ };
21
+ const opts = {
22
+ model: this.constructor,
23
+ collection: this.constructor.collection,
24
+ db: this.constructor.database,
25
+ };
26
+ const traverseJSON = (data, options) => {
27
+ const { model, db, collection } = options;
28
+ // handle Object
29
+ data = handleObj(data, options);
30
+ const result = {};
31
+ for (const key of Object.keys(data)) {
32
+ // @ts-ignore
33
+ if (model.hasAlias(key)) {
34
+ const association = model.associations[key];
35
+ const opts = {
36
+ model: association.target,
37
+ collection: db.getCollection(association.target.name),
38
+ db,
39
+ key,
40
+ field: collection.getField(key),
41
+ };
42
+ if (['HasMany', 'BelongsToMany'].includes(association.associationType)) {
43
+ result[key] = handleArray(data[key], opts).map((item) => traverseJSON(item, opts));
44
+ }
45
+ else {
46
+ result[key] = data[key] ? traverseJSON(data[key], opts) : null;
47
+ }
48
+ }
49
+ else {
50
+ result[key] = data[key];
51
+ }
52
+ }
53
+ return result;
54
+ };
55
+ return traverseJSON(super.toJSON(), opts);
56
+ }
57
+ hiddenObjKey(obj, options) {
58
+ const hiddenFields = Array.from(options.collection.fields.values())
59
+ .filter((field) => field.options.hidden)
60
+ .map((field) => field.options.name);
61
+ return lodash.omit(obj, hiddenFields);
62
+ }
63
+ sortAssociations(data, { field }) {
64
+ const sortBy = field.options.sortBy;
65
+ return sortBy ? this.sortArray(data, sortBy) : data;
66
+ }
67
+ sortArray(data, sortBy) {
68
+ if (!lodash.isArray(sortBy)) {
69
+ sortBy = [sortBy];
70
+ }
71
+ const orderItems = [];
72
+ const orderDirections = [];
73
+ sortBy.forEach((sortItem) => {
74
+ orderDirections.push(sortItem.startsWith('-') ? 'desc' : 'asc');
75
+ orderItems.push(sortItem.replace('-', ''));
76
+ });
77
+ return lodash.orderBy(data, orderItems, orderDirections);
78
+ }
79
+ }
80
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,cAAc,EAAa,MAAM,WAAW,CAAC;AAG/D,OAAO,MAAM,MAAM,QAAQ,CAAC;AAe5B,MAAM,OAAO,KACX,SAAQ,cAAqD;IAMtD,MAAM;QACX,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,OAA+B,EAAE,EAAE;YACzD,MAAM,OAAO,GAAG;gBACd,CAAC,IAAI,EAAE,EAAE;oBACP,IAAI,IAAI,YAAY,KAAK,EAAE;wBACzB,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;qBACtB;oBAED,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,IAAI,CAAC,YAAY;aAClB,CAAC;YACF,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC9E,CAAC,CAAC;QAEF,MAAM,WAAW,GAAG,CAAC,UAAU,EAAE,OAA+B,EAAE,EAAE;YAClE,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACxC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC;QAC3F,CAAC,CAAC;QAEF,MAAM,IAAI,GAAG;YACX,KAAK,EAAE,IAAI,CAAC,WAA6B;YACzC,UAAU,EAAG,IAAI,CAAC,WAAmB,CAAC,UAAU;YAChD,EAAE,EAAG,IAAI,CAAC,WAAmB,CAAC,QAAoB;SACnD,CAAC;QAEF,MAAM,YAAY,GAAG,CAAC,IAAO,EAAE,OAA+B,EAAK,EAAE;YACnE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;YAC1C,gBAAgB;YAChB,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAEhC,MAAM,MAAM,GAAG,EAAE,CAAC;YAClB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACnC,aAAa;gBACb,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;oBACvB,MAAM,WAAW,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;oBAC5C,MAAM,IAAI,GAAG;wBACX,KAAK,EAAE,WAAW,CAAC,MAAM;wBACzB,UAAU,EAAE,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;wBACrD,EAAE;wBACF,GAAG;wBACH,KAAK,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC;qBAChC,CAAC;oBAEF,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,eAAe,CAAC,EAAE;wBACtE,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;qBACpF;yBAAM;wBACL,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;qBAChE;iBACF;qBAAM;oBACL,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;iBACzB;aACF;YAED,OAAO,MAAW,CAAC;QACrB,CAAC,CAAC;QAEF,OAAO,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC;IAEO,YAAY,CAAC,GAAG,EAAE,OAA+B;QACvD,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;aAChE,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;aACvC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAEtC,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACxC,CAAC;IAEO,gBAAgB,CAAC,IAAI,EAAE,EAAE,KAAK,EAA0B;QAC9D,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QACpC,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACtD,CAAC;IAEO,SAAS,CAAC,IAAI,EAAE,MAAyB;QAC/C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YAC3B,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC;SACnB;QAED,MAAM,UAAU,GAAG,EAAE,CAAC;QACtB,MAAM,eAAe,GAAG,EAAE,CAAC;QAE3B,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC1B,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAChE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;IAC3D,CAAC;CACF","sourcesContent":["import { Model as SequelizeModel, ModelCtor } from 'sequelize';\nimport { Collection } from './collection';\nimport { Database } from './database';\nimport lodash from 'lodash';\nimport { Field } from './fields';\n\ninterface IModel {\n [key: string]: any;\n}\n\ninterface JSONTransformerOptions {\n model: ModelCtor<any>;\n collection: Collection;\n db: Database;\n key?: string;\n field?: Field;\n}\n\nexport class Model<TModelAttributes extends {} = any, TCreationAttributes extends {} = TModelAttributes>\n extends SequelizeModel<TModelAttributes, TCreationAttributes>\n implements IModel\n{\n public static database: Database;\n public static collection: Collection;\n\n public toJSON<T extends TModelAttributes>(): T {\n const handleObj = (obj, options: JSONTransformerOptions) => {\n const handles = [\n (data) => {\n if (data instanceof Model) {\n return data.toJSON();\n }\n\n return data;\n },\n this.hiddenObjKey,\n ];\n return handles.reduce((carry, fn) => fn.apply(this, [carry, options]), obj);\n };\n\n const handleArray = (arrayOfObj, options: JSONTransformerOptions) => {\n const handles = [this.sortAssociations];\n return handles.reduce((carry, fn) => fn.apply(this, [carry, options]), arrayOfObj || []);\n };\n\n const opts = {\n model: this.constructor as ModelCtor<any>,\n collection: (this.constructor as any).collection,\n db: (this.constructor as any).database as Database,\n };\n\n const traverseJSON = (data: T, options: JSONTransformerOptions): T => {\n const { model, db, collection } = options;\n // handle Object\n data = handleObj(data, options);\n\n const result = {};\n for (const key of Object.keys(data)) {\n // @ts-ignore\n if (model.hasAlias(key)) {\n const association = model.associations[key];\n const opts = {\n model: association.target,\n collection: db.getCollection(association.target.name),\n db,\n key,\n field: collection.getField(key),\n };\n\n if (['HasMany', 'BelongsToMany'].includes(association.associationType)) {\n result[key] = handleArray(data[key], opts).map((item) => traverseJSON(item, opts));\n } else {\n result[key] = data[key] ? traverseJSON(data[key], opts) : null;\n }\n } else {\n result[key] = data[key];\n }\n }\n\n return result as T;\n };\n\n return traverseJSON(super.toJSON(), opts);\n }\n\n private hiddenObjKey(obj, options: JSONTransformerOptions) {\n const hiddenFields = Array.from(options.collection.fields.values())\n .filter((field) => field.options.hidden)\n .map((field) => field.options.name);\n\n return lodash.omit(obj, hiddenFields);\n }\n\n private sortAssociations(data, { field }: JSONTransformerOptions): any {\n const sortBy = field.options.sortBy;\n return sortBy ? this.sortArray(data, sortBy) : data;\n }\n\n private sortArray(data, sortBy: string | string[]) {\n if (!lodash.isArray(sortBy)) {\n sortBy = [sortBy];\n }\n\n const orderItems = [];\n const orderDirections = [];\n\n sortBy.forEach((sortItem) => {\n orderDirections.push(sortItem.startsWith('-') ? 'desc' : 'asc');\n orderItems.push(sortItem.replace('-', ''));\n });\n\n return lodash.orderBy(data, orderItems, orderDirections);\n }\n}\n"]}
@@ -0,0 +1,26 @@
1
+ import { Op } from 'sequelize';
2
+ declare const _default: {
3
+ $match(value: any, ctx: any): import("sequelize/types/lib/utils").Literal | {
4
+ [Op.contained]: any;
5
+ [Op.contains]: any;
6
+ [Op.eq]?: undefined;
7
+ } | {
8
+ [Op.eq]: import("sequelize/types/lib/utils").Literal;
9
+ [Op.contained]?: undefined;
10
+ [Op.contains]?: undefined;
11
+ };
12
+ $notMatch(value: any, ctx: any): import("sequelize/types/lib/utils").Literal | {
13
+ [Op.ne]: import("sequelize/types/lib/utils").Literal;
14
+ };
15
+ $anyOf(value: any, ctx: any): import("sequelize/types/lib/utils").Literal;
16
+ $noneOf(value: any, ctx: any): {
17
+ [Op.or]: any[];
18
+ };
19
+ $arrayEmpty(value: any, ctx: any): {
20
+ [Op.and]: import("sequelize/types/lib/utils").Literal[];
21
+ };
22
+ $arrayNotEmpty(value: any, ctx: any): {
23
+ [Op.and]: import("sequelize/types/lib/utils").Literal[];
24
+ };
25
+ };
26
+ export default _default;