@nocobase/database 0.7.0-alpha.9 → 0.7.1-alpha.6

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 (325) hide show
  1. package/lib/collection-importer.js +85 -68
  2. package/lib/collection.d.ts +6 -2
  3. package/lib/collection.js +371 -210
  4. package/lib/database.d.ts +23 -4
  5. package/lib/database.js +599 -273
  6. package/lib/fields/array-field.js +45 -25
  7. package/lib/fields/belongs-to-field.js +101 -54
  8. package/lib/fields/belongs-to-many-field.js +98 -53
  9. package/lib/fields/boolean-field.js +24 -9
  10. package/lib/fields/context-field.js +77 -45
  11. package/lib/fields/date-field.js +24 -9
  12. package/lib/fields/field.d.ts +4 -1
  13. package/lib/fields/field.js +231 -75
  14. package/lib/fields/formula-field.d.ts +19 -0
  15. package/lib/fields/formula-field.js +184 -0
  16. package/lib/fields/has-inverse-field.js +4 -2
  17. package/lib/fields/has-many-field.js +105 -56
  18. package/lib/fields/has-one-field.js +105 -54
  19. package/lib/fields/index.d.ts +5 -1
  20. package/lib/fields/index.js +290 -32
  21. package/lib/fields/json-field.js +36 -16
  22. package/lib/fields/number-field.js +53 -26
  23. package/lib/fields/password-field.js +120 -73
  24. package/lib/fields/radio-field.js +75 -47
  25. package/lib/fields/relation-field.js +41 -28
  26. package/lib/fields/sort-field.js +165 -89
  27. package/lib/fields/string-field.js +24 -9
  28. package/lib/fields/text-field.js +24 -9
  29. package/lib/fields/time-field.js +24 -9
  30. package/lib/fields/uid-field.js +57 -28
  31. package/lib/fields/uuid-field.d.ts +9 -0
  32. package/lib/fields/uuid-field.js +39 -0
  33. package/lib/fields/virtual-field.js +24 -9
  34. package/lib/filter-parser.js +288 -179
  35. package/lib/index.d.ts +1 -0
  36. package/lib/index.js +224 -29
  37. package/lib/magic-attribute-model.js +123 -71
  38. package/lib/migration.d.ts +35 -0
  39. package/lib/migration.js +90 -0
  40. package/lib/mock-database.d.ts +1 -0
  41. package/lib/mock-database.js +69 -34
  42. package/lib/model-hook.d.ts +5 -5
  43. package/lib/model-hook.js +109 -60
  44. package/lib/model.js +116 -81
  45. package/lib/operators/array.js +136 -96
  46. package/lib/operators/association.js +30 -14
  47. package/lib/operators/boolean.d.ts +13 -0
  48. package/lib/operators/boolean.js +35 -0
  49. package/lib/operators/date.js +78 -34
  50. package/lib/operators/empty.js +113 -75
  51. package/lib/operators/index.js +15 -3
  52. package/lib/operators/ne.js +27 -12
  53. package/{esm/operators/ne.d.ts → lib/operators/notIn.d.ts} +2 -2
  54. package/lib/operators/notIn.js +29 -0
  55. package/lib/operators/string.js +56 -35
  56. package/lib/operators/utils.js +18 -10
  57. package/lib/options-parser.js +345 -215
  58. package/lib/playground.js +66 -53
  59. package/lib/relation-repository/belongs-to-many-repository.js +281 -198
  60. package/lib/relation-repository/belongs-to-repository.js +10 -6
  61. package/lib/relation-repository/hasmany-repository.js +168 -121
  62. package/lib/relation-repository/hasone-repository.js +10 -6
  63. package/lib/relation-repository/multiple-relation-repository.d.ts +3 -3
  64. package/lib/relation-repository/multiple-relation-repository.js +263 -148
  65. package/lib/relation-repository/relation-repository.d.ts +1 -1
  66. package/lib/relation-repository/relation-repository.js +163 -93
  67. package/lib/relation-repository/single-relation-repository.d.ts +6 -6
  68. package/lib/relation-repository/single-relation-repository.js +145 -99
  69. package/lib/relation-repository/types.js +4 -2
  70. package/lib/repository.d.ts +4 -7
  71. package/lib/repository.js +473 -291
  72. package/lib/transaction-decorator.js +80 -67
  73. package/lib/update-associations.d.ts +1 -2
  74. package/lib/update-associations.js +525 -321
  75. package/lib/update-guard.js +160 -117
  76. package/package.json +9 -9
  77. package/src/__tests__/collection.test.ts +27 -0
  78. package/src/__tests__/database.test.ts +47 -0
  79. package/src/__tests__/fields/formula-field.test.ts +69 -0
  80. package/src/__tests__/fields/uuid-field.test.ts +30 -0
  81. package/src/__tests__/fixtures/migrations/m1.ts +7 -0
  82. package/src/__tests__/fixtures/migrations/m2.ts +7 -0
  83. package/src/__tests__/hooks/afterCreateWithAssociations.test.ts +33 -0
  84. package/src/__tests__/migrator.test.ts +70 -0
  85. package/src/__tests__/model-hook.test.ts +54 -0
  86. package/src/__tests__/operator/notIn.test.ts +33 -0
  87. package/src/__tests__/option-parser.test.ts +30 -6
  88. package/src/__tests__/relation-repository/belongs-to-many-repository.test.ts +1 -1
  89. package/src/__tests__/sequelize-hooks.test.ts +69 -0
  90. package/src/__tests__/sort.test.ts +51 -0
  91. package/src/__tests__/update-associations.test.ts +3 -3
  92. package/src/collection-importer.ts +12 -20
  93. package/src/collection.ts +26 -2
  94. package/src/database.ts +144 -14
  95. package/src/fields/field.ts +88 -1
  96. package/src/fields/formula-field.ts +106 -0
  97. package/src/fields/index.ts +6 -0
  98. package/src/fields/password-field.ts +2 -0
  99. package/src/fields/uuid-field.ts +21 -0
  100. package/src/index.ts +1 -0
  101. package/src/migration.ts +76 -0
  102. package/src/mock-database.ts +2 -1
  103. package/src/model-hook.ts +26 -22
  104. package/src/operators/boolean.ts +18 -0
  105. package/src/operators/index.ts +2 -0
  106. package/src/operators/notIn.ts +12 -0
  107. package/src/options-parser.ts +14 -10
  108. package/src/relation-repository/multiple-relation-repository.ts +14 -6
  109. package/src/relation-repository/relation-repository.ts +12 -6
  110. package/src/relation-repository/single-relation-repository.ts +11 -7
  111. package/src/repository.ts +20 -10
  112. package/src/update-associations.ts +2 -3
  113. package/esm/collection-importer.d.ts +0 -7
  114. package/esm/collection-importer.js +0 -49
  115. package/esm/collection-importer.js.map +0 -1
  116. package/esm/collection.d.ts +0 -73
  117. package/esm/collection.js +0 -224
  118. package/esm/collection.js.map +0 -1
  119. package/esm/database.d.ts +0 -101
  120. package/esm/database.js +0 -275
  121. package/esm/database.js.map +0 -1
  122. package/esm/fields/array-field.d.ts +0 -11
  123. package/esm/fields/array-field.js +0 -26
  124. package/esm/fields/array-field.js.map +0 -1
  125. package/esm/fields/belongs-to-field.d.ts +0 -12
  126. package/esm/fields/belongs-to-field.js +0 -57
  127. package/esm/fields/belongs-to-field.js.map +0 -1
  128. package/esm/fields/belongs-to-many-field.d.ts +0 -11
  129. package/esm/fields/belongs-to-many-field.js +0 -55
  130. package/esm/fields/belongs-to-many-field.js.map +0 -1
  131. package/esm/fields/boolean-field.d.ts +0 -8
  132. package/esm/fields/boolean-field.js +0 -8
  133. package/esm/fields/boolean-field.js.map +0 -1
  134. package/esm/fields/context-field.d.ts +0 -13
  135. package/esm/fields/context-field.js +0 -43
  136. package/esm/fields/context-field.js.map +0 -1
  137. package/esm/fields/date-field.d.ts +0 -8
  138. package/esm/fields/date-field.js +0 -8
  139. package/esm/fields/date-field.js.map +0 -1
  140. package/esm/fields/field.d.ts +0 -37
  141. package/esm/fields/field.js +0 -74
  142. package/esm/fields/field.js.map +0 -1
  143. package/esm/fields/has-inverse-field.d.ts +0 -4
  144. package/esm/fields/has-inverse-field.js +0 -2
  145. package/esm/fields/has-inverse-field.js.map +0 -1
  146. package/esm/fields/has-many-field.d.ts +0 -64
  147. package/esm/fields/has-many-field.js +0 -58
  148. package/esm/fields/has-many-field.js.map +0 -1
  149. package/esm/fields/has-one-field.d.ts +0 -64
  150. package/esm/fields/has-one-field.js +0 -57
  151. package/esm/fields/has-one-field.js.map +0 -1
  152. package/esm/fields/index.d.ts +0 -40
  153. package/esm/fields/index.js +0 -21
  154. package/esm/fields/index.js.map +0 -1
  155. package/esm/fields/json-field.d.ts +0 -14
  156. package/esm/fields/json-field.js +0 -17
  157. package/esm/fields/json-field.js.map +0 -1
  158. package/esm/fields/number-field.d.ts +0 -32
  159. package/esm/fields/number-field.js +0 -28
  160. package/esm/fields/number-field.js.map +0 -1
  161. package/esm/fields/password-field.d.ts +0 -21
  162. package/esm/fields/password-field.js +0 -71
  163. package/esm/fields/password-field.js.map +0 -1
  164. package/esm/fields/radio-field.d.ts +0 -14
  165. package/esm/fields/radio-field.js +0 -49
  166. package/esm/fields/radio-field.js.map +0 -1
  167. package/esm/fields/relation-field.d.ts +0 -20
  168. package/esm/fields/relation-field.js +0 -27
  169. package/esm/fields/relation-field.js.map +0 -1
  170. package/esm/fields/sort-field.d.ts +0 -16
  171. package/esm/fields/sort-field.js +0 -90
  172. package/esm/fields/sort-field.js.map +0 -1
  173. package/esm/fields/string-field.d.ts +0 -8
  174. package/esm/fields/string-field.js +0 -8
  175. package/esm/fields/string-field.js.map +0 -1
  176. package/esm/fields/text-field.d.ts +0 -8
  177. package/esm/fields/text-field.js +0 -8
  178. package/esm/fields/text-field.js.map +0 -1
  179. package/esm/fields/time-field.d.ts +0 -8
  180. package/esm/fields/time-field.js +0 -8
  181. package/esm/fields/time-field.js.map +0 -1
  182. package/esm/fields/uid-field.d.ts +0 -10
  183. package/esm/fields/uid-field.js +0 -27
  184. package/esm/fields/uid-field.js.map +0 -1
  185. package/esm/fields/virtual-field.d.ts +0 -8
  186. package/esm/fields/virtual-field.js +0 -8
  187. package/esm/fields/virtual-field.js.map +0 -1
  188. package/esm/filter-parser.d.ts +0 -27
  189. package/esm/filter-parser.js +0 -185
  190. package/esm/filter-parser.js.map +0 -1
  191. package/esm/index.d.ts +0 -15
  192. package/esm/index.js +0 -16
  193. package/esm/index.js.map +0 -1
  194. package/esm/magic-attribute-model.d.ts +0 -7
  195. package/esm/magic-attribute-model.js +0 -70
  196. package/esm/magic-attribute-model.js.map +0 -1
  197. package/esm/mock-database.d.ts +0 -22
  198. package/esm/mock-database.js +0 -34
  199. package/esm/mock-database.js.map +0 -1
  200. package/esm/model-hook.d.ts +0 -12
  201. package/esm/model-hook.js +0 -61
  202. package/esm/model-hook.js.map +0 -1
  203. package/esm/model.d.ts +0 -15
  204. package/esm/model.js +0 -80
  205. package/esm/model.js.map +0 -1
  206. package/esm/operators/array.d.ts +0 -26
  207. package/esm/operators/array.js +0 -105
  208. package/esm/operators/array.js.map +0 -1
  209. package/esm/operators/association.d.ts +0 -10
  210. package/esm/operators/association.js +0 -14
  211. package/esm/operators/association.js.map +0 -1
  212. package/esm/operators/date.d.ts +0 -34
  213. package/esm/operators/date.js +0 -35
  214. package/esm/operators/date.js.map +0 -1
  215. package/esm/operators/empty.d.ts +0 -28
  216. package/esm/operators/empty.js +0 -58
  217. package/esm/operators/empty.js.map +0 -1
  218. package/esm/operators/index.d.ts +0 -2
  219. package/esm/operators/index.js +0 -2
  220. package/esm/operators/index.js.map +0 -1
  221. package/esm/operators/ne.js +0 -12
  222. package/esm/operators/ne.js.map +0 -1
  223. package/esm/operators/string.d.ts +0 -21
  224. package/esm/operators/string.js +0 -35
  225. package/esm/operators/string.js.map +0 -1
  226. package/esm/operators/utils.d.ts +0 -4
  227. package/esm/operators/utils.js +0 -11
  228. package/esm/operators/utils.js.map +0 -1
  229. package/esm/options-parser.d.ts +0 -31
  230. package/esm/options-parser.js +0 -225
  231. package/esm/options-parser.js.map +0 -1
  232. package/esm/playground.d.ts +0 -1
  233. package/esm/playground.js +0 -53
  234. package/esm/playground.js.map +0 -1
  235. package/esm/relation-repository/belongs-to-many-repository.d.ts +0 -36
  236. package/esm/relation-repository/belongs-to-many-repository.js +0 -199
  237. package/esm/relation-repository/belongs-to-many-repository.js.map +0 -1
  238. package/esm/relation-repository/belongs-to-repository.d.ts +0 -17
  239. package/esm/relation-repository/belongs-to-repository.js +0 -4
  240. package/esm/relation-repository/belongs-to-repository.js.map +0 -1
  241. package/esm/relation-repository/hasmany-repository.d.ts +0 -23
  242. package/esm/relation-repository/hasmany-repository.js +0 -125
  243. package/esm/relation-repository/hasmany-repository.js.map +0 -1
  244. package/esm/relation-repository/hasone-repository.d.ts +0 -17
  245. package/esm/relation-repository/hasone-repository.js +0 -4
  246. package/esm/relation-repository/hasone-repository.js.map +0 -1
  247. package/esm/relation-repository/multiple-relation-repository.d.ts +0 -23
  248. package/esm/relation-repository/multiple-relation-repository.js +0 -149
  249. package/esm/relation-repository/multiple-relation-repository.js.map +0 -1
  250. package/esm/relation-repository/relation-repository.d.ts +0 -32
  251. package/esm/relation-repository/relation-repository.js +0 -93
  252. package/esm/relation-repository/relation-repository.js.map +0 -1
  253. package/esm/relation-repository/single-relation-repository.d.ts +0 -23
  254. package/esm/relation-repository/single-relation-repository.js +0 -96
  255. package/esm/relation-repository/single-relation-repository.js.map +0 -1
  256. package/esm/relation-repository/types.d.ts +0 -7
  257. package/esm/relation-repository/types.js +0 -2
  258. package/esm/relation-repository/types.js.map +0 -1
  259. package/esm/repository.d.ts +0 -165
  260. package/esm/repository.js +0 -276
  261. package/esm/repository.js.map +0 -1
  262. package/esm/transaction-decorator.d.ts +0 -1
  263. package/esm/transaction-decorator.js +0 -63
  264. package/esm/transaction-decorator.js.map +0 -1
  265. package/esm/update-associations.d.ts +0 -60
  266. package/esm/update-associations.js +0 -362
  267. package/esm/update-associations.js.map +0 -1
  268. package/esm/update-guard.d.ts +0 -26
  269. package/esm/update-guard.js +0 -122
  270. package/esm/update-guard.js.map +0 -1
  271. package/lib/collection-importer.js.map +0 -1
  272. package/lib/collection.js.map +0 -1
  273. package/lib/database.js.map +0 -1
  274. package/lib/fields/array-field.js.map +0 -1
  275. package/lib/fields/belongs-to-field.js.map +0 -1
  276. package/lib/fields/belongs-to-many-field.js.map +0 -1
  277. package/lib/fields/boolean-field.js.map +0 -1
  278. package/lib/fields/context-field.js.map +0 -1
  279. package/lib/fields/date-field.js.map +0 -1
  280. package/lib/fields/field.js.map +0 -1
  281. package/lib/fields/has-inverse-field.js.map +0 -1
  282. package/lib/fields/has-many-field.js.map +0 -1
  283. package/lib/fields/has-one-field.js.map +0 -1
  284. package/lib/fields/index.js.map +0 -1
  285. package/lib/fields/json-field.js.map +0 -1
  286. package/lib/fields/number-field.js.map +0 -1
  287. package/lib/fields/password-field.js.map +0 -1
  288. package/lib/fields/radio-field.js.map +0 -1
  289. package/lib/fields/relation-field.js.map +0 -1
  290. package/lib/fields/sort-field.js.map +0 -1
  291. package/lib/fields/string-field.js.map +0 -1
  292. package/lib/fields/text-field.js.map +0 -1
  293. package/lib/fields/time-field.js.map +0 -1
  294. package/lib/fields/uid-field.js.map +0 -1
  295. package/lib/fields/virtual-field.js.map +0 -1
  296. package/lib/filter-parser.js.map +0 -1
  297. package/lib/index.js.map +0 -1
  298. package/lib/magic-attribute-model.js.map +0 -1
  299. package/lib/mock-database.js.map +0 -1
  300. package/lib/model-hook.js.map +0 -1
  301. package/lib/model.js.map +0 -1
  302. package/lib/operators/array.js.map +0 -1
  303. package/lib/operators/association.js.map +0 -1
  304. package/lib/operators/date.js.map +0 -1
  305. package/lib/operators/empty.js.map +0 -1
  306. package/lib/operators/index.js.map +0 -1
  307. package/lib/operators/ne.js.map +0 -1
  308. package/lib/operators/string.js.map +0 -1
  309. package/lib/operators/utils.js.map +0 -1
  310. package/lib/options-parser.js.map +0 -1
  311. package/lib/playground.js.map +0 -1
  312. package/lib/relation-repository/belongs-to-many-repository.js.map +0 -1
  313. package/lib/relation-repository/belongs-to-repository.js.map +0 -1
  314. package/lib/relation-repository/hasmany-repository.js.map +0 -1
  315. package/lib/relation-repository/hasone-repository.js.map +0 -1
  316. package/lib/relation-repository/multiple-relation-repository.js.map +0 -1
  317. package/lib/relation-repository/relation-repository.js.map +0 -1
  318. package/lib/relation-repository/single-relation-repository.js.map +0 -1
  319. package/lib/relation-repository/types.js.map +0 -1
  320. package/lib/repository.js.map +0 -1
  321. package/lib/transaction-decorator.js.map +0 -1
  322. package/lib/update-associations.js.map +0 -1
  323. package/lib/update-guard.js.map +0 -1
  324. package/tsconfig.build.json +0 -9
  325. package/tsconfig.json +0 -5
@@ -1,185 +0,0 @@
1
- import { flatten, unflatten } from 'flat';
2
- import { default as lodash, default as _ } from 'lodash';
3
- const debug = require('debug')('noco-database');
4
- export default class FilterParser {
5
- constructor(filter, context) {
6
- const { collection } = context;
7
- this.collection = collection;
8
- this.context = context;
9
- this.model = collection.model;
10
- this.filter = this.prepareFilter(filter);
11
- this.database = collection.context.database;
12
- }
13
- prepareFilter(filter) {
14
- if (lodash.isPlainObject(filter)) {
15
- const renamedKey = {};
16
- for (const key of Object.keys(filter)) {
17
- if (key.endsWith('.$exists') || key.endsWith('.$notExists')) {
18
- const keyArr = key.split('.');
19
- if (keyArr[keyArr.length - 2] == 'id') {
20
- continue;
21
- }
22
- keyArr.splice(keyArr.length - 1, 0, 'id');
23
- renamedKey[key] = keyArr.join('.');
24
- }
25
- }
26
- for (const [oldKey, newKey] of Object.entries(renamedKey)) {
27
- // @ts-ignore
28
- filter[newKey] = filter[oldKey];
29
- delete filter[oldKey];
30
- }
31
- }
32
- return filter;
33
- }
34
- toSequelizeParams() {
35
- debug('filter %o', this.filter);
36
- if (!this.filter) {
37
- return {};
38
- }
39
- const filter = this.filter;
40
- const model = this.model;
41
- // supported operators
42
- const operators = this.database.operators;
43
- const originalFiler = lodash.cloneDeep(filter || {});
44
- const flattenedFilter = flatten(filter || {});
45
- debug('flattened filter %o', flattenedFilter);
46
- const include = {};
47
- const where = {};
48
- const filter2 = lodash.cloneDeep(flattenedFilter);
49
- let skipPrefix = null;
50
- const associations = model.associations;
51
- debug('associations %O', associations);
52
- for (let [key, value] of Object.entries(flattenedFilter)) {
53
- // 处理 filter 条件
54
- if (skipPrefix && key.startsWith(skipPrefix)) {
55
- continue;
56
- }
57
- debug('handle filter key "%s: "%s"', key, value);
58
- let keys = key.split('.');
59
- // paths ?
60
- const paths = [];
61
- // origins ?
62
- const origins = [];
63
- while (keys.length) {
64
- debug('keys: %o, paths: %o, origins: %o', keys, paths, origins);
65
- // move key from keys to origins
66
- const firstKey = keys.shift();
67
- origins.push(firstKey);
68
- debug('origins: %o', origins);
69
- if (firstKey.startsWith('$')) {
70
- if (operators.has(firstKey)) {
71
- debug('%s is operator', firstKey);
72
- // if firstKey is operator
73
- const opKey = operators.get(firstKey);
74
- debug('operator key %s, operator: %o', firstKey, opKey);
75
- // 默认操作符
76
- if (typeof opKey === 'symbol') {
77
- paths.push(opKey);
78
- continue;
79
- }
80
- else if (typeof opKey === 'function') {
81
- skipPrefix = origins.join('.');
82
- const queryValue = lodash.get(unflatten(originalFiler), skipPrefix);
83
- value = opKey(queryValue, {
84
- app: this.context.app,
85
- db: this.database,
86
- path: skipPrefix,
87
- fieldName: this.getFieldNameFromQueryPath(skipPrefix),
88
- model: this.model,
89
- });
90
- break;
91
- }
92
- }
93
- else {
94
- paths.push(firstKey);
95
- continue;
96
- }
97
- }
98
- // firstKey is number
99
- if (!lodash.isNaN(parseInt(firstKey))) {
100
- paths.push(firstKey);
101
- continue;
102
- }
103
- // firstKey is not association
104
- if (!associations[firstKey]) {
105
- paths.push(firstKey);
106
- continue;
107
- }
108
- const associationKeys = [];
109
- associationKeys.push(firstKey);
110
- debug('associationKeys %o', associationKeys);
111
- // set sequelize include option
112
- _.set(include, firstKey, {
113
- association: firstKey,
114
- attributes: [], // out put empty fields by default
115
- });
116
- // association target model
117
- let target = associations[firstKey].target;
118
- debug('association target %o', target);
119
- while (target) {
120
- const attr = keys.shift();
121
- origins.push(attr);
122
- // if it is target model attribute
123
- if (target.rawAttributes[attr]) {
124
- associationKeys.push(attr);
125
- target = null;
126
- }
127
- else if (target.associations[attr]) {
128
- // if it is target model association (nested association filter)
129
- associationKeys.push(attr);
130
- const assoc = [];
131
- associationKeys.forEach((associationKey, index) => {
132
- if (index > 0) {
133
- assoc.push('include');
134
- }
135
- assoc.push(associationKey);
136
- });
137
- _.set(include, assoc, {
138
- association: attr,
139
- attributes: [],
140
- });
141
- target = target.associations[attr].target;
142
- }
143
- else {
144
- throw new Error(`${attr} neither ${firstKey}'s association nor ${firstKey}'s attribute`);
145
- }
146
- }
147
- debug('associationKeys %o', associationKeys);
148
- if (associationKeys.length > 1) {
149
- paths.push(`$${associationKeys.join('.')}$`);
150
- }
151
- else {
152
- paths.push(firstKey);
153
- }
154
- }
155
- debug('where %o, paths %o, value, %o', where, paths, value);
156
- const values = _.get(where, paths);
157
- if (values && typeof values === 'object' && value && typeof value === 'object') {
158
- value = Object.assign(Object.assign({}, value), values);
159
- }
160
- _.set(where, paths, value);
161
- }
162
- const toInclude = (items) => {
163
- return Object.values(items).map((item) => {
164
- if (item.include) {
165
- item.include = toInclude(item.include);
166
- }
167
- return item;
168
- });
169
- };
170
- debug('where %o, include %o', where, include);
171
- return { where, include: toInclude(include) };
172
- }
173
- getFieldNameFromQueryPath(queryPath) {
174
- const paths = queryPath.split('.');
175
- let fieldName;
176
- for (const path of paths) {
177
- if (path.startsWith('$') || !lodash.isNaN(parseInt(path))) {
178
- continue;
179
- }
180
- fieldName = path;
181
- }
182
- return fieldName;
183
- }
184
- }
185
- //# sourceMappingURL=filter-parser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"filter-parser.js","sourceRoot":"","sources":["../src/filter-parser.ts"],"names":[],"mappings":"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","sourcesContent":["import { flatten, unflatten } from 'flat';\nimport { default as lodash, default as _ } from 'lodash';\nimport { ModelCtor } from 'sequelize';\nimport { Collection } from './collection';\nimport { Database } from './database';\nimport { Model } from './model';\n\nconst debug = require('debug')('noco-database');\n\ntype FilterType = any;\n\ninterface FilterParserContext {\n collection: Collection;\n app?: any;\n}\n\nexport default class FilterParser {\n collection: Collection;\n database: Database;\n model: ModelCtor<Model>;\n filter: FilterType;\n context: FilterParserContext;\n\n constructor(filter: FilterType, context: FilterParserContext) {\n const { collection } = context;\n this.collection = collection;\n this.context = context;\n this.model = collection.model;\n this.filter = this.prepareFilter(filter);\n this.database = collection.context.database;\n }\n\n prepareFilter(filter: FilterType) {\n if (lodash.isPlainObject(filter)) {\n const renamedKey = {};\n\n for (const key of Object.keys(filter)) {\n if (key.endsWith('.$exists') || key.endsWith('.$notExists')) {\n const keyArr = key.split('.');\n if (keyArr[keyArr.length - 2] == 'id') {\n continue;\n }\n\n keyArr.splice(keyArr.length - 1, 0, 'id');\n renamedKey[key] = keyArr.join('.');\n }\n }\n\n for (const [oldKey, newKey] of Object.entries(renamedKey)) {\n // @ts-ignore\n filter[newKey] = filter[oldKey];\n delete filter[oldKey];\n }\n }\n\n return filter;\n }\n\n toSequelizeParams() {\n debug('filter %o', this.filter);\n\n if (!this.filter) {\n return {};\n }\n\n const filter = this.filter;\n\n const model = this.model;\n\n // supported operators\n const operators = this.database.operators;\n\n const originalFiler = lodash.cloneDeep(filter || {});\n\n const flattenedFilter = flatten(filter || {});\n\n debug('flattened filter %o', flattenedFilter);\n\n const include = {};\n const where = {};\n const filter2 = lodash.cloneDeep(flattenedFilter);\n\n let skipPrefix = null;\n const associations = model.associations;\n\n debug('associations %O', associations);\n\n for (let [key, value] of Object.entries(flattenedFilter)) {\n // 处理 filter 条件\n if (skipPrefix && key.startsWith(skipPrefix)) {\n continue;\n }\n\n debug('handle filter key \"%s: \"%s\"', key, value);\n let keys = key.split('.');\n\n // paths ?\n const paths = [];\n\n // origins ?\n const origins = [];\n\n while (keys.length) {\n debug('keys: %o, paths: %o, origins: %o', keys, paths, origins);\n\n // move key from keys to origins\n const firstKey = keys.shift();\n origins.push(firstKey);\n\n debug('origins: %o', origins);\n\n if (firstKey.startsWith('$')) {\n if (operators.has(firstKey)) {\n debug('%s is operator', firstKey);\n // if firstKey is operator\n const opKey = operators.get(firstKey);\n debug('operator key %s, operator: %o', firstKey, opKey);\n\n // 默认操作符\n if (typeof opKey === 'symbol') {\n paths.push(opKey);\n continue;\n } else if (typeof opKey === 'function') {\n skipPrefix = origins.join('.');\n\n const queryValue = lodash.get(unflatten(originalFiler), skipPrefix);\n\n value = opKey(queryValue, {\n app: this.context.app,\n db: this.database,\n path: skipPrefix,\n fieldName: this.getFieldNameFromQueryPath(skipPrefix),\n model: this.model,\n });\n break;\n }\n } else {\n paths.push(firstKey);\n continue;\n }\n }\n\n // firstKey is number\n if (!lodash.isNaN(parseInt(firstKey))) {\n paths.push(firstKey);\n continue;\n }\n\n // firstKey is not association\n if (!associations[firstKey]) {\n paths.push(firstKey);\n continue;\n }\n\n const associationKeys = [];\n\n associationKeys.push(firstKey);\n\n debug('associationKeys %o', associationKeys);\n\n // set sequelize include option\n _.set(include, firstKey, {\n association: firstKey,\n attributes: [], // out put empty fields by default\n });\n\n // association target model\n let target = associations[firstKey].target;\n debug('association target %o', target);\n\n while (target) {\n const attr = keys.shift();\n origins.push(attr);\n // if it is target model attribute\n if (target.rawAttributes[attr]) {\n associationKeys.push(attr);\n target = null;\n } else if (target.associations[attr]) {\n // if it is target model association (nested association filter)\n associationKeys.push(attr);\n const assoc = [];\n associationKeys.forEach((associationKey, index) => {\n if (index > 0) {\n assoc.push('include');\n }\n assoc.push(associationKey);\n });\n\n _.set(include, assoc, {\n association: attr,\n attributes: [],\n });\n target = target.associations[attr].target;\n } else {\n throw new Error(`${attr} neither ${firstKey}'s association nor ${firstKey}'s attribute`);\n }\n }\n\n debug('associationKeys %o', associationKeys);\n\n if (associationKeys.length > 1) {\n paths.push(`$${associationKeys.join('.')}$`);\n } else {\n paths.push(firstKey);\n }\n }\n\n debug('where %o, paths %o, value, %o', where, paths, value);\n\n const values = _.get(where, paths);\n\n if (values && typeof values === 'object' && value && typeof value === 'object') {\n value = { ...value, ...values };\n }\n _.set(where, paths, value);\n }\n\n const toInclude = (items) => {\n return Object.values(items).map((item: any) => {\n if (item.include) {\n item.include = toInclude(item.include);\n }\n return item;\n });\n };\n debug('where %o, include %o', where, include);\n return { where, include: toInclude(include) };\n }\n\n private getFieldNameFromQueryPath(queryPath: string) {\n const paths = queryPath.split('.');\n let fieldName;\n for (const path of paths) {\n if (path.startsWith('$') || !lodash.isNaN(parseInt(path))) {\n continue;\n }\n\n fieldName = path;\n }\n\n return fieldName;\n }\n}\n"]}
package/esm/index.d.ts DELETED
@@ -1,15 +0,0 @@
1
- export { ModelCtor, Op, SyncOptions } from 'sequelize';
2
- export * from './collection';
3
- export * from './database';
4
- export { Database as default } from './database';
5
- export * from './fields';
6
- export * from './magic-attribute-model';
7
- export * from './mock-database';
8
- export * from './model';
9
- export * from './relation-repository/belongs-to-many-repository';
10
- export * from './relation-repository/belongs-to-repository';
11
- export * from './relation-repository/hasmany-repository';
12
- export * from './relation-repository/multiple-relation-repository';
13
- export * from './relation-repository/single-relation-repository';
14
- export * from './repository';
15
- export * from './update-associations';
package/esm/index.js DELETED
@@ -1,16 +0,0 @@
1
- export { Op } from 'sequelize';
2
- export * from './collection';
3
- export * from './database';
4
- export { Database as default } from './database';
5
- export * from './fields';
6
- export * from './magic-attribute-model';
7
- export * from './mock-database';
8
- export * from './model';
9
- export * from './relation-repository/belongs-to-many-repository';
10
- export * from './relation-repository/belongs-to-repository';
11
- export * from './relation-repository/hasmany-repository';
12
- export * from './relation-repository/multiple-relation-repository';
13
- export * from './relation-repository/single-relation-repository';
14
- export * from './repository';
15
- export * from './update-associations';
16
- //# sourceMappingURL=index.js.map
package/esm/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,EAAE,EAAe,MAAM,WAAW,CAAC;AACvD,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,QAAQ,IAAI,OAAO,EAAE,MAAM,YAAY,CAAC;AACjD,cAAc,UAAU,CAAC;AACzB,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC;AACxB,cAAc,kDAAkD,CAAC;AACjE,cAAc,6CAA6C,CAAC;AAC5D,cAAc,0CAA0C,CAAC;AACzD,cAAc,oDAAoD,CAAC;AACnE,cAAc,kDAAkD,CAAC;AACjE,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC","sourcesContent":["export { ModelCtor, Op, SyncOptions } from 'sequelize';\nexport * from './collection';\nexport * from './database';\nexport { Database as default } from './database';\nexport * from './fields';\nexport * from './magic-attribute-model';\nexport * from './mock-database';\nexport * from './model';\nexport * from './relation-repository/belongs-to-many-repository';\nexport * from './relation-repository/belongs-to-repository';\nexport * from './relation-repository/hasmany-repository';\nexport * from './relation-repository/multiple-relation-repository';\nexport * from './relation-repository/single-relation-repository';\nexport * from './repository';\nexport * from './update-associations';\n\n"]}
@@ -1,7 +0,0 @@
1
- import { Model } from './model';
2
- export declare class MagicAttributeModel extends Model {
3
- get magicAttribute(): string;
4
- set(key: any, value?: any, options?: any): this;
5
- get(key?: any, value?: any): any;
6
- update(values?: any, options?: any): Promise<this>;
7
- }
@@ -1,70 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import { merge } from '@nocobase/utils';
11
- import _ from 'lodash';
12
- import { Model } from './model';
13
- export class MagicAttributeModel extends Model {
14
- get magicAttribute() {
15
- const db = this.constructor.database;
16
- const collection = db.getCollection(this.constructor.name);
17
- return collection.options.magicAttribute || 'options';
18
- }
19
- set(key, value, options) {
20
- if (typeof key === 'string') {
21
- const [column] = key.split('.');
22
- if (this.constructor.hasAlias(column)) {
23
- return super.set(key, value, options);
24
- }
25
- if (this.constructor.rawAttributes[column]) {
26
- return super.set(key, value, options);
27
- }
28
- if (_.isPlainObject(value)) {
29
- const opts = super.get(this.magicAttribute) || {};
30
- return super.set(`${this.magicAttribute}.${key}`, merge(opts === null || opts === void 0 ? void 0 : opts[key], value), options);
31
- }
32
- return super.set(`${this.magicAttribute}.${key}`, value, options);
33
- }
34
- else {
35
- if (!key) {
36
- return;
37
- }
38
- Object.keys(key).forEach((k) => {
39
- this.set(k, key[k], options);
40
- });
41
- }
42
- return super.set(key, value, options);
43
- }
44
- get(key, value) {
45
- if (typeof key === 'string') {
46
- const [column] = key.split('.');
47
- if (this.constructor.hasAlias(column)) {
48
- return super.get(key, value);
49
- }
50
- if (this.constructor.rawAttributes[column]) {
51
- return super.get(key, value);
52
- }
53
- const options = super.get(this.magicAttribute, value);
54
- return _.get(options, key);
55
- }
56
- const data = super.get(key, value);
57
- return Object.assign(Object.assign({}, _.omit(data, this.magicAttribute)), data[this.magicAttribute]);
58
- }
59
- update(values, options) {
60
- const _super = Object.create(null, {
61
- update: { get: () => super.update }
62
- });
63
- return __awaiter(this, void 0, void 0, function* () {
64
- // @ts-ignore
65
- this._changed = new Set();
66
- return _super.update.call(this, values, options);
67
- });
68
- }
69
- }
70
- //# sourceMappingURL=magic-attribute-model.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"magic-attribute-model.js","sourceRoot":"","sources":["../src/magic-attribute-model.ts"],"names":[],"mappings":"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","sourcesContent":["import { merge } from '@nocobase/utils';\nimport _ from 'lodash';\nimport Database from './database';\nimport { Model } from './model';\n\nexport class MagicAttributeModel extends Model {\n get magicAttribute() {\n const db: Database = (<any>this.constructor).database;\n const collection = db.getCollection(this.constructor.name);\n return collection.options.magicAttribute || 'options';\n }\n\n set(key: any, value?: any, options?: any) {\n if (typeof key === 'string') {\n const [column] = key.split('.');\n if ((this.constructor as any).hasAlias(column)) {\n return super.set(key, value, options);\n }\n if ((this.constructor as any).rawAttributes[column]) {\n return super.set(key, value, options);\n }\n if (_.isPlainObject(value)) {\n const opts = super.get(this.magicAttribute) || {};\n return super.set(`${this.magicAttribute}.${key}`, merge(opts?.[key], value), options);\n }\n return super.set(`${this.magicAttribute}.${key}`, value, options);\n } else {\n if (!key) {\n return;\n }\n Object.keys(key).forEach((k) => {\n this.set(k, key[k], options);\n });\n }\n return super.set(key, value, options);\n }\n\n get(key?: any, value?: any): any {\n if (typeof key === 'string') {\n const [column] = key.split('.');\n if ((this.constructor as any).hasAlias(column)) {\n return super.get(key, value);\n }\n if ((this.constructor as any).rawAttributes[column]) {\n return super.get(key, value);\n }\n const options = super.get(this.magicAttribute, value);\n return _.get(options, key);\n }\n const data = super.get(key, value);\n return {\n ..._.omit(data, this.magicAttribute),\n ...data[this.magicAttribute],\n };\n }\n\n async update(values?: any, options?: any) {\n // @ts-ignore\n this._changed = new Set();\n return super.update(values, options);\n }\n}\n"]}
@@ -1,22 +0,0 @@
1
- import { Database, IDatabaseOptions } from './database';
2
- export declare class MockDatabase extends Database {
3
- constructor(options: IDatabaseOptions);
4
- }
5
- export declare function getConfigByEnv(): {
6
- username: string;
7
- password: string;
8
- database: string;
9
- host: string;
10
- port: string;
11
- dialect: string;
12
- logging: boolean | {
13
- (...data: any[]): void;
14
- (message?: any, ...optionalParams: any[]): void;
15
- };
16
- storage: string;
17
- define: {
18
- charset: string;
19
- collate: string;
20
- };
21
- };
22
- export declare function mockDatabase(options?: IDatabaseOptions): MockDatabase;
@@ -1,34 +0,0 @@
1
- import { merge, uid } from '@nocobase/utils';
2
- import { resolve } from 'path';
3
- import { Database } from './database';
4
- export class MockDatabase extends Database {
5
- constructor(options) {
6
- super(Object.assign({ storage: ':memory:', tablePrefix: `mock_${uid(6)}_`, dialect: 'sqlite' }, options));
7
- this.sequelize.beforeDefine((model, opts) => {
8
- opts.tableName = `${this.getTablePrefix()}${opts.tableName || opts.modelName || opts.name.plural}`;
9
- });
10
- }
11
- }
12
- export function getConfigByEnv() {
13
- return {
14
- username: process.env.DB_USER,
15
- password: process.env.DB_PASSWORD,
16
- database: process.env.DB_DATABASE,
17
- host: process.env.DB_HOST,
18
- port: process.env.DB_PORT,
19
- dialect: process.env.DB_DIALECT,
20
- logging: process.env.DB_LOG_SQL === 'on' ? console.log : false,
21
- storage: process.env.DB_STORAGE && process.env.DB_STORAGE !== ':memory:'
22
- ? resolve(process.cwd(), process.env.DB_STORAGE)
23
- : ':memory:',
24
- define: {
25
- charset: 'utf8mb4',
26
- collate: 'utf8mb4_unicode_ci',
27
- },
28
- };
29
- }
30
- export function mockDatabase(options = {}) {
31
- const dbOptions = merge(getConfigByEnv(), options);
32
- return new MockDatabase(dbOptions);
33
- }
34
- //# sourceMappingURL=mock-database.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mock-database.js","sourceRoot":"","sources":["../src/mock-database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAoB,MAAM,YAAY,CAAC;AAExD,MAAM,OAAO,YAAa,SAAQ,QAAQ;IACxC,YAAY,OAAyB;QACnC,KAAK,iBACH,OAAO,EAAE,UAAU,EACnB,WAAW,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC,GAAG,EAC9B,OAAO,EAAE,QAAQ,IACd,OAAO,EACV,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAC1C,IAAI,CAAC,SAAS,GAAG,GAAG,IAAI,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACrG,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO;QAC7B,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW;QACjC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW;QACjC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO;QACzB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO;QACzB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;QAC/B,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK;QAC9D,OAAO,EACL,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,UAAU;YAC7D,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;YAChD,CAAC,CAAC,UAAU;QAChB,MAAM,EAAE;YACN,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE,oBAAoB;SAC9B;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,UAA4B,EAAE;IACzD,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,EAAE,EAAE,OAAO,CAAC,CAAC;IACnD,OAAO,IAAI,YAAY,CAAC,SAAS,CAAC,CAAC;AACrC,CAAC","sourcesContent":["import { merge, uid } from '@nocobase/utils';\nimport { resolve } from 'path';\nimport { Database, IDatabaseOptions } from './database';\n\nexport class MockDatabase extends Database {\n constructor(options: IDatabaseOptions) {\n super({\n storage: ':memory:',\n tablePrefix: `mock_${uid(6)}_`,\n dialect: 'sqlite',\n ...options,\n });\n this.sequelize.beforeDefine((model, opts) => {\n opts.tableName = `${this.getTablePrefix()}${opts.tableName || opts.modelName || opts.name.plural}`;\n });\n }\n}\n\nexport function getConfigByEnv() {\n return {\n username: process.env.DB_USER,\n password: process.env.DB_PASSWORD,\n database: process.env.DB_DATABASE,\n host: process.env.DB_HOST,\n port: process.env.DB_PORT,\n dialect: process.env.DB_DIALECT,\n logging: process.env.DB_LOG_SQL === 'on' ? console.log : false,\n storage:\n process.env.DB_STORAGE && process.env.DB_STORAGE !== ':memory:'\n ? resolve(process.cwd(), process.env.DB_STORAGE)\n : ':memory:',\n define: {\n charset: 'utf8mb4',\n collate: 'utf8mb4_unicode_ci',\n },\n };\n}\n\nexport function mockDatabase(options: IDatabaseOptions = {}): MockDatabase {\n const dbOptions = merge(getConfigByEnv(), options);\n return new MockDatabase(dbOptions);\n}\n"]}
@@ -1,12 +0,0 @@
1
- import type { SequelizeHooks } from 'sequelize/types/lib/hooks';
2
- import Database from './database';
3
- export declare class ModelHook {
4
- database: Database;
5
- boundEvent: Set<string>;
6
- constructor(database: Database);
7
- isModelHook(eventName: string | symbol): keyof SequelizeHooks | false;
8
- findModelName(hookArgs: any): any;
9
- bindEvent(eventName: any): void;
10
- hasBindEvent(eventName: any): boolean;
11
- sequelizeHookBuilder(eventName: any): (...args: any[]) => Promise<void>;
12
- }
package/esm/model-hook.js DELETED
@@ -1,61 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import lodash from 'lodash';
11
- import { Model } from './model';
12
- const { hooks } = require('sequelize/lib/hooks');
13
- export class ModelHook {
14
- constructor(database) {
15
- this.boundEvent = new Set();
16
- this.database = database;
17
- }
18
- isModelHook(eventName) {
19
- if (lodash.isString(eventName)) {
20
- const hookType = eventName.split('.').pop();
21
- if (hooks[hookType]) {
22
- return hookType;
23
- }
24
- }
25
- return false;
26
- }
27
- findModelName(hookArgs) {
28
- for (const arg of hookArgs) {
29
- if (arg instanceof Model) {
30
- return arg.constructor.name;
31
- }
32
- if (lodash.isPlainObject(arg)) {
33
- if (arg['model']) {
34
- return arg['model'].name;
35
- }
36
- if (lodash.get(arg, 'name.plural')) {
37
- return lodash.get(arg, 'name.plural');
38
- }
39
- }
40
- }
41
- return null;
42
- }
43
- bindEvent(eventName) {
44
- this.boundEvent.add(eventName);
45
- }
46
- hasBindEvent(eventName) {
47
- return this.boundEvent.has(eventName);
48
- }
49
- sequelizeHookBuilder(eventName) {
50
- return (...args) => __awaiter(this, void 0, void 0, function* () {
51
- const modelName = this.findModelName(args);
52
- if (modelName) {
53
- // emit model event
54
- yield this.database.emitAsync(`${modelName}.${eventName}`, ...args);
55
- }
56
- // emit sequelize global event
57
- yield this.database.emitAsync(eventName, ...args);
58
- });
59
- }
60
- }
61
- //# sourceMappingURL=model-hook.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"model-hook.js","sourceRoot":"","sources":["../src/model-hook.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAG5B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAEjD,MAAM,OAAO,SAAS;IAIpB,YAAY,QAAkB;QAF9B,eAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QAG7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,WAAW,CAAC,SAA0B;QACpC,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;YAC9B,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAE5C,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE;gBACnB,OAA6B,QAAQ,CAAC;aACvC;SACF;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,aAAa,CAAC,QAAQ;QACpB,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE;YAC1B,IAAI,GAAG,YAAY,KAAK,EAAE;gBACxB,OAAe,GAAI,CAAC,WAAW,CAAC,IAAI,CAAC;aACtC;YAED,IAAI,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE;gBAC7B,IAAI,GAAG,CAAC,OAAO,CAAC,EAAE;oBAChB,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;iBAC1B;gBAED,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE;oBAClC,OAAO,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;iBACvC;aACF;SACF;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,CAAC,SAAS;QACjB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IAED,YAAY,CAAC,SAAS;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,oBAAoB,CAAC,SAAS;QAC5B,OAAO,CAAO,GAAG,IAAW,EAAE,EAAE;YAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAE3C,IAAI,SAAS,EAAE;gBACb,mBAAmB;gBACnB,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,SAAS,IAAI,SAAS,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;aACrE;YAED,8BAA8B;YAC9B,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;QACpD,CAAC,CAAA,CAAC;IACJ,CAAC;CACF","sourcesContent":["import lodash from 'lodash';\nimport type { SequelizeHooks } from 'sequelize/types/lib/hooks';\nimport Database from './database';\nimport { Model } from './model';\n\nconst { hooks } = require('sequelize/lib/hooks');\n\nexport class ModelHook {\n database: Database;\n boundEvent = new Set<string>();\n\n constructor(database: Database) {\n this.database = database;\n }\n\n isModelHook(eventName: string | symbol): keyof SequelizeHooks | false {\n if (lodash.isString(eventName)) {\n const hookType = eventName.split('.').pop();\n\n if (hooks[hookType]) {\n return <keyof SequelizeHooks>hookType;\n }\n }\n\n return false;\n }\n\n findModelName(hookArgs) {\n for (const arg of hookArgs) {\n if (arg instanceof Model) {\n return (<Model>arg).constructor.name;\n }\n\n if (lodash.isPlainObject(arg)) {\n if (arg['model']) {\n return arg['model'].name;\n }\n\n if (lodash.get(arg, 'name.plural')) {\n return lodash.get(arg, 'name.plural');\n }\n }\n }\n\n return null;\n }\n\n bindEvent(eventName) {\n this.boundEvent.add(eventName);\n }\n\n hasBindEvent(eventName) {\n return this.boundEvent.has(eventName);\n }\n\n sequelizeHookBuilder(eventName) {\n return async (...args: any[]) => {\n const modelName = this.findModelName(args);\n\n if (modelName) {\n // emit model event\n await this.database.emitAsync(`${modelName}.${eventName}`, ...args);\n }\n\n // emit sequelize global event\n await this.database.emitAsync(eventName, ...args);\n };\n }\n}\n"]}
package/esm/model.d.ts DELETED
@@ -1,15 +0,0 @@
1
- import { Model as SequelizeModel } from 'sequelize';
2
- import { Collection } from './collection';
3
- import { Database } from './database';
4
- interface IModel {
5
- [key: string]: any;
6
- }
7
- export declare class Model<TModelAttributes extends {} = any, TCreationAttributes extends {} = TModelAttributes> extends SequelizeModel<TModelAttributes, TCreationAttributes> implements IModel {
8
- static database: Database;
9
- static collection: Collection;
10
- toJSON<T extends TModelAttributes>(): T;
11
- private hiddenObjKey;
12
- private sortAssociations;
13
- private sortArray;
14
- }
15
- export {};
package/esm/model.js DELETED
@@ -1,80 +0,0 @@
1
- import { Model as SequelizeModel } from 'sequelize';
2
- import lodash from 'lodash';
3
- export class Model extends SequelizeModel {
4
- toJSON() {
5
- const handleObj = (obj, options) => {
6
- const handles = [
7
- (data) => {
8
- if (data instanceof Model) {
9
- return data.toJSON();
10
- }
11
- return data;
12
- },
13
- this.hiddenObjKey,
14
- ];
15
- return handles.reduce((carry, fn) => fn.apply(this, [carry, options]), obj);
16
- };
17
- const handleArray = (arrayOfObj, options) => {
18
- const handles = [this.sortAssociations];
19
- return handles.reduce((carry, fn) => fn.apply(this, [carry, options]), arrayOfObj || []);
20
- };
21
- const opts = {
22
- model: this.constructor,
23
- collection: this.constructor.collection,
24
- db: this.constructor.database,
25
- };
26
- const traverseJSON = (data, options) => {
27
- const { model, db, collection } = options;
28
- // handle Object
29
- data = handleObj(data, options);
30
- const result = {};
31
- for (const key of Object.keys(data)) {
32
- // @ts-ignore
33
- if (model.hasAlias(key)) {
34
- const association = model.associations[key];
35
- const opts = {
36
- model: association.target,
37
- collection: db.getCollection(association.target.name),
38
- db,
39
- key,
40
- field: collection.getField(key),
41
- };
42
- if (['HasMany', 'BelongsToMany'].includes(association.associationType)) {
43
- result[key] = handleArray(data[key], opts).map((item) => traverseJSON(item, opts));
44
- }
45
- else {
46
- result[key] = data[key] ? traverseJSON(data[key], opts) : null;
47
- }
48
- }
49
- else {
50
- result[key] = data[key];
51
- }
52
- }
53
- return result;
54
- };
55
- return traverseJSON(super.toJSON(), opts);
56
- }
57
- hiddenObjKey(obj, options) {
58
- const hiddenFields = Array.from(options.collection.fields.values())
59
- .filter((field) => field.options.hidden)
60
- .map((field) => field.options.name);
61
- return lodash.omit(obj, hiddenFields);
62
- }
63
- sortAssociations(data, { field }) {
64
- const sortBy = field.options.sortBy;
65
- return sortBy ? this.sortArray(data, sortBy) : data;
66
- }
67
- sortArray(data, sortBy) {
68
- if (!lodash.isArray(sortBy)) {
69
- sortBy = [sortBy];
70
- }
71
- const orderItems = [];
72
- const orderDirections = [];
73
- sortBy.forEach((sortItem) => {
74
- orderDirections.push(sortItem.startsWith('-') ? 'desc' : 'asc');
75
- orderItems.push(sortItem.replace('-', ''));
76
- });
77
- return lodash.orderBy(data, orderItems, orderDirections);
78
- }
79
- }
80
- //# sourceMappingURL=model.js.map
package/esm/model.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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","sourcesContent":["import { Model as SequelizeModel, ModelCtor } from 'sequelize';\nimport { Collection } from './collection';\nimport { Database } from './database';\nimport lodash from 'lodash';\nimport { Field } from './fields';\n\ninterface IModel {\n [key: string]: any;\n}\n\ninterface JSONTransformerOptions {\n model: ModelCtor<any>;\n collection: Collection;\n db: Database;\n key?: string;\n field?: Field;\n}\n\nexport class Model<TModelAttributes extends {} = any, TCreationAttributes extends {} = TModelAttributes>\n extends SequelizeModel<TModelAttributes, TCreationAttributes>\n implements IModel\n{\n public static database: Database;\n public static collection: Collection;\n\n public toJSON<T extends TModelAttributes>(): T {\n const handleObj = (obj, options: JSONTransformerOptions) => {\n const handles = [\n (data) => {\n if (data instanceof Model) {\n return data.toJSON();\n }\n\n return data;\n },\n this.hiddenObjKey,\n ];\n return handles.reduce((carry, fn) => fn.apply(this, [carry, options]), obj);\n };\n\n const handleArray = (arrayOfObj, options: JSONTransformerOptions) => {\n const handles = [this.sortAssociations];\n return handles.reduce((carry, fn) => fn.apply(this, [carry, options]), arrayOfObj || []);\n };\n\n const opts = {\n model: this.constructor as ModelCtor<any>,\n collection: (this.constructor as any).collection,\n db: (this.constructor as any).database as Database,\n };\n\n const traverseJSON = (data: T, options: JSONTransformerOptions): T => {\n const { model, db, collection } = options;\n // handle Object\n data = handleObj(data, options);\n\n const result = {};\n for (const key of Object.keys(data)) {\n // @ts-ignore\n if (model.hasAlias(key)) {\n const association = model.associations[key];\n const opts = {\n model: association.target,\n collection: db.getCollection(association.target.name),\n db,\n key,\n field: collection.getField(key),\n };\n\n if (['HasMany', 'BelongsToMany'].includes(association.associationType)) {\n result[key] = handleArray(data[key], opts).map((item) => traverseJSON(item, opts));\n } else {\n result[key] = data[key] ? traverseJSON(data[key], opts) : null;\n }\n } else {\n result[key] = data[key];\n }\n }\n\n return result as T;\n };\n\n return traverseJSON(super.toJSON(), opts);\n }\n\n private hiddenObjKey(obj, options: JSONTransformerOptions) {\n const hiddenFields = Array.from(options.collection.fields.values())\n .filter((field) => field.options.hidden)\n .map((field) => field.options.name);\n\n return lodash.omit(obj, hiddenFields);\n }\n\n private sortAssociations(data, { field }: JSONTransformerOptions): any {\n const sortBy = field.options.sortBy;\n return sortBy ? this.sortArray(data, sortBy) : data;\n }\n\n private sortArray(data, sortBy: string | string[]) {\n if (!lodash.isArray(sortBy)) {\n sortBy = [sortBy];\n }\n\n const orderItems = [];\n const orderDirections = [];\n\n sortBy.forEach((sortItem) => {\n orderDirections.push(sortItem.startsWith('-') ? 'desc' : 'asc');\n orderItems.push(sortItem.replace('-', ''));\n });\n\n return lodash.orderBy(data, orderItems, orderDirections);\n }\n}\n"]}
@@ -1,26 +0,0 @@
1
- import { Op } from 'sequelize';
2
- declare const _default: {
3
- $match(value: any, ctx: any): import("sequelize/types/lib/utils").Literal | {
4
- [Op.contained]: any;
5
- [Op.contains]: any;
6
- [Op.eq]?: undefined;
7
- } | {
8
- [Op.eq]: import("sequelize/types/lib/utils").Literal;
9
- [Op.contained]?: undefined;
10
- [Op.contains]?: undefined;
11
- };
12
- $notMatch(value: any, ctx: any): import("sequelize/types/lib/utils").Literal | {
13
- [Op.ne]: import("sequelize/types/lib/utils").Literal;
14
- };
15
- $anyOf(value: any, ctx: any): import("sequelize/types/lib/utils").Literal;
16
- $noneOf(value: any, ctx: any): {
17
- [Op.or]: any[];
18
- };
19
- $arrayEmpty(value: any, ctx: any): {
20
- [Op.and]: import("sequelize/types/lib/utils").Literal[];
21
- };
22
- $arrayNotEmpty(value: any, ctx: any): {
23
- [Op.and]: import("sequelize/types/lib/utils").Literal[];
24
- };
25
- };
26
- export default _default;