@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,13 @@
1
+ import { BaseColumnFieldOptions, Field } from './field';
2
+ export declare class ContextField extends Field {
3
+ get dataType(): any;
4
+ init(): void;
5
+ bind(): void;
6
+ unbind(): void;
7
+ }
8
+ export interface ContextFieldOptions extends BaseColumnFieldOptions {
9
+ type: 'context';
10
+ dataIndex: string;
11
+ dataType?: string;
12
+ createOnly?: boolean;
13
+ }
@@ -0,0 +1,43 @@
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 { DataTypes } from 'sequelize';
12
+ import { Field } from './field';
13
+ export class ContextField extends Field {
14
+ get dataType() {
15
+ const type = this.options.dataType || 'string';
16
+ return DataTypes[type.toUpperCase()] || DataTypes.STRING;
17
+ }
18
+ init() {
19
+ const { name, dataIndex } = this.options;
20
+ this.listener = (model, options) => __awaiter(this, void 0, void 0, function* () {
21
+ const { context } = options;
22
+ model.set(name, lodash.get(context, dataIndex));
23
+ model.changed(name, true);
24
+ });
25
+ }
26
+ bind() {
27
+ super.bind();
28
+ const { createOnly } = this.options;
29
+ this.on('beforeCreate', this.listener);
30
+ if (!createOnly) {
31
+ this.on('beforeUpdate', this.listener);
32
+ }
33
+ }
34
+ unbind() {
35
+ super.unbind();
36
+ const { createOnly } = this.options;
37
+ this.off('beforeCreate', this.listener);
38
+ if (!createOnly) {
39
+ this.off('beforeUpdate', this.listener);
40
+ }
41
+ }
42
+ }
43
+ //# sourceMappingURL=context-field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-field.js","sourceRoot":"","sources":["../../src/fields/context-field.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAA0B,KAAK,EAAE,MAAM,SAAS,CAAC;AAExD,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrC,IAAI,QAAQ;QACV,MAAM,IAAI,GAAW,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC;QACvD,OAAO,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC;IAC3D,CAAC;IAED,IAAI;QACF,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACzC,IAAI,CAAC,QAAQ,GAAG,CAAO,KAAY,EAAE,OAAO,EAAE,EAAE;YAC9C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;YAC5B,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;YAChD,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAA,CAAC;IACJ,CAAC;IAED,IAAI;QACF,KAAK,CAAC,IAAI,EAAE,CAAC;QACb,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACpC,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,CAAC,UAAU,EAAE;YACf,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;SACxC;IACH,CAAC;IAED,MAAM;QACJ,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,UAAU,EAAE;YACf,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;SACzC;IACH,CAAC;CACF","sourcesContent":["import lodash from 'lodash';\nimport { DataTypes } from 'sequelize';\nimport { Model } from '../model';\nimport { BaseColumnFieldOptions, Field } from './field';\n\nexport class ContextField extends Field {\n get dataType() {\n const type: string = this.options.dataType || 'string';\n return DataTypes[type.toUpperCase()] || DataTypes.STRING;\n }\n\n init() {\n const { name, dataIndex } = this.options;\n this.listener = async (model: Model, options) => {\n const { context } = options;\n model.set(name, lodash.get(context, dataIndex));\n model.changed(name, true);\n };\n }\n\n bind() {\n super.bind();\n const { createOnly } = this.options;\n this.on('beforeCreate', this.listener);\n if (!createOnly) {\n this.on('beforeUpdate', this.listener);\n }\n }\n\n unbind() {\n super.unbind();\n const { createOnly } = this.options;\n this.off('beforeCreate', this.listener);\n if (!createOnly) {\n this.off('beforeUpdate', this.listener);\n }\n }\n}\n\nexport interface ContextFieldOptions extends BaseColumnFieldOptions {\n type: 'context';\n dataIndex: string;\n dataType?: string;\n createOnly?: boolean;\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import { DataTypes } from 'sequelize';
2
+ import { BaseColumnFieldOptions, Field } from './field';
3
+ export declare class DateField extends Field {
4
+ get dataType(): DataTypes.DateDataTypeConstructor;
5
+ }
6
+ export interface DateFieldOptions extends BaseColumnFieldOptions {
7
+ type: 'date';
8
+ }
@@ -0,0 +1,8 @@
1
+ import { DataTypes } from 'sequelize';
2
+ import { Field } from './field';
3
+ export class DateField extends Field {
4
+ get dataType() {
5
+ return DataTypes.DATE;
6
+ }
7
+ }
8
+ //# sourceMappingURL=date-field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-field.js","sourceRoot":"","sources":["../../src/fields/date-field.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAA0B,KAAK,EAAE,MAAM,SAAS,CAAC;AAExD,MAAM,OAAO,SAAU,SAAQ,KAAK;IAClC,IAAI,QAAQ;QACV,OAAO,SAAS,CAAC,IAAI,CAAC;IACxB,CAAC;CACF","sourcesContent":["import { DataTypes } from 'sequelize';\nimport { BaseColumnFieldOptions, Field } from './field';\n\nexport class DateField extends Field {\n get dataType() {\n return DataTypes.DATE;\n }\n}\n\nexport interface DateFieldOptions extends BaseColumnFieldOptions {\n type: 'date';\n}\n"]}
@@ -0,0 +1,37 @@
1
+ import { DataType, ModelAttributeColumnOptions, ModelIndexesOptions, SyncOptions } from 'sequelize';
2
+ import { Collection } from '../collection';
3
+ import { Database } from '../database';
4
+ export interface FieldContext {
5
+ database: Database;
6
+ collection: Collection;
7
+ }
8
+ export interface BaseFieldOptions {
9
+ name?: string;
10
+ hidden?: boolean;
11
+ [key: string]: any;
12
+ }
13
+ export interface BaseColumnFieldOptions extends BaseFieldOptions, Omit<ModelAttributeColumnOptions, 'type'> {
14
+ dataType?: DataType;
15
+ index?: boolean | ModelIndexesOptions;
16
+ }
17
+ export declare abstract class Field {
18
+ options: any;
19
+ context: FieldContext;
20
+ database: Database;
21
+ collection: Collection;
22
+ [key: string]: any;
23
+ get name(): any;
24
+ get type(): any;
25
+ get dataType(): any;
26
+ constructor(options?: any, context?: FieldContext);
27
+ sync(syncOptions: SyncOptions): Promise<void>;
28
+ init(): void;
29
+ on(eventName: string, listener: (...args: any[]) => void): this;
30
+ off(eventName: string, listener: (...args: any[]) => void): this;
31
+ get(name: string): any;
32
+ merge(obj: any): void;
33
+ bind(): void;
34
+ unbind(): void;
35
+ toSequelize(): any;
36
+ isSqlite(): boolean;
37
+ }
@@ -0,0 +1,74 @@
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 _ from 'lodash';
11
+ export class Field {
12
+ constructor(options, context) {
13
+ this.context = context;
14
+ this.database = context.database;
15
+ this.collection = context.collection;
16
+ this.options = options || {};
17
+ this.init();
18
+ }
19
+ get name() {
20
+ return this.options.name;
21
+ }
22
+ get type() {
23
+ return this.options.type;
24
+ }
25
+ get dataType() {
26
+ return this.options.dataType;
27
+ }
28
+ // TODO
29
+ sync(syncOptions) {
30
+ return __awaiter(this, void 0, void 0, function* () {
31
+ yield this.collection.sync(Object.assign(Object.assign({}, syncOptions), { force: false, alter: {
32
+ drop: false,
33
+ } }));
34
+ });
35
+ }
36
+ init() {
37
+ // code
38
+ }
39
+ on(eventName, listener) {
40
+ this.database.on(`${this.collection.name}.${eventName}`, listener);
41
+ return this;
42
+ }
43
+ off(eventName, listener) {
44
+ this.database.off(`${this.collection.name}.${eventName}`, listener);
45
+ return this;
46
+ }
47
+ get(name) {
48
+ return this.options[name];
49
+ }
50
+ merge(obj) {
51
+ Object.assign(this.options, obj);
52
+ }
53
+ bind() {
54
+ const { model } = this.context.collection;
55
+ model.rawAttributes[this.name] = this.toSequelize();
56
+ // @ts-ignore
57
+ model.refreshAttributes();
58
+ }
59
+ unbind() {
60
+ const { model } = this.context.collection;
61
+ model.removeAttribute(this.name);
62
+ }
63
+ toSequelize() {
64
+ const opts = _.omit(this.options, ['name']);
65
+ if (this.dataType) {
66
+ Object.assign(opts, { type: this.dataType });
67
+ }
68
+ return opts;
69
+ }
70
+ isSqlite() {
71
+ return this.database.sequelize.getDialect() === 'sqlite';
72
+ }
73
+ }
74
+ //# sourceMappingURL=field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field.js","sourceRoot":"","sources":["../../src/fields/field.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,CAAC,MAAM,QAAQ,CAAC;AAqBvB,MAAM,OAAgB,KAAK;IAmBzB,YAAY,OAAa,EAAE,OAAsB;QAC/C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAlBD,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAUD,OAAO;IACD,IAAI,CAAC,WAAwB;;YACjC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,iCACrB,WAAW,KACd,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE;oBACL,IAAI,EAAE,KAAK;iBACZ,IACD,CAAC;QACL,CAAC;KAAA;IAED,IAAI;QACF,OAAO;IACT,CAAC;IAED,EAAE,CAAC,SAAiB,EAAE,QAAkC;QACtD,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,SAAS,EAAE,EAAE,QAAQ,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,SAAiB,EAAE,QAAkC;QACvD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,SAAS,EAAE,EAAE,QAAQ,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,GAAQ;QACZ,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACnC,CAAC;IAED,IAAI;QACF,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;QAC1C,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpD,aAAa;QACb,KAAK,CAAC,iBAAiB,EAAE,CAAC;IAC5B,CAAC;IAED,MAAM;QACJ,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;QAC1C,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,WAAW;QACT,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5C,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;SAC9C;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,QAAQ,CAAC;IAC3D,CAAC;CACF","sourcesContent":["import _ from 'lodash';\nimport { DataType, ModelAttributeColumnOptions, ModelIndexesOptions, SyncOptions } from 'sequelize';\nimport { Collection } from '../collection';\nimport { Database } from '../database';\n\nexport interface FieldContext {\n database: Database;\n collection: Collection;\n}\n\nexport interface BaseFieldOptions {\n name?: string;\n hidden?: boolean;\n [key: string]: any;\n}\n\nexport interface BaseColumnFieldOptions extends BaseFieldOptions, Omit<ModelAttributeColumnOptions, 'type'> {\n dataType?: DataType;\n index?: boolean | ModelIndexesOptions;\n}\n\nexport abstract class Field {\n options: any;\n context: FieldContext;\n database: Database;\n collection: Collection;\n [key: string]: any;\n\n get name() {\n return this.options.name;\n }\n\n get type() {\n return this.options.type;\n }\n\n get dataType() {\n return this.options.dataType;\n }\n\n constructor(options?: any, context?: FieldContext) {\n this.context = context;\n this.database = context.database;\n this.collection = context.collection;\n this.options = options || {};\n this.init();\n }\n\n // TODO\n async sync(syncOptions: SyncOptions) {\n await this.collection.sync({\n ...syncOptions,\n force: false,\n alter: {\n drop: false,\n },\n });\n }\n\n init() {\n // code\n }\n\n on(eventName: string, listener: (...args: any[]) => void) {\n this.database.on(`${this.collection.name}.${eventName}`, listener);\n return this;\n }\n\n off(eventName: string, listener: (...args: any[]) => void) {\n this.database.off(`${this.collection.name}.${eventName}`, listener);\n return this;\n }\n\n get(name: string) {\n return this.options[name];\n }\n\n merge(obj: any) {\n Object.assign(this.options, obj);\n }\n\n bind() {\n const { model } = this.context.collection;\n model.rawAttributes[this.name] = this.toSequelize();\n // @ts-ignore\n model.refreshAttributes();\n }\n\n unbind() {\n const { model } = this.context.collection;\n model.removeAttribute(this.name);\n }\n\n toSequelize(): any {\n const opts = _.omit(this.options, ['name']);\n if (this.dataType) {\n Object.assign(opts, { type: this.dataType });\n }\n return opts;\n }\n\n isSqlite() {\n return this.database.sequelize.getDialect() === 'sqlite';\n }\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import { Field } from './field';
2
+ export interface HasInverseField {
3
+ inverseField: () => Field;
4
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=has-inverse-field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"has-inverse-field.js","sourceRoot":"","sources":["../../src/fields/has-inverse-field.ts"],"names":[],"mappings":"","sourcesContent":["import { Field } from './field';\n\nexport interface HasInverseField {\n inverseField: () => Field;\n}\n"]}
@@ -0,0 +1,64 @@
1
+ import { AssociationScope, DataType, ForeignKeyOptions, HasManyOptions, HasManyOptions as SequelizeHasManyOptions } from 'sequelize';
2
+ import { MultipleRelationFieldOptions, RelationField } from './relation-field';
3
+ export interface HasManyFieldOptions extends HasManyOptions {
4
+ /**
5
+ * The name of the field to use as the key for the association in the source table. Defaults to the primary
6
+ * key of the source table
7
+ */
8
+ sourceKey?: string;
9
+ /**
10
+ * A string or a data type to represent the identifier in the table
11
+ */
12
+ keyType?: DataType;
13
+ scope?: AssociationScope;
14
+ /**
15
+ * The alias of this model, in singular form. See also the `name` option passed to `sequelize.define`. If
16
+ * you create multiple associations between the same tables, you should provide an alias to be able to
17
+ * distinguish between them. If you provide an alias when creating the assocition, you should provide the
18
+ * same alias when eager loading and when getting associated models. Defaults to the singularized name of
19
+ * target
20
+ */
21
+ as?: string | {
22
+ singular: string;
23
+ plural: string;
24
+ };
25
+ /**
26
+ * The name of the foreign key in the target table or an object representing the type definition for the
27
+ * foreign column (see `Sequelize.define` for syntax). When using an object, you can add a `name` property
28
+ * to set the name of the column. Defaults to the name of source + primary key of source
29
+ */
30
+ foreignKey?: string | ForeignKeyOptions;
31
+ /**
32
+ * What happens when delete occurs.
33
+ *
34
+ * Cascade if this is a n:m, and set null if it is a 1:m
35
+ *
36
+ * @default 'SET NULL' or 'CASCADE'
37
+ */
38
+ onDelete?: string;
39
+ /**
40
+ * What happens when update occurs
41
+ *
42
+ * @default 'CASCADE'
43
+ */
44
+ onUpdate?: string;
45
+ /**
46
+ * Should on update and on delete constraints be enabled on the foreign key.
47
+ */
48
+ constraints?: boolean;
49
+ foreignKeyConstraint?: boolean;
50
+ /**
51
+ * If `false` the applicable hooks will not be called.
52
+ * The default value depends on the context.
53
+ */
54
+ hooks?: boolean;
55
+ }
56
+ export declare class HasManyField extends RelationField {
57
+ get foreignKey(): any;
58
+ bind(): boolean;
59
+ unbind(): void;
60
+ }
61
+ export interface HasManyFieldOptions extends MultipleRelationFieldOptions, SequelizeHasManyOptions {
62
+ type: 'hasMany';
63
+ target?: string;
64
+ }
@@ -0,0 +1,58 @@
1
+ import { omit } from 'lodash';
2
+ import { Utils, } from 'sequelize';
3
+ import { RelationField } from './relation-field';
4
+ export class HasManyField extends RelationField {
5
+ get foreignKey() {
6
+ if (this.options.foreignKey) {
7
+ return this.options.foreignKey;
8
+ }
9
+ const { model } = this.context.collection;
10
+ return Utils.camelize([model.options.name.singular, this.sourceKey || model.primaryKeyAttribute].join('_'));
11
+ }
12
+ bind() {
13
+ const { database, collection } = this.context;
14
+ const Target = this.TargetModel;
15
+ if (!Target) {
16
+ database.addPendingField(this);
17
+ return false;
18
+ }
19
+ if (collection.model.associations[this.name]) {
20
+ delete collection.model.associations[this.name];
21
+ }
22
+ const association = collection.model.hasMany(Target, Object.assign({ as: this.name, foreignKey: this.foreignKey }, omit(this.options, ['name', 'type', 'target'])));
23
+ // inverse relation
24
+ // this.TargetModel.belongsTo(collection.model);
25
+ // 建立关系之后从 pending 列表中删除
26
+ database.removePendingField(this);
27
+ if (!this.options.foreignKey) {
28
+ this.options.foreignKey = association.foreignKey;
29
+ }
30
+ if (!this.options.sourceKey) {
31
+ // @ts-ignore
32
+ this.options.sourceKey = association.sourceKey;
33
+ }
34
+ return true;
35
+ }
36
+ unbind() {
37
+ const { database, collection } = this.context;
38
+ // 如果关系字段还没建立就删除了,也同步删除待建立关联的关系字段
39
+ database.removePendingField(this);
40
+ // 如果关系表内没有显式的创建外键字段,删除关系时,外键也删除掉
41
+ const tcoll = database.collections.get(this.target);
42
+ const foreignKey = this.options.foreignKey;
43
+ const field = tcoll.findField((field) => {
44
+ if (field.name === foreignKey) {
45
+ return true;
46
+ }
47
+ return field.type === 'belongsTo' && field.foreignKey === foreignKey;
48
+ });
49
+ if (!field) {
50
+ tcoll.model.removeAttribute(foreignKey);
51
+ }
52
+ // 删掉 model 的关联字段
53
+ delete collection.model.associations[this.name];
54
+ // @ts-ignore
55
+ collection.model.refreshAttributes();
56
+ }
57
+ }
58
+ //# sourceMappingURL=has-many-field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"has-many-field.js","sourceRoot":"","sources":["../../src/fields/has-many-field.ts"],"names":[],"mappings":"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","sourcesContent":["import { omit } from 'lodash';\nimport {\n AssociationScope,\n DataType,\n ForeignKeyOptions,\n HasManyOptions,\n HasManyOptions as SequelizeHasManyOptions,\n Utils,\n} from 'sequelize';\n\nimport { BaseRelationFieldOptions, MultipleRelationFieldOptions, RelationField } from './relation-field';\n\nexport interface HasManyFieldOptions extends HasManyOptions {\n /**\n * The name of the field to use as the key for the association in the source table. Defaults to the primary\n * key of the source table\n */\n sourceKey?: string;\n\n /**\n * A string or a data type to represent the identifier in the table\n */\n keyType?: DataType;\n\n scope?: AssociationScope;\n\n /**\n * The alias of this model, in singular form. See also the `name` option passed to `sequelize.define`. If\n * you create multiple associations between the same tables, you should provide an alias to be able to\n * distinguish between them. If you provide an alias when creating the assocition, you should provide the\n * same alias when eager loading and when getting associated models. Defaults to the singularized name of\n * target\n */\n as?: string | { singular: string; plural: string };\n\n /**\n * The name of the foreign key in the target table or an object representing the type definition for the\n * foreign column (see `Sequelize.define` for syntax). When using an object, you can add a `name` property\n * to set the name of the column. Defaults to the name of source + primary key of source\n */\n foreignKey?: string | ForeignKeyOptions;\n\n /**\n * What happens when delete occurs.\n *\n * Cascade if this is a n:m, and set null if it is a 1:m\n *\n * @default 'SET NULL' or 'CASCADE'\n */\n onDelete?: string;\n\n /**\n * What happens when update occurs\n *\n * @default 'CASCADE'\n */\n onUpdate?: string;\n\n /**\n * Should on update and on delete constraints be enabled on the foreign key.\n */\n constraints?: boolean;\n foreignKeyConstraint?: boolean;\n\n // scope?: AssociationScope;\n\n /**\n * If `false` the applicable hooks will not be called.\n * The default value depends on the context.\n */\n hooks?: boolean;\n}\n\nexport class HasManyField extends RelationField {\n get foreignKey() {\n if (this.options.foreignKey) {\n return this.options.foreignKey;\n }\n const { model } = this.context.collection;\n return Utils.camelize([model.options.name.singular, this.sourceKey || model.primaryKeyAttribute].join('_'));\n }\n\n bind() {\n const { database, collection } = this.context;\n const Target = this.TargetModel;\n if (!Target) {\n database.addPendingField(this);\n return false;\n }\n\n if (collection.model.associations[this.name]) {\n delete collection.model.associations[this.name];\n }\n\n const association = collection.model.hasMany(Target, {\n as: this.name,\n foreignKey: this.foreignKey,\n ...omit(this.options, ['name', 'type', 'target']),\n });\n\n // inverse relation\n // this.TargetModel.belongsTo(collection.model);\n\n // 建立关系之后从 pending 列表中删除\n database.removePendingField(this);\n\n if (!this.options.foreignKey) {\n this.options.foreignKey = association.foreignKey;\n }\n if (!this.options.sourceKey) {\n // @ts-ignore\n this.options.sourceKey = association.sourceKey;\n }\n return true;\n }\n\n unbind() {\n const { database, collection } = this.context;\n // 如果关系字段还没建立就删除了,也同步删除待建立关联的关系字段\n database.removePendingField(this);\n // 如果关系表内没有显式的创建外键字段,删除关系时,外键也删除掉\n const tcoll = database.collections.get(this.target);\n const foreignKey = this.options.foreignKey;\n const field = tcoll.findField((field) => {\n if (field.name === foreignKey) {\n return true;\n }\n return field.type === 'belongsTo' && field.foreignKey === foreignKey;\n });\n if (!field) {\n tcoll.model.removeAttribute(foreignKey);\n }\n // 删掉 model 的关联字段\n delete collection.model.associations[this.name];\n // @ts-ignore\n collection.model.refreshAttributes();\n }\n}\n\nexport interface HasManyFieldOptions extends MultipleRelationFieldOptions, SequelizeHasManyOptions {\n type: 'hasMany';\n target?: string;\n}\n"]}
@@ -0,0 +1,64 @@
1
+ import { AssociationScope, DataType, ForeignKeyOptions, HasOneOptions, HasOneOptions as SequelizeHasOneOptions } from 'sequelize';
2
+ import { BaseRelationFieldOptions, RelationField } from './relation-field';
3
+ export interface HasOneFieldOptions extends HasOneOptions {
4
+ /**
5
+ * The name of the field to use as the key for the association in the source table. Defaults to the primary
6
+ * key of the source table
7
+ */
8
+ sourceKey?: string;
9
+ /**
10
+ * A string or a data type to represent the identifier in the table
11
+ */
12
+ keyType?: DataType;
13
+ scope?: AssociationScope;
14
+ /**
15
+ * The alias of this model, in singular form. See also the `name` option passed to `sequelize.define`. If
16
+ * you create multiple associations between the same tables, you should provide an alias to be able to
17
+ * distinguish between them. If you provide an alias when creating the assocition, you should provide the
18
+ * same alias when eager loading and when getting associated models. Defaults to the singularized name of
19
+ * target
20
+ */
21
+ as?: string | {
22
+ singular: string;
23
+ plural: string;
24
+ };
25
+ /**
26
+ * The name of the foreign key in the target table or an object representing the type definition for the
27
+ * foreign column (see `Sequelize.define` for syntax). When using an object, you can add a `name` property
28
+ * to set the name of the column. Defaults to the name of source + primary key of source
29
+ */
30
+ foreignKey?: string | ForeignKeyOptions;
31
+ /**
32
+ * What happens when delete occurs.
33
+ *
34
+ * Cascade if this is a n:m, and set null if it is a 1:m
35
+ *
36
+ * @default 'SET NULL' or 'CASCADE'
37
+ */
38
+ onDelete?: string;
39
+ /**
40
+ * What happens when update occurs
41
+ *
42
+ * @default 'CASCADE'
43
+ */
44
+ onUpdate?: string;
45
+ /**
46
+ * Should on update and on delete constraints be enabled on the foreign key.
47
+ */
48
+ constraints?: boolean;
49
+ foreignKeyConstraint?: boolean;
50
+ /**
51
+ * If `false` the applicable hooks will not be called.
52
+ * The default value depends on the context.
53
+ */
54
+ hooks?: boolean;
55
+ }
56
+ export declare class HasOneField extends RelationField {
57
+ get target(): any;
58
+ get foreignKey(): any;
59
+ bind(): boolean;
60
+ unbind(): void;
61
+ }
62
+ export interface HasOneFieldOptions extends BaseRelationFieldOptions, SequelizeHasOneOptions {
63
+ type: 'hasOne';
64
+ }
@@ -0,0 +1,57 @@
1
+ import { omit } from 'lodash';
2
+ import { Utils } from 'sequelize';
3
+ import { RelationField } from './relation-field';
4
+ export class HasOneField extends RelationField {
5
+ get target() {
6
+ const { target, name } = this.options;
7
+ return target || Utils.pluralize(name);
8
+ }
9
+ get foreignKey() {
10
+ if (this.options.foreignKey) {
11
+ return this.options.foreignKey;
12
+ }
13
+ const { model } = this.context.collection;
14
+ return Utils.camelize([model.options.name.singular, model.primaryKeyAttribute].join('_'));
15
+ }
16
+ bind() {
17
+ const { database, collection } = this.context;
18
+ const Target = this.TargetModel;
19
+ if (!Target) {
20
+ database.addPendingField(this);
21
+ return false;
22
+ }
23
+ const association = collection.model.hasOne(Target, Object.assign({ as: this.name, foreignKey: this.foreignKey }, omit(this.options, ['name', 'type', 'target'])));
24
+ // 建立关系之后从 pending 列表中删除
25
+ database.removePendingField(this);
26
+ if (!this.options.foreignKey) {
27
+ this.options.foreignKey = association.foreignKey;
28
+ }
29
+ if (!this.options.sourceKey) {
30
+ // @ts-ignore
31
+ this.options.sourceKey = association.sourceKey;
32
+ }
33
+ return true;
34
+ }
35
+ unbind() {
36
+ const { database, collection } = this.context;
37
+ // 如果关系字段还没建立就删除了,也同步删除待建立关联的关系字段
38
+ database.removePendingField(this);
39
+ // 如果关系表内没有显式的创建外键字段,删除关系时,外键也删除掉
40
+ const tcoll = database.collections.get(this.target);
41
+ const foreignKey = this.options.foreignKey;
42
+ const field = tcoll.findField((field) => {
43
+ if (field.name === foreignKey) {
44
+ return true;
45
+ }
46
+ return field.type === 'belongsTo' && field.foreignKey === foreignKey;
47
+ });
48
+ if (!field) {
49
+ tcoll.model.removeAttribute(foreignKey);
50
+ }
51
+ // 删掉 model 的关联字段
52
+ delete collection.model.associations[this.name];
53
+ // @ts-ignore
54
+ collection.model.refreshAttributes();
55
+ }
56
+ }
57
+ //# sourceMappingURL=has-one-field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"has-one-field.js","sourceRoot":"","sources":["../../src/fields/has-one-field.ts"],"names":[],"mappings":"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","sourcesContent":["import { omit } from 'lodash';\nimport {\n AssociationScope,\n DataType,\n ForeignKeyOptions,\n HasOneOptions,\n HasOneOptions as SequelizeHasOneOptions,\n Utils\n} from 'sequelize';\nimport { BaseRelationFieldOptions, RelationField } from './relation-field';\n\nexport interface HasOneFieldOptions extends HasOneOptions {\n /**\n * The name of the field to use as the key for the association in the source table. Defaults to the primary\n * key of the source table\n */\n sourceKey?: string;\n\n /**\n * A string or a data type to represent the identifier in the table\n */\n keyType?: DataType;\n\n scope?: AssociationScope;\n\n /**\n * The alias of this model, in singular form. See also the `name` option passed to `sequelize.define`. If\n * you create multiple associations between the same tables, you should provide an alias to be able to\n * distinguish between them. If you provide an alias when creating the assocition, you should provide the\n * same alias when eager loading and when getting associated models. Defaults to the singularized name of\n * target\n */\n as?: string | { singular: string; plural: string };\n\n /**\n * The name of the foreign key in the target table or an object representing the type definition for the\n * foreign column (see `Sequelize.define` for syntax). When using an object, you can add a `name` property\n * to set the name of the column. Defaults to the name of source + primary key of source\n */\n foreignKey?: string | ForeignKeyOptions;\n\n /**\n * What happens when delete occurs.\n *\n * Cascade if this is a n:m, and set null if it is a 1:m\n *\n * @default 'SET NULL' or 'CASCADE'\n */\n onDelete?: string;\n\n /**\n * What happens when update occurs\n *\n * @default 'CASCADE'\n */\n onUpdate?: string;\n\n /**\n * Should on update and on delete constraints be enabled on the foreign key.\n */\n constraints?: boolean;\n foreignKeyConstraint?: boolean;\n\n // scope?: AssociationScope;\n\n /**\n * If `false` the applicable hooks will not be called.\n * The default value depends on the context.\n */\n hooks?: boolean;\n}\n\nexport class HasOneField extends RelationField {\n get target() {\n const { target, name } = this.options;\n return target || Utils.pluralize(name);\n }\n\n get foreignKey() {\n if (this.options.foreignKey) {\n return this.options.foreignKey;\n }\n const { model } = this.context.collection;\n return Utils.camelize([model.options.name.singular, model.primaryKeyAttribute].join('_'));\n }\n\n bind() {\n const { database, collection } = this.context;\n const Target = this.TargetModel;\n if (!Target) {\n database.addPendingField(this);\n return false;\n }\n const association = collection.model.hasOne(Target, {\n as: this.name,\n foreignKey: this.foreignKey,\n ...omit(this.options, ['name', 'type', 'target']),\n });\n // 建立关系之后从 pending 列表中删除\n database.removePendingField(this);\n if (!this.options.foreignKey) {\n this.options.foreignKey = association.foreignKey;\n }\n if (!this.options.sourceKey) {\n // @ts-ignore\n this.options.sourceKey = association.sourceKey;\n }\n return true;\n }\n\n unbind() {\n const { database, collection } = this.context;\n // 如果关系字段还没建立就删除了,也同步删除待建立关联的关系字段\n database.removePendingField(this);\n // 如果关系表内没有显式的创建外键字段,删除关系时,外键也删除掉\n const tcoll = database.collections.get(this.target);\n const foreignKey = this.options.foreignKey;\n const field = tcoll.findField((field) => {\n if (field.name === foreignKey) {\n return true;\n }\n return field.type === 'belongsTo' && field.foreignKey === foreignKey;\n });\n if (!field) {\n tcoll.model.removeAttribute(foreignKey);\n }\n // 删掉 model 的关联字段\n delete collection.model.associations[this.name];\n // @ts-ignore\n collection.model.refreshAttributes();\n }\n}\n\nexport interface HasOneFieldOptions extends BaseRelationFieldOptions, SequelizeHasOneOptions {\n type: 'hasOne';\n}\n"]}
@@ -0,0 +1,40 @@
1
+ import { ArrayFieldOptions } from './array-field';
2
+ import { BelongsToFieldOptions } from './belongs-to-field';
3
+ import { BelongsToManyFieldOptions } from './belongs-to-many-field';
4
+ import { BooleanFieldOptions } from './boolean-field';
5
+ import { ContextFieldOptions } from './context-field';
6
+ import { DateFieldOptions } from './date-field';
7
+ import { BaseFieldOptions } from './field';
8
+ import { HasManyFieldOptions } from './has-many-field';
9
+ import { HasOneFieldOptions } from './has-one-field';
10
+ import { JsonbFieldOptions, JsonFieldOptions } from './json-field';
11
+ import { DecimalFieldOptions, DoubleFieldOptions, FloatFieldOptions, IntegerFieldOptions, RealFieldOptions } from './number-field';
12
+ import { PasswordFieldOptions } from './password-field';
13
+ import { RadioFieldOptions } from './radio-field';
14
+ import { SortFieldOptions } from './sort-field';
15
+ import { StringFieldOptions } from './string-field';
16
+ import { TextFieldOptions } from './text-field';
17
+ import { TimeFieldOptions } from './time-field';
18
+ import { UidFieldOptions } from './uid-field';
19
+ import { VirtualFieldOptions } from './virtual-field';
20
+ export * from './array-field';
21
+ export * from './belongs-to-field';
22
+ export * from './belongs-to-many-field';
23
+ export * from './boolean-field';
24
+ export * from './context-field';
25
+ export * from './date-field';
26
+ export * from './field';
27
+ export * from './has-many-field';
28
+ export * from './has-one-field';
29
+ export * from './json-field';
30
+ export * from './number-field';
31
+ export * from './password-field';
32
+ export * from './radio-field';
33
+ export * from './relation-field';
34
+ export * from './sort-field';
35
+ export * from './string-field';
36
+ export * from './text-field';
37
+ export * from './time-field';
38
+ export * from './uid-field';
39
+ export * from './virtual-field';
40
+ export declare type FieldOptions = BaseFieldOptions | StringFieldOptions | IntegerFieldOptions | FloatFieldOptions | DecimalFieldOptions | DoubleFieldOptions | RealFieldOptions | JsonFieldOptions | JsonbFieldOptions | BooleanFieldOptions | RadioFieldOptions | SortFieldOptions | TextFieldOptions | VirtualFieldOptions | ArrayFieldOptions | TimeFieldOptions | DateFieldOptions | UidFieldOptions | PasswordFieldOptions | ContextFieldOptions | BelongsToFieldOptions | HasOneFieldOptions | HasManyFieldOptions | BelongsToManyFieldOptions;
@@ -0,0 +1,21 @@
1
+ export * from './array-field';
2
+ export * from './belongs-to-field';
3
+ export * from './belongs-to-many-field';
4
+ export * from './boolean-field';
5
+ export * from './context-field';
6
+ export * from './date-field';
7
+ export * from './field';
8
+ export * from './has-many-field';
9
+ export * from './has-one-field';
10
+ export * from './json-field';
11
+ export * from './number-field';
12
+ export * from './password-field';
13
+ export * from './radio-field';
14
+ export * from './relation-field';
15
+ export * from './sort-field';
16
+ export * from './string-field';
17
+ export * from './text-field';
18
+ export * from './time-field';
19
+ export * from './uid-field';
20
+ export * from './virtual-field';
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fields/index.ts"],"names":[],"mappings":"AA0BA,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC","sourcesContent":["import { ArrayFieldOptions } from './array-field';\nimport { BelongsToFieldOptions } from './belongs-to-field';\nimport { BelongsToManyFieldOptions } from './belongs-to-many-field';\nimport { BooleanFieldOptions } from './boolean-field';\nimport { ContextFieldOptions } from './context-field';\nimport { DateFieldOptions } from './date-field';\nimport { BaseFieldOptions } from './field';\nimport { HasManyFieldOptions } from './has-many-field';\nimport { HasOneFieldOptions } from './has-one-field';\nimport { JsonbFieldOptions, JsonFieldOptions } from './json-field';\nimport {\n DecimalFieldOptions,\n DoubleFieldOptions,\n FloatFieldOptions,\n IntegerFieldOptions,\n RealFieldOptions\n} from './number-field';\nimport { PasswordFieldOptions } from './password-field';\nimport { RadioFieldOptions } from './radio-field';\nimport { SortFieldOptions } from './sort-field';\nimport { StringFieldOptions } from './string-field';\nimport { TextFieldOptions } from './text-field';\nimport { TimeFieldOptions } from './time-field';\nimport { UidFieldOptions } from './uid-field';\nimport { VirtualFieldOptions } from './virtual-field';\n\nexport * from './array-field';\nexport * from './belongs-to-field';\nexport * from './belongs-to-many-field';\nexport * from './boolean-field';\nexport * from './context-field';\nexport * from './date-field';\nexport * from './field';\nexport * from './has-many-field';\nexport * from './has-one-field';\nexport * from './json-field';\nexport * from './number-field';\nexport * from './password-field';\nexport * from './radio-field';\nexport * from './relation-field';\nexport * from './sort-field';\nexport * from './string-field';\nexport * from './text-field';\nexport * from './time-field';\nexport * from './uid-field';\nexport * from './virtual-field';\n\nexport type FieldOptions =\n | BaseFieldOptions\n | StringFieldOptions\n | IntegerFieldOptions\n | FloatFieldOptions\n | DecimalFieldOptions\n | DoubleFieldOptions\n | RealFieldOptions\n | JsonFieldOptions\n | JsonbFieldOptions\n | BooleanFieldOptions\n | RadioFieldOptions\n | SortFieldOptions\n | TextFieldOptions\n | VirtualFieldOptions\n | ArrayFieldOptions\n | TimeFieldOptions\n | DateFieldOptions\n | UidFieldOptions\n | PasswordFieldOptions\n | ContextFieldOptions\n | BelongsToFieldOptions\n | HasOneFieldOptions\n | HasManyFieldOptions\n | BelongsToManyFieldOptions;\n"]}
@@ -0,0 +1,14 @@
1
+ import { DataTypes } from 'sequelize';
2
+ import { BaseColumnFieldOptions, Field } from './field';
3
+ export declare class JsonField extends Field {
4
+ get dataType(): DataTypes.AbstractDataTypeConstructor;
5
+ }
6
+ export interface JsonFieldOptions extends BaseColumnFieldOptions {
7
+ type: 'json';
8
+ }
9
+ export declare class JsonbField extends Field {
10
+ get dataType(): DataTypes.AbstractDataTypeConstructor;
11
+ }
12
+ export interface JsonbFieldOptions extends BaseColumnFieldOptions {
13
+ type: 'jsonb';
14
+ }
@@ -0,0 +1,17 @@
1
+ import { DataTypes } from 'sequelize';
2
+ import { Field } from './field';
3
+ export class JsonField extends Field {
4
+ get dataType() {
5
+ return DataTypes.JSON;
6
+ }
7
+ }
8
+ export class JsonbField extends Field {
9
+ get dataType() {
10
+ const dialect = this.context.database.sequelize.getDialect();
11
+ if (dialect === 'postgres') {
12
+ return DataTypes.JSONB;
13
+ }
14
+ return DataTypes.JSON;
15
+ }
16
+ }
17
+ //# sourceMappingURL=json-field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-field.js","sourceRoot":"","sources":["../../src/fields/json-field.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAA0B,KAAK,EAAE,MAAM,SAAS,CAAC;AAExD,MAAM,OAAO,SAAU,SAAQ,KAAK;IAClC,IAAI,QAAQ;QACV,OAAO,SAAS,CAAC,IAAI,CAAC;IACxB,CAAC;CACF;AAMD,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,IAAI,QAAQ;QACV,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;QAC7D,IAAI,OAAO,KAAK,UAAU,EAAE;YAC1B,OAAO,SAAS,CAAC,KAAK,CAAC;SACxB;QACD,OAAO,SAAS,CAAC,IAAI,CAAC;IACxB,CAAC;CACF","sourcesContent":["import { DataTypes } from 'sequelize';\nimport { BaseColumnFieldOptions, Field } from './field';\n\nexport class JsonField extends Field {\n get dataType() {\n return DataTypes.JSON;\n }\n}\n\nexport interface JsonFieldOptions extends BaseColumnFieldOptions {\n type: 'json';\n}\n\nexport class JsonbField extends Field {\n get dataType() {\n const dialect = this.context.database.sequelize.getDialect();\n if (dialect === 'postgres') {\n return DataTypes.JSONB;\n }\n return DataTypes.JSON;\n }\n}\nexport interface JsonbFieldOptions extends BaseColumnFieldOptions {\n type: 'jsonb';\n}\n"]}