@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,58 @@
1
+ import lodash from 'lodash';
2
+
3
+ export function transactionWrapperBuilder(transactionGenerator) {
4
+ return function transaction(transactionInjector?) {
5
+ return (target, name, descriptor) => {
6
+ const oldValue = descriptor.value;
7
+
8
+ descriptor.value = async function () {
9
+ let transaction;
10
+ let newTransaction = false;
11
+
12
+ if (arguments.length > 0 && typeof arguments[0] === 'object') {
13
+ transaction = arguments[0]['transaction'];
14
+ }
15
+
16
+ if (!transaction) {
17
+ transaction = await transactionGenerator.apply(this);
18
+ newTransaction = true;
19
+ }
20
+
21
+ // 需要将 newTransaction 注入到被装饰函数参数内
22
+ if (newTransaction) {
23
+ try {
24
+ let callArguments;
25
+ if (lodash.isPlainObject(arguments[0])) {
26
+ callArguments = {
27
+ ...arguments[0],
28
+ transaction,
29
+ };
30
+ } else if (transactionInjector) {
31
+ callArguments = transactionInjector(arguments, transaction);
32
+ } else if (lodash.isNull(arguments[0]) || lodash.isUndefined(arguments[0])) {
33
+ callArguments = {
34
+ transaction,
35
+ };
36
+ } else {
37
+ throw new Error(`please provide transactionInjector for ${name} call`);
38
+ }
39
+
40
+ const results = await oldValue.apply(this, [callArguments]);
41
+
42
+ await transaction.commit();
43
+
44
+ return results;
45
+ } catch (err) {
46
+ console.error({ err });
47
+ await transaction.rollback();
48
+ throw err;
49
+ }
50
+ } else {
51
+ return oldValue.apply(this, arguments);
52
+ }
53
+ };
54
+
55
+ return descriptor;
56
+ };
57
+ };
58
+ }
@@ -0,0 +1,478 @@
1
+ import {
2
+ Association,
3
+ BelongsTo,
4
+ BelongsToMany,
5
+ HasMany,
6
+ HasOne,
7
+ Hookable,
8
+ ModelCtor,
9
+ Transactionable,
10
+ } from 'sequelize';
11
+ import { Model } from './model';
12
+ import { TransactionAble } from './repository';
13
+ import { UpdateGuard } from './update-guard';
14
+
15
+ function isUndefinedOrNull(value: any) {
16
+ return typeof value === 'undefined' || value === null;
17
+ }
18
+
19
+ function isStringOrNumber(value: any) {
20
+ return typeof value === 'string' || typeof value === 'number';
21
+ }
22
+
23
+ function getKeysByPrefix(keys: string[], prefix: string) {
24
+ return keys.filter((key) => key.startsWith(`${prefix}.`)).map((key) => key.substring(prefix.length + 1));
25
+ }
26
+
27
+ export function modelAssociations(instance: Model) {
28
+ return (<typeof Model>instance.constructor).associations;
29
+ }
30
+
31
+ export function belongsToManyAssociations(instance: Model): Array<BelongsToMany> {
32
+ const associations = modelAssociations(instance);
33
+ return Object.entries(associations)
34
+ .filter((entry) => {
35
+ const [key, association] = entry;
36
+ return association.associationType == 'BelongsToMany';
37
+ })
38
+ .map((association) => {
39
+ return <BelongsToMany>association[1];
40
+ });
41
+ }
42
+
43
+ export function modelAssociationByKey(instance: Model, key: string): Association {
44
+ return modelAssociations(instance)[key] as Association;
45
+ }
46
+
47
+ type UpdateValue = { [key: string]: any };
48
+
49
+ interface UpdateOptions extends TransactionAble {
50
+ filter?: any;
51
+ filterByTk?: number | string;
52
+ // 字段白名单
53
+ whitelist?: string[];
54
+ // 字段黑名单
55
+ blacklist?: string[];
56
+ // 关系数据默认会新建并建立关联处理,如果是已存在的数据只关联,但不更新关系数据
57
+ // 如果需要更新关联数据,可以通过 updateAssociationValues 指定
58
+ updateAssociationValues?: string[];
59
+ sanitized?: boolean;
60
+ sourceModel?: Model;
61
+ }
62
+
63
+ interface UpdateAssociationOptions extends Transactionable, Hookable {
64
+ updateAssociationValues?: string[];
65
+ sourceModel?: Model;
66
+ context?: any;
67
+ associationContext?: any;
68
+ }
69
+
70
+ export async function updateModelByValues(instance: Model, values: UpdateValue, options?: UpdateOptions) {
71
+ if (!options?.sanitized) {
72
+ const guard = new UpdateGuard();
73
+ //@ts-ignore
74
+ guard.setModel(instance.constructor);
75
+ guard.setBlackList(options.blacklist);
76
+ guard.setWhiteList(options.whitelist);
77
+ guard.setAssociationKeysToBeUpdate(options.updateAssociationValues);
78
+ values = guard.sanitize(values);
79
+ }
80
+
81
+ await instance.update(values, options);
82
+ await updateAssociations(instance, values, options);
83
+ }
84
+
85
+ export async function updateThroughTableValue(
86
+ instance: Model,
87
+ throughName: string,
88
+ throughValues: any,
89
+ source: Model,
90
+ transaction = null,
91
+ ) {
92
+ // update through table values
93
+ for (const belongsToMany of belongsToManyAssociations(instance)) {
94
+ // @ts-ignore
95
+ const throughModel = belongsToMany.through.model;
96
+ const throughModelName = throughModel.name;
97
+
98
+ if (throughModelName === throughModelName) {
99
+ const where = {
100
+ [belongsToMany.foreignKey]: instance.get(belongsToMany.sourceKey),
101
+ [belongsToMany.otherKey]: source.get(belongsToMany.targetKey),
102
+ };
103
+
104
+ return await throughModel.update(throughValues, {
105
+ where,
106
+ transaction,
107
+ });
108
+ }
109
+ }
110
+ }
111
+
112
+ /**
113
+ * update association of instance by values
114
+ * @param instance
115
+ * @param values
116
+ * @param options
117
+ */
118
+ export async function updateAssociations(instance: Model, values: any, options: UpdateAssociationOptions = {}) {
119
+ // if no values set, return
120
+ if (!values) {
121
+ return;
122
+ }
123
+
124
+ let newTransaction = false;
125
+ let transaction = options.transaction;
126
+
127
+ if (!transaction) {
128
+ newTransaction = true;
129
+ transaction = await instance.sequelize.transaction();
130
+ }
131
+
132
+ const keys = Object.keys(values);
133
+
134
+ for (const key of Object.keys(modelAssociations(instance))) {
135
+ if (keys.includes(key)) {
136
+ await updateAssociation(instance, key, values[key], {
137
+ ...options,
138
+ transaction,
139
+ });
140
+ }
141
+ }
142
+
143
+ // update through table values
144
+ for (const belongsToMany of belongsToManyAssociations(instance)) {
145
+ // @ts-ignore
146
+ const throughModel = belongsToMany.through.model;
147
+ const throughModelName = throughModel.name;
148
+
149
+ if (values[throughModelName] && options.sourceModel) {
150
+ const where = {
151
+ [belongsToMany.foreignKey]: instance.get(belongsToMany.sourceKey),
152
+ [belongsToMany.otherKey]: options.sourceModel.get(belongsToMany.targetKey),
153
+ };
154
+
155
+ await throughModel.update(values[throughModel.name], {
156
+ where,
157
+ context: options.context,
158
+ transaction,
159
+ });
160
+ }
161
+ }
162
+
163
+ if (newTransaction) {
164
+ await transaction.commit();
165
+ }
166
+ }
167
+
168
+ function isReverseAssociationPair(a: any, b: any) {
169
+ const typeSet = new Set();
170
+ typeSet.add(a.associationType);
171
+ typeSet.add(b.associationType);
172
+
173
+ if (typeSet.size == 1 && typeSet.has('BelongsToMany')) {
174
+ return (
175
+ a.through.tableName === b.through.tableName &&
176
+ a.target.name === b.source.name &&
177
+ b.target.name === a.source.name &&
178
+ a.foreignKey === b.otherKey &&
179
+ a.sourceKey === b.targetKey &&
180
+ a.otherKey === b.foreignKey &&
181
+ a.targetKey === b.sourceKey
182
+ );
183
+ }
184
+
185
+ if ((typeSet.has('HasOne') && typeSet.has('BelongsTo')) || (typeSet.has('HasMany') && typeSet.has('BelongsTo'))) {
186
+ const sourceAssoc = a.associationType == 'BelongsTo' ? b : a;
187
+ const targetAssoc = sourceAssoc == a ? b : a;
188
+
189
+ return (
190
+ sourceAssoc.source.name === targetAssoc.target.name &&
191
+ sourceAssoc.foreignKey === targetAssoc.foreignKey &&
192
+ sourceAssoc.sourceKey === targetAssoc.targetKey
193
+ );
194
+ }
195
+
196
+ return false;
197
+ }
198
+
199
+ /**
200
+ * update model association by key
201
+ * @param instance
202
+ * @param key
203
+ * @param value
204
+ * @param options
205
+ */
206
+ export async function updateAssociation(
207
+ instance: Model,
208
+ key: string,
209
+ value: any,
210
+ options: UpdateAssociationOptions = {},
211
+ ) {
212
+ const association = modelAssociationByKey(instance, key);
213
+
214
+ if (!association) {
215
+ return false;
216
+ }
217
+
218
+ if (options.associationContext && isReverseAssociationPair(association, options.associationContext)) {
219
+ return false;
220
+ }
221
+
222
+ switch (association.associationType) {
223
+ case 'HasOne':
224
+ case 'BelongsTo':
225
+ return updateSingleAssociation(instance, key, value, options);
226
+ case 'HasMany':
227
+ case 'BelongsToMany':
228
+ return updateMultipleAssociation(instance, key, value, options);
229
+ }
230
+ }
231
+
232
+ /**
233
+ * update belongsTo and HasOne
234
+ * @param model
235
+ * @param key
236
+ * @param value
237
+ * @param options
238
+ */
239
+ export async function updateSingleAssociation(
240
+ model: Model,
241
+ key: string,
242
+ value: any,
243
+ options: UpdateAssociationOptions = {},
244
+ ) {
245
+ const association = <HasOne | BelongsTo>modelAssociationByKey(model, key);
246
+
247
+ if (!association) {
248
+ return false;
249
+ }
250
+
251
+ if (!['undefined', 'string', 'number', 'object'].includes(typeof value)) {
252
+ return false;
253
+ }
254
+
255
+ const { context, updateAssociationValues = [], transaction = await model.sequelize.transaction() } = options;
256
+ const keys = getKeysByPrefix(updateAssociationValues, key);
257
+
258
+ try {
259
+ // set method of association
260
+ const setAccessor = association.accessors.set;
261
+
262
+ const removeAssociation = async () => {
263
+ await model[setAccessor](null, { transaction });
264
+ model.setDataValue(key, null);
265
+ if (!options.transaction) {
266
+ await transaction.commit();
267
+ }
268
+ return true;
269
+ };
270
+
271
+ if (isUndefinedOrNull(value)) {
272
+ return await removeAssociation();
273
+ }
274
+
275
+ if (isStringOrNumber(value)) {
276
+ await model[setAccessor](value, { context, transaction });
277
+ if (!options.transaction) {
278
+ await transaction.commit();
279
+ }
280
+ return true;
281
+ }
282
+
283
+ if (value instanceof Model) {
284
+ await model[setAccessor](value, { context, transaction });
285
+ model.setDataValue(key, value);
286
+
287
+ if (!options.transaction) {
288
+ await transaction.commit();
289
+ }
290
+ return true;
291
+ }
292
+
293
+ const createAccessor = association.accessors.create;
294
+ let dataKey: string;
295
+ let M: ModelCtor<Model>;
296
+ if (association.associationType === 'BelongsTo') {
297
+ M = association.target as ModelCtor<Model>;
298
+ // @ts-ignore
299
+ dataKey = association.targetKey;
300
+ } else {
301
+ M = association.source as ModelCtor<Model>;
302
+ dataKey = M.primaryKeyAttribute;
303
+ }
304
+
305
+ if (isStringOrNumber(value[dataKey])) {
306
+ let instance: any = await M.findOne({
307
+ where: {
308
+ [dataKey]: value[dataKey],
309
+ },
310
+ transaction,
311
+ });
312
+
313
+ if (instance) {
314
+ await model[setAccessor](instance, { context, transaction });
315
+
316
+ if (updateAssociationValues.includes(key)) {
317
+ await instance.update(value, { ...options, transaction });
318
+ }
319
+
320
+ await updateAssociations(instance, value, {
321
+ ...options,
322
+ transaction,
323
+ associationContext: association,
324
+ updateAssociationValues: keys,
325
+ });
326
+ model.setDataValue(key, instance);
327
+ if (!options.transaction) {
328
+ await transaction.commit();
329
+ }
330
+ return true;
331
+ }
332
+ }
333
+
334
+ const instance = await model[createAccessor](value, { context, transaction });
335
+ await updateAssociations(instance, value, {
336
+ ...options,
337
+ transaction,
338
+ associationContext: association,
339
+ updateAssociationValues: keys,
340
+ });
341
+ model.setDataValue(key, instance);
342
+ // @ts-ignore
343
+ if (association.targetKey) {
344
+ model.setDataValue(association.foreignKey, instance[dataKey]);
345
+ }
346
+ if (!options.transaction) {
347
+ await transaction.commit();
348
+ }
349
+ } catch (error) {
350
+ if (!options.transaction) {
351
+ await transaction.rollback();
352
+ }
353
+ throw error;
354
+ }
355
+ }
356
+
357
+ /**
358
+ * update multiple association of model by value
359
+ * @param model
360
+ * @param key
361
+ * @param value
362
+ * @param options
363
+ */
364
+ export async function updateMultipleAssociation(
365
+ model: Model,
366
+ key: string,
367
+ value: any,
368
+ options: UpdateAssociationOptions = {},
369
+ ) {
370
+ const association = <BelongsToMany | HasMany>modelAssociationByKey(model, key);
371
+
372
+ if (!association) {
373
+ return false;
374
+ }
375
+
376
+ if (!['undefined', 'string', 'number', 'object'].includes(typeof value)) {
377
+ return false;
378
+ }
379
+
380
+ const { context, updateAssociationValues = [], transaction = await model.sequelize.transaction() } = options;
381
+ const keys = getKeysByPrefix(updateAssociationValues, key);
382
+
383
+ try {
384
+ const setAccessor = association.accessors.set;
385
+
386
+ const createAccessor = association.accessors.create;
387
+ if (isUndefinedOrNull(value)) {
388
+ await model[setAccessor](null, { transaction, context });
389
+ model.setDataValue(key, null);
390
+ return;
391
+ }
392
+
393
+ if (isStringOrNumber(value)) {
394
+ await model[setAccessor](value, { transaction, context });
395
+ return;
396
+ }
397
+
398
+ if (!Array.isArray(value)) {
399
+ value = [value];
400
+ }
401
+
402
+ const list1 = []; // to be setted
403
+ const list2 = []; // to be added
404
+ for (const item of value) {
405
+ if (isUndefinedOrNull(item)) {
406
+ continue;
407
+ }
408
+ if (isStringOrNumber(item)) {
409
+ list1.push(item);
410
+ } else if (item instanceof Model) {
411
+ list1.push(item);
412
+ } else if (item.sequelize) {
413
+ list1.push(item);
414
+ } else if (typeof item === 'object') {
415
+ list2.push(item);
416
+ }
417
+ }
418
+
419
+ // associate targets in lists1
420
+ await model[setAccessor](list1, { transaction, context });
421
+
422
+ const list3 = [];
423
+ for (const item of list2) {
424
+ const pk = association.target.primaryKeyAttribute;
425
+
426
+ const through = (<any>association).through ? (<any>association).through.model.name : null;
427
+
428
+ const accessorOptions = {
429
+ context,
430
+ transaction,
431
+ };
432
+
433
+ const throughValue = item[through];
434
+
435
+ if (throughValue) {
436
+ accessorOptions['through'] = throughValue;
437
+ }
438
+
439
+ if (isUndefinedOrNull(item[pk])) {
440
+ // create new record
441
+ const instance = await model[createAccessor](item, accessorOptions);
442
+ await updateAssociations(instance, item, {
443
+ ...options,
444
+ transaction,
445
+ associationContext: association,
446
+ updateAssociationValues: keys,
447
+ });
448
+ list3.push(instance);
449
+ } else {
450
+ // set & update record
451
+ const instance = await association.target.findByPk<any>(item[pk], {
452
+ transaction,
453
+ });
454
+ const addAccessor = association.accessors.add;
455
+
456
+ await model[addAccessor](item[pk], accessorOptions);
457
+ if (updateAssociationValues.includes(key)) {
458
+ await instance.update(item, { ...options, transaction });
459
+ }
460
+ await updateAssociations(instance, item, {
461
+ ...options,
462
+ transaction,
463
+ associationContext: association,
464
+ updateAssociationValues: keys,
465
+ });
466
+ list3.push(instance);
467
+ }
468
+ }
469
+
470
+ model.setDataValue(key, list1.concat(list3));
471
+ if (!options.transaction) {
472
+ await transaction.commit();
473
+ }
474
+ } catch (error) {
475
+ await transaction.rollback();
476
+ throw error;
477
+ }
478
+ }
@@ -0,0 +1,167 @@
1
+ import lodash from 'lodash';
2
+ import { ModelCtor } from 'sequelize';
3
+ import { Model } from './model';
4
+ import { AssociationKeysToBeUpdate, BlackList, WhiteList } from './repository';
5
+
6
+ type UpdateValueItem = string | number | UpdateValues;
7
+
8
+ type UpdateValues = {
9
+ [key: string]: UpdateValueItem | Array<UpdateValueItem>;
10
+ };
11
+
12
+ type UpdateAction = 'create' | 'update';
13
+ export class UpdateGuard {
14
+ model: ModelCtor<any>;
15
+ action: UpdateAction;
16
+ private associationKeysToBeUpdate: AssociationKeysToBeUpdate;
17
+ private blackList: BlackList;
18
+ private whiteList: WhiteList;
19
+
20
+ setAction(action: UpdateAction) {
21
+ this.action = action;
22
+ }
23
+
24
+ setModel(model: ModelCtor<any>) {
25
+ this.model = model;
26
+ }
27
+
28
+ setAssociationKeysToBeUpdate(associationKeysToBeUpdate: AssociationKeysToBeUpdate) {
29
+ if (this.action == 'create') {
30
+ this.associationKeysToBeUpdate = Object.keys(this.model.associations);
31
+ } else {
32
+ this.associationKeysToBeUpdate = associationKeysToBeUpdate;
33
+ }
34
+ }
35
+
36
+ setWhiteList(whiteList: WhiteList) {
37
+ this.whiteList = whiteList;
38
+ }
39
+
40
+ setBlackList(blackList: BlackList) {
41
+ this.blackList = blackList;
42
+ }
43
+
44
+ /**
45
+ * Sanitize values by whitelist blacklist
46
+ * @param values
47
+ */
48
+ sanitize(values: UpdateValues) {
49
+ values = lodash.clone(values);
50
+
51
+ if (!this.model) {
52
+ throw new Error('please set model first');
53
+ }
54
+
55
+ const associations = this.model.associations;
56
+ const associationsValues = lodash.pick(values, Object.keys(associations));
57
+
58
+ // build params of association update guard
59
+ const listOfAssociation = (list, association) => {
60
+ if (list) {
61
+ list = list
62
+ .filter((whiteListKey) => whiteListKey.startsWith(`${association}.`))
63
+ .map((whiteListKey) => whiteListKey.replace(`${association}.`, ''));
64
+
65
+ if (list.length == 0) {
66
+ return undefined;
67
+ }
68
+
69
+ return list;
70
+ }
71
+
72
+ return undefined;
73
+ };
74
+
75
+ // sanitize association values
76
+ Object.keys(associationsValues).forEach((association) => {
77
+ let associationValues = associationsValues[association];
78
+
79
+ const filterAssociationToBeUpdate = (value) => {
80
+ const associationKeysToBeUpdate = this.associationKeysToBeUpdate || [];
81
+
82
+ if (associationKeysToBeUpdate.includes(association)) {
83
+ return value;
84
+ }
85
+
86
+ const associationObj = associations[association];
87
+
88
+ const associationKeyName =
89
+ associationObj.associationType == 'BelongsTo' || associationObj.associationType == 'HasOne'
90
+ ? (<any>associationObj).targetKey
91
+ : associationObj.target.primaryKeyAttribute;
92
+
93
+ if (value[associationKeyName]) {
94
+ return lodash.pick(value, [associationKeyName, ...Object.keys(associationObj.target.associations)]);
95
+ }
96
+
97
+ return value;
98
+ };
99
+
100
+ const sanitizeValue = (value) => {
101
+ const associationUpdateGuard = new UpdateGuard();
102
+ associationUpdateGuard.setModel(associations[association].target);
103
+
104
+ ['whiteList', 'blackList', 'associationKeysToBeUpdate'].forEach((optionKey) => {
105
+ associationUpdateGuard[`set${lodash.upperFirst(optionKey)}`](listOfAssociation(this[optionKey], association));
106
+ });
107
+
108
+ return associationUpdateGuard.sanitize(filterAssociationToBeUpdate(value));
109
+ };
110
+
111
+ if (Array.isArray(associationValues)) {
112
+ associationValues = associationValues.map((value) => {
113
+ if (typeof value == 'string' || typeof value == 'number') {
114
+ return value;
115
+ } else {
116
+ return sanitizeValue(value);
117
+ }
118
+ });
119
+ } else if (typeof associationValues === 'object' && associationValues !== null) {
120
+ associationValues = sanitizeValue(associationValues);
121
+ }
122
+
123
+ // set association values to sanitized value
124
+ values[association] = associationValues;
125
+ });
126
+
127
+ if (values instanceof Model) {
128
+ return values;
129
+ }
130
+
131
+ let valuesKeys = Object.keys(values || {});
132
+
133
+ // handle whitelist
134
+ if (this.whiteList) {
135
+ valuesKeys = valuesKeys.filter((valueKey) => {
136
+ return (
137
+ this.whiteList.findIndex((whiteKey) => {
138
+ const keyPaths = whiteKey.split('.');
139
+ return keyPaths[0] === valueKey;
140
+ }) !== -1
141
+ );
142
+ });
143
+ }
144
+
145
+ // handle blacklist
146
+ if (this.blackList) {
147
+ valuesKeys = valuesKeys.filter((valueKey) => !this.blackList.includes(valueKey));
148
+ }
149
+
150
+ const result = valuesKeys.reduce((obj, key) => {
151
+ lodash.set(obj, key, values[key]);
152
+ return obj;
153
+ }, {});
154
+
155
+ return result;
156
+ }
157
+
158
+ static fromOptions(model, options) {
159
+ const guard = new UpdateGuard();
160
+ guard.setModel(model);
161
+ guard.setWhiteList(options.whitelist);
162
+ guard.setBlackList(options.blacklist);
163
+ guard.setAction(lodash.get(options, 'action', 'update'));
164
+ guard.setAssociationKeysToBeUpdate(options.updateAssociationValues);
165
+ return guard;
166
+ }
167
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "extends": "../../../tsconfig.build.json",
3
+ "compilerOptions": {
4
+ "outDir": "./lib",
5
+ "declaration": true
6
+ },
7
+ "include": ["./src/**/*.ts", "./src/**/*.tsx"],
8
+ "exclude": ["./src/__tests__/*", "./esm/*", "./lib/*"]
9
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,5 @@
1
+ {
2
+ "extends": "../../../tsconfig.json",
3
+ "include": ["./src/**/*.ts", "./src/**/*.tsx"],
4
+ "exclude": ["./esm/*", "./lib/*"]
5
+ }