@nocobase/database 0.9.1-alpha.1 → 0.9.2-alpha.1

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 (173) hide show
  1. package/lib/collection-group-manager.d.ts +13 -0
  2. package/lib/collection-group-manager.js +91 -0
  3. package/lib/collection-importer.js +0 -24
  4. package/lib/collection.d.ts +26 -4
  5. package/lib/collection.js +190 -234
  6. package/lib/database-utils/index.js +3 -15
  7. package/lib/database.d.ts +9 -0
  8. package/lib/database.js +171 -299
  9. package/lib/decorators/must-have-filter-decorator.js +0 -7
  10. package/lib/decorators/transaction-decorator.js +5 -18
  11. package/lib/errors/identifier-error.js +0 -3
  12. package/lib/features/ReferencesMap.js +1 -14
  13. package/lib/features/referential-integrity-check.js +7 -21
  14. package/lib/field-repository/array-field-repository.js +5 -45
  15. package/lib/fields/array-field.js +0 -13
  16. package/lib/fields/belongs-to-field.js +24 -50
  17. package/lib/fields/belongs-to-many-field.js +29 -47
  18. package/lib/fields/boolean-field.js +0 -7
  19. package/lib/fields/context-field.js +2 -23
  20. package/lib/fields/date-field.d.ts +4 -0
  21. package/lib/fields/date-field.js +15 -7
  22. package/lib/fields/field.js +32 -85
  23. package/lib/fields/has-many-field.js +16 -49
  24. package/lib/fields/has-one-field.js +18 -52
  25. package/lib/fields/index.js +0 -44
  26. package/lib/fields/json-field.js +0 -12
  27. package/lib/fields/number-field.js +0 -23
  28. package/lib/fields/password-field.js +8 -35
  29. package/lib/fields/radio-field.js +0 -18
  30. package/lib/fields/relation-field.js +4 -16
  31. package/lib/fields/set-field.js +0 -8
  32. package/lib/fields/sort-field.js +84 -73
  33. package/lib/fields/string-field.js +0 -7
  34. package/lib/fields/text-field.js +0 -7
  35. package/lib/fields/time-field.js +0 -7
  36. package/lib/fields/uid-field.js +4 -22
  37. package/lib/fields/uuid-field.js +3 -12
  38. package/lib/fields/virtual-field.js +0 -7
  39. package/lib/filter-match.js +7 -22
  40. package/lib/filter-parser.js +38 -102
  41. package/lib/index.d.ts +3 -0
  42. package/lib/index.js +36 -42
  43. package/lib/inherited-collection.js +15 -62
  44. package/lib/inherited-map.js +7 -48
  45. package/lib/listeners/adjacency-list.d.ts +3 -0
  46. package/lib/listeners/adjacency-list.js +91 -0
  47. package/lib/listeners/index.d.ts +2 -0
  48. package/lib/listeners/index.js +12 -0
  49. package/lib/magic-attribute-model.js +58 -114
  50. package/lib/migration.js +7 -28
  51. package/lib/mock-database.d.ts +4 -4
  52. package/lib/mock-database.js +15 -18
  53. package/lib/model-hook.js +4 -35
  54. package/lib/model.js +12 -54
  55. package/lib/operators/array.js +2 -32
  56. package/lib/operators/association.js +0 -6
  57. package/lib/operators/boolean.js +0 -6
  58. package/lib/operators/child-collection.d.ts +2 -0
  59. package/lib/operators/child-collection.js +32 -0
  60. package/lib/operators/date.js +123 -60
  61. package/lib/operators/empty.js +3 -32
  62. package/lib/operators/eq.d.ts +2 -0
  63. package/lib/operators/eq.js +26 -0
  64. package/lib/operators/index.js +4 -7
  65. package/lib/operators/ne.js +5 -5
  66. package/lib/operators/notIn.js +0 -5
  67. package/lib/operators/string.js +0 -11
  68. package/lib/operators/utils.js +0 -6
  69. package/lib/options-parser.d.ts +1 -1
  70. package/lib/options-parser.js +47 -107
  71. package/lib/playground.js +0 -4
  72. package/lib/query-interface/mysql-query-interface.d.ts +18 -0
  73. package/lib/query-interface/mysql-query-interface.js +88 -0
  74. package/lib/query-interface/postgres-query-interface.d.ts +14 -0
  75. package/lib/query-interface/postgres-query-interface.js +99 -0
  76. package/lib/query-interface/query-interface-builder.d.ts +2 -0
  77. package/lib/query-interface/query-interface-builder.js +18 -0
  78. package/lib/query-interface/query-interface.d.ts +21 -0
  79. package/lib/query-interface/query-interface.js +48 -0
  80. package/lib/query-interface/sqlite-query-interface.d.ts +17 -0
  81. package/lib/query-interface/sqlite-query-interface.js +89 -0
  82. package/lib/relation-repository/belongs-to-many-repository.js +21 -78
  83. package/lib/relation-repository/belongs-to-repository.js +0 -3
  84. package/lib/relation-repository/hasmany-repository.js +8 -44
  85. package/lib/relation-repository/hasone-repository.js +0 -3
  86. package/lib/relation-repository/multiple-relation-repository.js +16 -68
  87. package/lib/relation-repository/relation-repository.js +5 -42
  88. package/lib/relation-repository/single-relation-repository.js +6 -43
  89. package/lib/repository.d.ts +1 -0
  90. package/lib/repository.js +36 -182
  91. package/lib/sql-parser/index.js +10527 -0
  92. package/lib/sql-parser/sql.pegjs +1297 -0
  93. package/lib/sync-runner.d.ts +1 -1
  94. package/lib/sync-runner.js +26 -64
  95. package/lib/update-associations.js +58 -157
  96. package/lib/update-guard.js +10 -49
  97. package/lib/utils.js +16 -54
  98. package/lib/value-parsers/array-value-parser.js +3 -21
  99. package/lib/value-parsers/base-value-parser.js +0 -13
  100. package/lib/value-parsers/boolean-value-parser.js +4 -10
  101. package/lib/value-parsers/date-value-parser.js +0 -23
  102. package/lib/value-parsers/index.js +0 -10
  103. package/lib/value-parsers/json-value-parser.js +0 -7
  104. package/lib/value-parsers/number-value-parser.js +0 -9
  105. package/lib/value-parsers/string-value-parser.js +3 -20
  106. package/lib/value-parsers/to-many-value-parser.js +1 -42
  107. package/lib/value-parsers/to-one-value-parser.js +0 -14
  108. package/lib/view/field-type-map.d.ts +47 -0
  109. package/lib/view/field-type-map.js +56 -0
  110. package/lib/view/view-inference.d.ts +31 -0
  111. package/lib/view/view-inference.js +92 -0
  112. package/lib/view-collection.d.ts +6 -0
  113. package/lib/view-collection.js +24 -0
  114. package/package.json +4 -3
  115. package/src/__tests__/collection.test.ts +44 -0
  116. package/src/__tests__/fields/date.test.ts +75 -0
  117. package/src/__tests__/fields/sort-field.test.ts +100 -0
  118. package/src/__tests__/filter.test.ts +60 -0
  119. package/src/__tests__/group.test.ts +50 -0
  120. package/src/__tests__/inhertits/collection-inherits.test.ts +114 -0
  121. package/src/__tests__/operator/date-operator.test.ts +244 -98
  122. package/src/__tests__/operator/eq.test.ts +76 -0
  123. package/src/__tests__/operator/ne.test.ts +19 -1
  124. package/src/__tests__/relation-repository/belongs-to-many-repository.test.ts +82 -0
  125. package/src/__tests__/repository/find.test.ts +33 -0
  126. package/src/__tests__/repository.test.ts +88 -0
  127. package/src/__tests__/sql-parser.test.ts +13 -0
  128. package/src/__tests__/tree.test.ts +217 -0
  129. package/src/__tests__/view/list-view.test.ts +34 -0
  130. package/src/__tests__/view/view-collection.test.ts +199 -0
  131. package/src/__tests__/view/view-inference.test.ts +145 -0
  132. package/src/__tests__/view/view-repository.test.ts +67 -0
  133. package/src/collection-group-manager.ts +94 -0
  134. package/src/collection.ts +126 -16
  135. package/src/database-utils/index.ts +1 -0
  136. package/src/database.ts +98 -17
  137. package/src/features/ReferencesMap.ts +3 -2
  138. package/src/fields/belongs-to-many-field.ts +23 -4
  139. package/src/fields/date-field.ts +18 -0
  140. package/src/fields/field.ts +17 -7
  141. package/src/fields/json-field.ts +1 -0
  142. package/src/fields/sort-field.ts +90 -29
  143. package/src/filter-parser.ts +2 -1
  144. package/src/index.ts +3 -1
  145. package/src/listeners/adjacency-list.ts +60 -0
  146. package/src/listeners/index.ts +7 -0
  147. package/src/mock-database.ts +14 -2
  148. package/src/model.ts +4 -0
  149. package/src/operators/child-collection.ts +24 -0
  150. package/src/operators/date.ts +108 -24
  151. package/src/operators/eq.ts +14 -0
  152. package/src/operators/index.ts +2 -0
  153. package/src/operators/ne.ts +12 -7
  154. package/src/options-parser.ts +25 -11
  155. package/src/query-interface/mysql-query-interface.ts +72 -0
  156. package/src/query-interface/postgres-query-interface.ts +103 -0
  157. package/src/query-interface/query-interface-builder.ts +14 -0
  158. package/src/query-interface/query-interface.ts +43 -0
  159. package/src/query-interface/sqlite-query-interface.ts +79 -0
  160. package/src/relation-repository/belongs-to-many-repository.ts +20 -1
  161. package/src/relation-repository/hasmany-repository.ts +5 -3
  162. package/src/relation-repository/multiple-relation-repository.ts +13 -1
  163. package/src/relation-repository/single-relation-repository.ts +2 -0
  164. package/src/repository.ts +6 -13
  165. package/src/sql-parser/index.js +10698 -0
  166. package/src/sql-parser/readme.md +2 -0
  167. package/src/sql-parser/sql.pegjs +1297 -0
  168. package/src/sync-runner.ts +27 -32
  169. package/src/update-associations.ts +26 -22
  170. package/src/utils.ts +4 -3
  171. package/src/view/field-type-map.ts +56 -0
  172. package/src/view/view-inference.ts +106 -0
  173. package/src/view-collection.ts +21 -0
@@ -4,26 +4,19 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  const mustHaveFilter = () => (target, propertyKey, descriptor) => {
9
8
  const oldValue = descriptor.value;
10
-
11
9
  descriptor.value = function () {
12
10
  const options = arguments[0];
13
-
14
11
  if (Array.isArray(options.values)) {
15
12
  return oldValue.apply(this, arguments);
16
13
  }
17
-
18
14
  if (!(options === null || options === void 0 ? void 0 : options.filter) && !(options === null || options === void 0 ? void 0 : options.filterByTk) && !(options === null || options === void 0 ? void 0 : options.forceUpdate)) {
19
15
  throw new Error(`must provide filter or filterByTk for ${propertyKey} call, or set forceUpdate to true`);
20
16
  }
21
-
22
17
  return oldValue.apply(this, arguments);
23
18
  };
24
-
25
19
  return descriptor;
26
20
  };
27
-
28
21
  var _default = mustHaveFilter;
29
22
  exports.default = _default;
@@ -4,29 +4,21 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.transactionWrapperBuilder = transactionWrapperBuilder;
7
-
8
7
  function _lodash() {
9
8
  const data = _interopRequireDefault(require("lodash"));
10
-
11
9
  _lodash = function _lodash() {
12
10
  return data;
13
11
  };
14
-
15
12
  return data;
16
13
  }
17
-
18
14
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
-
20
15
  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; }
21
-
22
16
  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; }
23
-
24
- 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; }
25
-
17
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
18
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
19
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
26
20
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
27
-
28
21
  function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
29
-
30
22
  function transactionWrapperBuilder(transactionGenerator) {
31
23
  return function transaction(transactionInjector) {
32
24
  return (target, name, descriptor) => {
@@ -34,21 +26,17 @@ function transactionWrapperBuilder(transactionGenerator) {
34
26
  descriptor.value = /*#__PURE__*/_asyncToGenerator(function* () {
35
27
  let transaction;
36
28
  let newTransaction = false;
37
-
38
29
  if (arguments.length > 0 && typeof arguments[0] === 'object') {
39
30
  transaction = arguments[0]['transaction'];
40
31
  }
41
-
42
32
  if (!transaction) {
43
33
  transaction = yield transactionGenerator.apply(this);
44
34
  newTransaction = true;
45
- } // 需要将 newTransaction 注入到被装饰函数参数内
46
-
47
-
35
+ }
36
+ // 需要将 newTransaction 注入到被装饰函数参数内
48
37
  if (newTransaction) {
49
38
  try {
50
39
  let callArguments;
51
-
52
40
  if (_lodash().default.isPlainObject(arguments[0])) {
53
41
  callArguments = _objectSpread(_objectSpread({}, arguments[0]), {}, {
54
42
  transaction
@@ -62,7 +50,6 @@ function transactionWrapperBuilder(transactionGenerator) {
62
50
  } else {
63
51
  throw new Error(`please provide transactionInjector for ${name} call`);
64
52
  }
65
-
66
53
  const results = yield oldValue.call(this, callArguments);
67
54
  yield transaction.commit();
68
55
  return results;
@@ -4,13 +4,10 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.IdentifierError = void 0;
7
-
8
7
  class IdentifierError extends Error {
9
8
  constructor(message) {
10
9
  super(message);
11
10
  this.name = 'IdentifierError';
12
11
  }
13
-
14
12
  }
15
-
16
13
  exports.IdentifierError = IdentifierError;
@@ -4,19 +4,16 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  class ReferencesMap {
9
8
  constructor() {
10
9
  this.map = new Map();
11
10
  }
12
-
13
11
  addReference(reference) {
14
12
  if (!reference.onDelete) {
15
13
  reference.onDelete = 'SET NULL';
16
14
  }
17
-
15
+ reference.onDelete = reference.onDelete.toUpperCase();
18
16
  const existReference = this.existReference(reference);
19
-
20
17
  if (existReference && existReference.onDelete !== reference.onDelete) {
21
18
  if (reference.onDelete === 'SET NULL') {
22
19
  // using existing reference
@@ -27,39 +24,29 @@ class ReferencesMap {
27
24
  throw new Error(`On Delete Conflict, exist reference ${JSON.stringify(existReference)}, new reference ${JSON.stringify(reference)}`);
28
25
  }
29
26
  }
30
-
31
27
  if (!existReference) {
32
28
  this.map.set(reference.targetCollectionName, [...(this.map.get(reference.targetCollectionName) || []), reference]);
33
29
  }
34
30
  }
35
-
36
31
  getReferences(collectionName) {
37
32
  return this.map.get(collectionName);
38
33
  }
39
-
40
34
  existReference(reference) {
41
35
  const references = this.map.get(reference.targetCollectionName);
42
-
43
36
  if (!references) {
44
37
  return null;
45
38
  }
46
-
47
39
  const keys = Object.keys(reference).filter(k => k !== 'onDelete');
48
40
  return references.find(ref => keys.every(key => ref[key] === reference[key]));
49
41
  }
50
-
51
42
  removeReference(reference) {
52
43
  const references = this.map.get(reference.targetCollectionName);
53
-
54
44
  if (!references) {
55
45
  return;
56
46
  }
57
-
58
47
  const keys = ['sourceCollectionName', 'sourceField', 'targetField', 'targetCollectionName'];
59
48
  this.map.set(reference.targetCollectionName, references.filter(ref => !keys.every(key => ref[key] === reference[key])));
60
49
  }
61
-
62
50
  }
63
-
64
51
  var _default = ReferencesMap;
65
52
  exports.default = _default;
@@ -4,45 +4,35 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.referentialIntegrityCheck = referentialIntegrityCheck;
7
-
8
7
  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(_e) { throw _e; }, 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(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
9
-
10
8
  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); }
11
-
12
9
  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; }
13
-
14
10
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
15
-
16
11
  function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
17
-
18
12
  function referentialIntegrityCheck(_x) {
19
13
  return _referentialIntegrityCheck.apply(this, arguments);
20
14
  }
21
-
22
15
  function _referentialIntegrityCheck() {
23
16
  _referentialIntegrityCheck = _asyncToGenerator(function* (options) {
24
17
  const referencedInstance = options.referencedInstance,
25
- db = options.db,
26
- transaction = options.transaction; // @ts-ignore
27
-
18
+ db = options.db,
19
+ transaction = options.transaction;
20
+ // @ts-ignore
28
21
  const collection = db.modelCollection.get(referencedInstance.constructor);
29
22
  const collectionName = collection.name;
30
23
  const references = db.referenceMap.getReferences(collectionName);
31
-
32
24
  if (!references) {
33
25
  return;
34
26
  }
35
-
36
27
  var _iterator = _createForOfIteratorHelper(references),
37
- _step;
38
-
28
+ _step;
39
29
  try {
40
30
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
41
31
  const reference = _step.value;
42
32
  const sourceCollectionName = reference.sourceCollectionName,
43
- sourceField = reference.sourceField,
44
- targetField = reference.targetField,
45
- onDelete = reference.onDelete;
33
+ sourceField = reference.sourceField,
34
+ targetField = reference.targetField,
35
+ onDelete = reference.onDelete;
46
36
  const sourceCollection = db.collections.get(sourceCollectionName);
47
37
  const sourceRepository = sourceCollection.repository;
48
38
  const filter = {
@@ -52,22 +42,18 @@ function _referentialIntegrityCheck() {
52
42
  filter,
53
43
  transaction
54
44
  });
55
-
56
45
  if (!referencingExists) {
57
46
  continue;
58
47
  }
59
-
60
48
  if (onDelete === 'RESTRICT') {
61
49
  throw new Error('RESTRICT');
62
50
  }
63
-
64
51
  if (onDelete === 'CASCADE') {
65
52
  yield sourceRepository.destroy({
66
53
  filter: filter,
67
54
  transaction
68
55
  });
69
56
  }
70
-
71
57
  if (onDelete === 'SET NULL') {
72
58
  yield sourceRepository.update({
73
59
  filter,
@@ -4,45 +4,33 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.ArrayFieldRepository = void 0;
7
-
8
7
  function _lodash() {
9
8
  const data = _interopRequireDefault(require("lodash"));
10
-
11
9
  _lodash = function _lodash() {
12
10
  return data;
13
11
  };
14
-
15
12
  return data;
16
13
  }
17
-
18
14
  var _transactionDecorator = require("../decorators/transaction-decorator");
19
-
20
15
  var _fields = require("../fields");
21
-
22
16
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
-
24
17
  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; }
25
-
26
18
  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; }
27
-
28
- 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; }
29
-
19
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
20
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
21
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
30
22
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
31
-
32
23
  function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
33
-
34
24
  var __decorate = void 0 && (void 0).__decorate || function (decorators, target, key, desc) {
35
25
  var c = arguments.length,
36
- r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,
37
- d;
26
+ r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,
27
+ d;
38
28
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
39
29
  return c > 3 && r && Object.defineProperty(target, key, r), r;
40
30
  };
41
-
42
31
  const transaction = (0, _transactionDecorator.transactionWrapperBuilder)(function () {
43
32
  return this.collection.model.sequelize.transaction();
44
33
  });
45
-
46
34
  class ArrayFieldRepository {
47
35
  constructor(collection, fieldName, targetValue) {
48
36
  this.collection = void 0;
@@ -52,32 +40,25 @@ class ArrayFieldRepository {
52
40
  this.fieldName = fieldName;
53
41
  this.targetValue = targetValue;
54
42
  const field = collection.getField(fieldName);
55
-
56
43
  if (!(field instanceof _fields.ArrayField)) {
57
44
  throw new Error('Field must be of type Array');
58
45
  }
59
46
  }
60
-
61
47
  get(options) {
62
48
  var _this = this;
63
-
64
49
  return _asyncToGenerator(function* () {
65
50
  const instance = yield _this.getInstance(options);
66
51
  return instance.get(_this.fieldName);
67
52
  })();
68
53
  }
69
-
70
54
  find(options) {
71
55
  var _this2 = this;
72
-
73
56
  return _asyncToGenerator(function* () {
74
57
  return yield _this2.get(options);
75
58
  })();
76
59
  }
77
-
78
60
  set(options) {
79
61
  var _this3 = this;
80
-
81
62
  return _asyncToGenerator(function* () {
82
63
  const transaction = options.transaction;
83
64
  const instance = yield _this3.getInstance({
@@ -87,25 +68,20 @@ class ArrayFieldRepository {
87
68
  yield instance.save({
88
69
  transaction
89
70
  });
90
-
91
71
  if (options.hooks !== false) {
92
72
  yield _this3.emitAfterSave(instance, options);
93
73
  }
94
74
  })();
95
75
  }
96
-
97
76
  emitAfterSave(instance, options) {
98
77
  var _this4 = this;
99
-
100
78
  return _asyncToGenerator(function* () {
101
79
  yield _this4.collection.db.emitAsync(`${_this4.collection.name}.afterSaveWithAssociations`, instance, _objectSpread({}, options));
102
80
  instance.clearChangedWithAssociations();
103
81
  })();
104
82
  }
105
-
106
83
  toggle(options) {
107
84
  var _this5 = this;
108
-
109
85
  return _asyncToGenerator(function* () {
110
86
  const transaction = options.transaction;
111
87
  const instance = yield _this5.getInstance({
@@ -117,16 +93,13 @@ class ArrayFieldRepository {
117
93
  yield instance.save({
118
94
  transaction
119
95
  });
120
-
121
96
  if (options.hooks !== false) {
122
97
  yield _this5.emitAfterSave(instance, options);
123
98
  }
124
99
  })();
125
100
  }
126
-
127
101
  add(options) {
128
102
  var _this6 = this;
129
-
130
103
  return _asyncToGenerator(function* () {
131
104
  const transaction = options.transaction;
132
105
  const instance = yield _this6.getInstance({
@@ -138,16 +111,13 @@ class ArrayFieldRepository {
138
111
  yield instance.save({
139
112
  transaction
140
113
  });
141
-
142
114
  if (options.hooks !== false) {
143
115
  yield _this6.emitAfterSave(instance, options);
144
116
  }
145
117
  })();
146
118
  }
147
-
148
119
  remove(options) {
149
120
  var _this7 = this;
150
-
151
121
  return _asyncToGenerator(function* () {
152
122
  const transaction = options.transaction;
153
123
  const instance = yield _this7.getInstance({
@@ -158,48 +128,38 @@ class ArrayFieldRepository {
158
128
  yield instance.save({
159
129
  transaction
160
130
  });
161
-
162
131
  if (options.hooks !== false) {
163
132
  yield _this7.emitAfterSave(instance, options);
164
133
  }
165
134
  })();
166
135
  }
167
-
168
136
  getInstance(options) {
169
137
  return this.collection.repository.findOne({
170
138
  filterByTk: this.targetValue
171
139
  });
172
140
  }
173
-
174
141
  }
175
-
176
142
  exports.ArrayFieldRepository = ArrayFieldRepository;
177
-
178
143
  __decorate([transaction()], ArrayFieldRepository.prototype, "get", null);
179
-
180
144
  __decorate([transaction()], ArrayFieldRepository.prototype, "find", null);
181
-
182
145
  __decorate([transaction((args, transaction) => {
183
146
  return {
184
147
  values: args[0],
185
148
  transaction
186
149
  };
187
150
  })], ArrayFieldRepository.prototype, "set", null);
188
-
189
151
  __decorate([transaction((args, transaction) => {
190
152
  return {
191
153
  value: args[0],
192
154
  transaction
193
155
  };
194
156
  })], ArrayFieldRepository.prototype, "toggle", null);
195
-
196
157
  __decorate([transaction((args, transaction) => {
197
158
  return {
198
159
  values: args[0],
199
160
  transaction
200
161
  };
201
162
  })], ArrayFieldRepository.prototype, "add", null);
202
-
203
163
  __decorate([transaction((args, transaction) => {
204
164
  return {
205
165
  values: args[0],
@@ -4,51 +4,38 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.ArrayField = void 0;
7
-
8
7
  function _sequelize() {
9
8
  const data = require("sequelize");
10
-
11
9
  _sequelize = function _sequelize() {
12
10
  return data;
13
11
  };
14
-
15
12
  return data;
16
13
  }
17
-
18
14
  var _field = require("./field");
19
-
20
15
  class ArrayField extends _field.Field {
21
16
  constructor(...args) {
22
17
  super(...args);
23
-
24
18
  this.sortValue = model => {
25
19
  const oldValue = model.get(this.options.name);
26
-
27
20
  if (oldValue) {
28
21
  const newValue = oldValue.sort();
29
22
  model.set(this.options.name, newValue);
30
23
  }
31
24
  };
32
25
  }
33
-
34
26
  get dataType() {
35
27
  if (this.database.sequelize.getDialect() === 'postgres') {
36
28
  return _sequelize().DataTypes.JSONB;
37
29
  }
38
-
39
30
  return _sequelize().DataTypes.JSON;
40
31
  }
41
-
42
32
  bind() {
43
33
  super.bind();
44
34
  this.on('beforeSave', this.sortValue);
45
35
  }
46
-
47
36
  unbind() {
48
37
  super.unbind();
49
38
  this.off('beforeSave', this.sortValue);
50
39
  }
51
-
52
40
  }
53
-
54
41
  exports.ArrayField = ArrayField;
@@ -4,49 +4,37 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.BelongsToField = void 0;
7
-
8
7
  function _lodash() {
9
8
  const data = require("lodash");
10
-
11
9
  _lodash = function _lodash() {
12
10
  return data;
13
11
  };
14
-
15
12
  return data;
16
13
  }
17
-
18
14
  function _sequelize() {
19
15
  const data = require("sequelize");
20
-
21
16
  _sequelize = function _sequelize() {
22
17
  return data;
23
18
  };
24
-
25
19
  return data;
26
20
  }
27
-
28
21
  var _utils = require("../utils");
29
-
30
22
  var _relationField = require("./relation-field");
31
-
32
23
  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
24
  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
-
25
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
26
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
27
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
38
28
  class BelongsToField extends _relationField.RelationField {
39
29
  get dataType() {
40
30
  return 'BelongsTo';
41
31
  }
42
-
43
32
  get target() {
44
33
  const _this$options = this.options,
45
- target = _this$options.target,
46
- name = _this$options.name;
34
+ target = _this$options.target,
35
+ name = _this$options.name;
47
36
  return target || _sequelize().Utils.pluralize(name);
48
37
  }
49
-
50
38
  static toReference(db, association, onDelete) {
51
39
  const targetKey = association.targetKey;
52
40
  return {
@@ -57,91 +45,77 @@ class BelongsToField extends _relationField.RelationField {
57
45
  onDelete: onDelete
58
46
  };
59
47
  }
60
-
61
48
  reference(association) {
62
49
  return BelongsToField.toReference(this.database, association, this.options.onDelete);
63
50
  }
64
-
65
51
  bind() {
66
52
  const _this$context = this.context,
67
- database = _this$context.database,
68
- collection = _this$context.collection;
69
- const Target = this.TargetModel; // if target model not exists, add it to pending field,
53
+ database = _this$context.database,
54
+ collection = _this$context.collection;
55
+ const Target = this.TargetModel;
56
+ // if target model not exists, add it to pending field,
70
57
  // it will bind later
71
-
72
58
  if (!Target) {
73
59
  database.addPendingField(this);
74
60
  return false;
75
61
  }
76
-
77
62
  if (collection.model.associations[this.name]) {
78
63
  delete collection.model.associations[this.name];
79
- } // define relation on sequelize model
80
-
81
-
64
+ }
65
+ // define relation on sequelize model
82
66
  const association = collection.model.belongsTo(Target, _objectSpread({
83
67
  as: this.name,
84
68
  constraints: false
85
- }, (0, _lodash().omit)(this.options, ['name', 'type', 'target', 'onDelete']))); // inverse relation
69
+ }, (0, _lodash().omit)(this.options, ['name', 'type', 'target', 'onDelete'])));
70
+ // inverse relation
86
71
  // this.TargetModel.hasMany(collection.model);
87
72
  // 建立关系之后从 pending 列表中删除
88
-
89
73
  database.removePendingField(this);
90
-
91
74
  if (!this.options.foreignKey) {
92
75
  this.options.foreignKey = association.foreignKey;
93
76
  }
94
-
95
77
  try {
96
78
  (0, _utils.checkIdentifier)(this.options.foreignKey);
97
79
  } catch (error) {
98
80
  this.unbind();
99
81
  throw error;
100
82
  }
101
-
102
83
  if (!this.options.sourceKey) {
103
84
  // @ts-ignore
104
85
  this.options.sourceKey = association.sourceKey;
105
86
  }
106
-
107
87
  this.collection.addIndex([this.options.foreignKey]);
108
88
  this.database.referenceMap.addReference(this.reference(association));
109
89
  return true;
110
90
  }
111
-
112
91
  unbind() {
113
92
  const _this$context2 = this.context,
114
- database = _this$context2.database,
115
- collection = _this$context2.collection; // 如果关系字段还没建立就删除了,也同步删除待建立关联的关系字段
116
-
117
- database.removePendingField(this); // 如果外键没有显式的创建,关系表也无反向关联字段,删除关系时,外键也删除掉
118
-
93
+ database = _this$context2.database,
94
+ collection = _this$context2.collection;
95
+ // 如果关系字段还没建立就删除了,也同步删除待建立关联的关系字段
96
+ database.removePendingField(this);
97
+ // 如果外键没有显式的创建,关系表也无反向关联字段,删除关系时,外键也删除掉
119
98
  const tcoll = database.collections.get(this.target);
120
99
  const foreignKey = this.options.foreignKey;
121
100
  const field1 = collection.getField(foreignKey);
122
101
  const field2 = tcoll ? tcoll.findField(field => {
123
102
  return field.type === 'hasMany' && field.foreignKey === foreignKey;
124
103
  }) : null;
125
-
126
104
  if (!field1 && !field2) {
127
105
  collection.model.removeAttribute(foreignKey);
128
106
  }
129
-
130
107
  const association = collection.model.associations[this.name];
131
-
132
108
  if (association) {
133
109
  const reference = this.reference(association);
134
110
  this.database.referenceMap.removeReference(reference);
135
111
  }
136
-
137
- this.clearAccessors(); // 删掉 model 的关联字段
138
-
139
- delete collection.model.associations[this.name]; // @ts-ignore
140
-
141
- collection.model.refreshAttributes(); // this.collection.removeIndex([this.options.foreignKey]);
112
+ this.clearAccessors();
113
+ // 删掉 model 的关联字段
114
+ delete collection.model.associations[this.name];
115
+ // @ts-ignore
116
+ collection.model.refreshAttributes();
117
+ // this.collection.removeIndex([this.options.foreignKey]);
142
118
  }
143
-
144
119
  }
145
-
146
120
  exports.BelongsToField = BelongsToField;
147
121
  BelongsToField.type = 'belongsTo';