@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,191 +1,300 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const flat_1 = require("flat");
7
- const lodash_1 = __importDefault(require("lodash"));
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ function _flat() {
9
+ const data = require("flat");
10
+
11
+ _flat = function _flat() {
12
+ return data;
13
+ };
14
+
15
+ return data;
16
+ }
17
+
18
+ function _lodash() {
19
+ const data = _interopRequireDefault(require("lodash"));
20
+
21
+ _lodash = function _lodash() {
22
+ return data;
23
+ };
24
+
25
+ return data;
26
+ }
27
+
28
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
+
30
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
31
+
32
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
33
+
34
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
35
+
36
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
37
+
38
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
39
+
40
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
41
+
42
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
43
+
44
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
45
+
46
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
47
+
48
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
49
+
8
50
  const debug = require('debug')('noco-database');
51
+
9
52
  class FilterParser {
10
- constructor(filter, context) {
11
- const { collection } = context;
12
- this.collection = collection;
13
- this.context = context;
14
- this.model = collection.model;
15
- this.filter = this.prepareFilter(filter);
16
- this.database = collection.context.database;
17
- }
18
- prepareFilter(filter) {
19
- if (lodash_1.default.isPlainObject(filter)) {
20
- const renamedKey = {};
21
- for (const key of Object.keys(filter)) {
22
- if (key.endsWith('.$exists') || key.endsWith('.$notExists')) {
23
- const keyArr = key.split('.');
24
- if (keyArr[keyArr.length - 2] == 'id') {
25
- continue;
26
- }
27
- keyArr.splice(keyArr.length - 1, 0, 'id');
28
- renamedKey[key] = keyArr.join('.');
29
- }
30
- }
31
- for (const [oldKey, newKey] of Object.entries(renamedKey)) {
32
- // @ts-ignore
33
- filter[newKey] = filter[oldKey];
34
- delete filter[oldKey];
35
- }
53
+ constructor(filter, context) {
54
+ this.collection = void 0;
55
+ this.database = void 0;
56
+ this.model = void 0;
57
+ this.filter = void 0;
58
+ this.context = void 0;
59
+ const collection = context.collection;
60
+ this.collection = collection;
61
+ this.context = context;
62
+ this.model = collection.model;
63
+ this.filter = this.prepareFilter(filter);
64
+ this.database = collection.context.database;
65
+ }
66
+
67
+ prepareFilter(filter) {
68
+ if (_lodash().default.isPlainObject(filter)) {
69
+ const renamedKey = {};
70
+
71
+ for (var _i = 0, _Object$keys = Object.keys(filter); _i < _Object$keys.length; _i++) {
72
+ const key = _Object$keys[_i];
73
+
74
+ if (key.endsWith('.$exists') || key.endsWith('.$notExists')) {
75
+ const keyArr = key.split('.');
76
+
77
+ if (keyArr[keyArr.length - 2] == 'id') {
78
+ continue;
79
+ }
80
+
81
+ keyArr.splice(keyArr.length - 1, 0, 'id');
82
+ renamedKey[key] = keyArr.join('.');
36
83
  }
37
- return filter;
84
+ }
85
+
86
+ for (var _i2 = 0, _Object$entries = Object.entries(renamedKey); _i2 < _Object$entries.length; _i2++) {
87
+ const _Object$entries$_i = _slicedToArray(_Object$entries[_i2], 2),
88
+ oldKey = _Object$entries$_i[0],
89
+ newKey = _Object$entries$_i[1];
90
+
91
+ // @ts-ignore
92
+ filter[newKey] = filter[oldKey];
93
+ delete filter[oldKey];
94
+ }
38
95
  }
39
- toSequelizeParams() {
40
- debug('filter %o', this.filter);
41
- if (!this.filter) {
42
- return {};
43
- }
44
- const filter = this.filter;
45
- const model = this.model;
46
- // supported operators
47
- const operators = this.database.operators;
48
- const originalFiler = lodash_1.default.cloneDeep(filter || {});
49
- const flattenedFilter = (0, flat_1.flatten)(filter || {});
50
- debug('flattened filter %o', flattenedFilter);
51
- const include = {};
52
- const where = {};
53
- const filter2 = lodash_1.default.cloneDeep(flattenedFilter);
54
- let skipPrefix = null;
55
- const associations = model.associations;
56
- debug('associations %O', associations);
57
- for (let [key, value] of Object.entries(flattenedFilter)) {
58
- // 处理 filter 条件
59
- if (skipPrefix && key.startsWith(skipPrefix)) {
60
- continue;
61
- }
62
- debug('handle filter key "%s: "%s"', key, value);
63
- let keys = key.split('.');
64
- // paths ?
65
- const paths = [];
66
- // origins ?
67
- const origins = [];
68
- while (keys.length) {
69
- debug('keys: %o, paths: %o, origins: %o', keys, paths, origins);
70
- // move key from keys to origins
71
- const firstKey = keys.shift();
72
- origins.push(firstKey);
73
- debug('origins: %o', origins);
74
- if (firstKey.startsWith('$')) {
75
- if (operators.has(firstKey)) {
76
- debug('%s is operator', firstKey);
77
- // if firstKey is operator
78
- const opKey = operators.get(firstKey);
79
- debug('operator key %s, operator: %o', firstKey, opKey);
80
- // 默认操作符
81
- if (typeof opKey === 'symbol') {
82
- paths.push(opKey);
83
- continue;
84
- }
85
- else if (typeof opKey === 'function') {
86
- skipPrefix = origins.join('.');
87
- const queryValue = lodash_1.default.get((0, flat_1.unflatten)(originalFiler), skipPrefix);
88
- value = opKey(queryValue, {
89
- app: this.context.app,
90
- db: this.database,
91
- path: skipPrefix,
92
- fieldName: this.getFieldNameFromQueryPath(skipPrefix),
93
- model: this.model,
94
- });
95
- break;
96
- }
97
- }
98
- else {
99
- paths.push(firstKey);
100
- continue;
101
- }
102
- }
103
- // firstKey is number
104
- if (!lodash_1.default.isNaN(parseInt(firstKey))) {
105
- paths.push(firstKey);
106
- continue;
107
- }
108
- // firstKey is not association
109
- if (!associations[firstKey]) {
110
- paths.push(firstKey);
111
- continue;
112
- }
113
- const associationKeys = [];
114
- associationKeys.push(firstKey);
115
- debug('associationKeys %o', associationKeys);
116
- // set sequelize include option
117
- lodash_1.default.set(include, firstKey, {
118
- association: firstKey,
119
- attributes: [], // out put empty fields by default
120
- });
121
- // association target model
122
- let target = associations[firstKey].target;
123
- debug('association target %o', target);
124
- while (target) {
125
- const attr = keys.shift();
126
- origins.push(attr);
127
- // if it is target model attribute
128
- if (target.rawAttributes[attr]) {
129
- associationKeys.push(attr);
130
- target = null;
131
- }
132
- else if (target.associations[attr]) {
133
- // if it is target model association (nested association filter)
134
- associationKeys.push(attr);
135
- const assoc = [];
136
- associationKeys.forEach((associationKey, index) => {
137
- if (index > 0) {
138
- assoc.push('include');
139
- }
140
- assoc.push(associationKey);
141
- });
142
- lodash_1.default.set(include, assoc, {
143
- association: attr,
144
- attributes: [],
145
- });
146
- target = target.associations[attr].target;
147
- }
148
- else {
149
- throw new Error(`${attr} neither ${firstKey}'s association nor ${firstKey}'s attribute`);
150
- }
151
- }
152
- debug('associationKeys %o', associationKeys);
153
- if (associationKeys.length > 1) {
154
- paths.push(`$${associationKeys.join('.')}$`);
155
- }
156
- else {
157
- paths.push(firstKey);
158
- }
159
- }
160
- debug('where %o, paths %o, value, %o', where, paths, value);
161
- const values = lodash_1.default.get(where, paths);
162
- if (values && typeof values === 'object' && value && typeof value === 'object') {
163
- value = Object.assign(Object.assign({}, value), values);
96
+
97
+ return filter;
98
+ }
99
+
100
+ toSequelizeParams() {
101
+ debug('filter %o', this.filter);
102
+
103
+ if (!this.filter) {
104
+ return {};
105
+ }
106
+
107
+ const filter = this.filter;
108
+ const model = this.model; // supported operators
109
+
110
+ const operators = this.database.operators;
111
+
112
+ const originalFiler = _lodash().default.cloneDeep(filter || {});
113
+
114
+ const flattenedFilter = (0, _flat().flatten)(filter || {});
115
+ debug('flattened filter %o', flattenedFilter);
116
+ const include = {};
117
+ const where = {};
118
+
119
+ const filter2 = _lodash().default.cloneDeep(flattenedFilter);
120
+
121
+ let skipPrefix = null;
122
+ const associations = model.associations;
123
+ debug('associations %O', associations);
124
+
125
+ for (var _i3 = 0, _Object$entries2 = Object.entries(flattenedFilter); _i3 < _Object$entries2.length; _i3++) {
126
+ let _Object$entries2$_i = _slicedToArray(_Object$entries2[_i3], 2),
127
+ key = _Object$entries2$_i[0],
128
+ value = _Object$entries2$_i[1];
129
+
130
+ // 处理 filter 条件
131
+ if (skipPrefix && key.startsWith(skipPrefix)) {
132
+ continue;
133
+ }
134
+
135
+ debug('handle filter key "%s: "%s"', key, value);
136
+ let keys = key.split('.'); // paths ?
137
+
138
+ const paths = []; // origins ?
139
+
140
+ const origins = [];
141
+
142
+ while (keys.length) {
143
+ debug('keys: %o, paths: %o, origins: %o', keys, paths, origins); // move key from keys to origins
144
+
145
+ const firstKey = keys.shift();
146
+ origins.push(firstKey);
147
+ debug('origins: %o', origins);
148
+
149
+ if (firstKey.startsWith('$')) {
150
+ if (operators.has(firstKey)) {
151
+ debug('%s is operator', firstKey); // if firstKey is operator
152
+
153
+ const opKey = operators.get(firstKey);
154
+ debug('operator key %s, operator: %o', firstKey, opKey); // 默认操作符
155
+
156
+ if (typeof opKey === 'symbol') {
157
+ paths.push(opKey);
158
+ continue;
159
+ } else if (typeof opKey === 'function') {
160
+ skipPrefix = origins.join('.');
161
+
162
+ const queryValue = _lodash().default.get((0, _flat().unflatten)(originalFiler), skipPrefix);
163
+
164
+ value = opKey(queryValue, {
165
+ app: this.context.app,
166
+ db: this.database,
167
+ path: skipPrefix,
168
+ fieldName: this.getFieldNameFromQueryPath(skipPrefix),
169
+ model: this.model
170
+ });
171
+ break;
164
172
  }
165
- lodash_1.default.set(where, paths, value);
173
+ } else {
174
+ paths.push(firstKey);
175
+ continue;
176
+ }
177
+ } // firstKey is number
178
+
179
+
180
+ if (!_lodash().default.isNaN(parseInt(firstKey))) {
181
+ paths.push(firstKey);
182
+ continue;
183
+ } // firstKey is not association
184
+
185
+
186
+ if (!associations[firstKey]) {
187
+ paths.push(firstKey);
188
+ continue;
166
189
  }
167
- const toInclude = (items) => {
168
- return Object.values(items).map((item) => {
169
- if (item.include) {
170
- item.include = toInclude(item.include);
171
- }
172
- return item;
190
+
191
+ const associationKeys = [];
192
+ associationKeys.push(firstKey);
193
+ debug('associationKeys %o', associationKeys); // set sequelize include option
194
+
195
+ _lodash().default.set(include, firstKey, {
196
+ association: firstKey,
197
+ attributes: [] // out put empty fields by default
198
+
199
+ }); // association target model
200
+
201
+
202
+ let target = associations[firstKey].target;
203
+ debug('association target %o', target);
204
+
205
+ while (target) {
206
+ const attr = keys.shift();
207
+ origins.push(attr); // if it is target model attribute
208
+
209
+ if (target.rawAttributes[attr]) {
210
+ associationKeys.push(attr);
211
+ target = null;
212
+ } else if (target.associations[attr]) {
213
+ // if it is target model association (nested association filter)
214
+ associationKeys.push(attr);
215
+ const assoc = [];
216
+ associationKeys.forEach((associationKey, index) => {
217
+ if (index > 0) {
218
+ assoc.push('include');
219
+ }
220
+
221
+ assoc.push(associationKey);
173
222
  });
174
- };
175
- debug('where %o, include %o', where, include);
176
- return { where, include: toInclude(include) };
223
+
224
+ _lodash().default.set(include, assoc, {
225
+ association: attr,
226
+ attributes: []
227
+ });
228
+
229
+ target = target.associations[attr].target;
230
+ } else {
231
+ throw new Error(`${attr} neither ${firstKey}'s association nor ${firstKey}'s attribute`);
232
+ }
233
+ }
234
+
235
+ debug('associationKeys %o', associationKeys);
236
+
237
+ if (associationKeys.length > 1) {
238
+ paths.push(`$${associationKeys.join('.')}$`);
239
+ } else {
240
+ paths.push(firstKey);
241
+ }
242
+ }
243
+
244
+ debug('where %o, paths %o, value, %o', where, paths, value);
245
+
246
+ const values = _lodash().default.get(where, paths);
247
+
248
+ if (values && typeof values === 'object' && value && typeof value === 'object') {
249
+ value = _objectSpread(_objectSpread({}, value), values);
250
+ }
251
+
252
+ _lodash().default.set(where, paths, value);
177
253
  }
178
- getFieldNameFromQueryPath(queryPath) {
179
- const paths = queryPath.split('.');
180
- let fieldName;
181
- for (const path of paths) {
182
- if (path.startsWith('$') || !lodash_1.default.isNaN(parseInt(path))) {
183
- continue;
184
- }
185
- fieldName = path;
254
+
255
+ const toInclude = items => {
256
+ return Object.values(items).map(item => {
257
+ if (item.include) {
258
+ item.include = toInclude(item.include);
259
+ }
260
+
261
+ return item;
262
+ });
263
+ };
264
+
265
+ debug('where %o, include %o', where, include);
266
+ return {
267
+ where,
268
+ include: toInclude(include)
269
+ };
270
+ }
271
+
272
+ getFieldNameFromQueryPath(queryPath) {
273
+ const paths = queryPath.split('.');
274
+ let fieldName;
275
+
276
+ var _iterator = _createForOfIteratorHelper(paths),
277
+ _step;
278
+
279
+ try {
280
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
281
+ const path = _step.value;
282
+
283
+ if (path.startsWith('$') || !_lodash().default.isNaN(parseInt(path))) {
284
+ continue;
186
285
  }
187
- return fieldName;
286
+
287
+ fieldName = path;
288
+ }
289
+ } catch (err) {
290
+ _iterator.e(err);
291
+ } finally {
292
+ _iterator.f();
188
293
  }
294
+
295
+ return fieldName;
296
+ }
297
+
189
298
  }
190
- exports.default = FilterParser;
191
- //# sourceMappingURL=filter-parser.js.map
299
+
300
+ exports.default = FilterParser;
package/lib/index.d.ts CHANGED
@@ -4,6 +4,7 @@ export * from './database';
4
4
  export { Database as default } from './database';
5
5
  export * from './fields';
6
6
  export * from './magic-attribute-model';
7
+ export * from './migration';
7
8
  export * from './mock-database';
8
9
  export * from './model';
9
10
  export * from './relation-repository/belongs-to-many-repository';