@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.
- package/lib/collection-group-manager.d.ts +13 -0
- package/lib/collection-group-manager.js +91 -0
- package/lib/collection-importer.js +0 -24
- package/lib/collection.d.ts +26 -4
- package/lib/collection.js +190 -234
- package/lib/database-utils/index.js +3 -15
- package/lib/database.d.ts +9 -0
- package/lib/database.js +171 -299
- package/lib/decorators/must-have-filter-decorator.js +0 -7
- package/lib/decorators/transaction-decorator.js +5 -18
- package/lib/errors/identifier-error.js +0 -3
- package/lib/features/ReferencesMap.js +1 -14
- package/lib/features/referential-integrity-check.js +7 -21
- package/lib/field-repository/array-field-repository.js +5 -45
- package/lib/fields/array-field.js +0 -13
- package/lib/fields/belongs-to-field.js +24 -50
- package/lib/fields/belongs-to-many-field.js +29 -47
- package/lib/fields/boolean-field.js +0 -7
- package/lib/fields/context-field.js +2 -23
- package/lib/fields/date-field.d.ts +4 -0
- package/lib/fields/date-field.js +15 -7
- package/lib/fields/field.js +32 -85
- package/lib/fields/has-many-field.js +16 -49
- package/lib/fields/has-one-field.js +18 -52
- package/lib/fields/index.js +0 -44
- package/lib/fields/json-field.js +0 -12
- package/lib/fields/number-field.js +0 -23
- package/lib/fields/password-field.js +8 -35
- package/lib/fields/radio-field.js +0 -18
- package/lib/fields/relation-field.js +4 -16
- package/lib/fields/set-field.js +0 -8
- package/lib/fields/sort-field.js +84 -73
- package/lib/fields/string-field.js +0 -7
- package/lib/fields/text-field.js +0 -7
- package/lib/fields/time-field.js +0 -7
- package/lib/fields/uid-field.js +4 -22
- package/lib/fields/uuid-field.js +3 -12
- package/lib/fields/virtual-field.js +0 -7
- package/lib/filter-match.js +7 -22
- package/lib/filter-parser.js +38 -102
- package/lib/index.d.ts +3 -0
- package/lib/index.js +36 -42
- package/lib/inherited-collection.js +15 -62
- package/lib/inherited-map.js +7 -48
- package/lib/listeners/adjacency-list.d.ts +3 -0
- package/lib/listeners/adjacency-list.js +91 -0
- package/lib/listeners/index.d.ts +2 -0
- package/lib/listeners/index.js +12 -0
- package/lib/magic-attribute-model.js +58 -114
- package/lib/migration.js +7 -28
- package/lib/mock-database.d.ts +4 -4
- package/lib/mock-database.js +15 -18
- package/lib/model-hook.js +4 -35
- package/lib/model.js +12 -54
- package/lib/operators/array.js +2 -32
- package/lib/operators/association.js +0 -6
- package/lib/operators/boolean.js +0 -6
- package/lib/operators/child-collection.d.ts +2 -0
- package/lib/operators/child-collection.js +32 -0
- package/lib/operators/date.js +123 -60
- package/lib/operators/empty.js +3 -32
- package/lib/operators/eq.d.ts +2 -0
- package/lib/operators/eq.js +26 -0
- package/lib/operators/index.js +4 -7
- package/lib/operators/ne.js +5 -5
- package/lib/operators/notIn.js +0 -5
- package/lib/operators/string.js +0 -11
- package/lib/operators/utils.js +0 -6
- package/lib/options-parser.d.ts +1 -1
- package/lib/options-parser.js +47 -107
- package/lib/playground.js +0 -4
- package/lib/query-interface/mysql-query-interface.d.ts +18 -0
- package/lib/query-interface/mysql-query-interface.js +88 -0
- package/lib/query-interface/postgres-query-interface.d.ts +14 -0
- package/lib/query-interface/postgres-query-interface.js +99 -0
- package/lib/query-interface/query-interface-builder.d.ts +2 -0
- package/lib/query-interface/query-interface-builder.js +18 -0
- package/lib/query-interface/query-interface.d.ts +21 -0
- package/lib/query-interface/query-interface.js +48 -0
- package/lib/query-interface/sqlite-query-interface.d.ts +17 -0
- package/lib/query-interface/sqlite-query-interface.js +89 -0
- package/lib/relation-repository/belongs-to-many-repository.js +21 -78
- package/lib/relation-repository/belongs-to-repository.js +0 -3
- package/lib/relation-repository/hasmany-repository.js +8 -44
- package/lib/relation-repository/hasone-repository.js +0 -3
- package/lib/relation-repository/multiple-relation-repository.js +16 -68
- package/lib/relation-repository/relation-repository.js +5 -42
- package/lib/relation-repository/single-relation-repository.js +6 -43
- package/lib/repository.d.ts +1 -0
- package/lib/repository.js +36 -182
- package/lib/sql-parser/index.js +10527 -0
- package/lib/sql-parser/sql.pegjs +1297 -0
- package/lib/sync-runner.d.ts +1 -1
- package/lib/sync-runner.js +26 -64
- package/lib/update-associations.js +58 -157
- package/lib/update-guard.js +10 -49
- package/lib/utils.js +16 -54
- package/lib/value-parsers/array-value-parser.js +3 -21
- package/lib/value-parsers/base-value-parser.js +0 -13
- package/lib/value-parsers/boolean-value-parser.js +4 -10
- package/lib/value-parsers/date-value-parser.js +0 -23
- package/lib/value-parsers/index.js +0 -10
- package/lib/value-parsers/json-value-parser.js +0 -7
- package/lib/value-parsers/number-value-parser.js +0 -9
- package/lib/value-parsers/string-value-parser.js +3 -20
- package/lib/value-parsers/to-many-value-parser.js +1 -42
- package/lib/value-parsers/to-one-value-parser.js +0 -14
- package/lib/view/field-type-map.d.ts +47 -0
- package/lib/view/field-type-map.js +56 -0
- package/lib/view/view-inference.d.ts +31 -0
- package/lib/view/view-inference.js +92 -0
- package/lib/view-collection.d.ts +6 -0
- package/lib/view-collection.js +24 -0
- package/package.json +4 -3
- package/src/__tests__/collection.test.ts +44 -0
- package/src/__tests__/fields/date.test.ts +75 -0
- package/src/__tests__/fields/sort-field.test.ts +100 -0
- package/src/__tests__/filter.test.ts +60 -0
- package/src/__tests__/group.test.ts +50 -0
- package/src/__tests__/inhertits/collection-inherits.test.ts +114 -0
- package/src/__tests__/operator/date-operator.test.ts +244 -98
- package/src/__tests__/operator/eq.test.ts +76 -0
- package/src/__tests__/operator/ne.test.ts +19 -1
- package/src/__tests__/relation-repository/belongs-to-many-repository.test.ts +82 -0
- package/src/__tests__/repository/find.test.ts +33 -0
- package/src/__tests__/repository.test.ts +88 -0
- package/src/__tests__/sql-parser.test.ts +13 -0
- package/src/__tests__/tree.test.ts +217 -0
- package/src/__tests__/view/list-view.test.ts +34 -0
- package/src/__tests__/view/view-collection.test.ts +199 -0
- package/src/__tests__/view/view-inference.test.ts +145 -0
- package/src/__tests__/view/view-repository.test.ts +67 -0
- package/src/collection-group-manager.ts +94 -0
- package/src/collection.ts +126 -16
- package/src/database-utils/index.ts +1 -0
- package/src/database.ts +98 -17
- package/src/features/ReferencesMap.ts +3 -2
- package/src/fields/belongs-to-many-field.ts +23 -4
- package/src/fields/date-field.ts +18 -0
- package/src/fields/field.ts +17 -7
- package/src/fields/json-field.ts +1 -0
- package/src/fields/sort-field.ts +90 -29
- package/src/filter-parser.ts +2 -1
- package/src/index.ts +3 -1
- package/src/listeners/adjacency-list.ts +60 -0
- package/src/listeners/index.ts +7 -0
- package/src/mock-database.ts +14 -2
- package/src/model.ts +4 -0
- package/src/operators/child-collection.ts +24 -0
- package/src/operators/date.ts +108 -24
- package/src/operators/eq.ts +14 -0
- package/src/operators/index.ts +2 -0
- package/src/operators/ne.ts +12 -7
- package/src/options-parser.ts +25 -11
- package/src/query-interface/mysql-query-interface.ts +72 -0
- package/src/query-interface/postgres-query-interface.ts +103 -0
- package/src/query-interface/query-interface-builder.ts +14 -0
- package/src/query-interface/query-interface.ts +43 -0
- package/src/query-interface/sqlite-query-interface.ts +79 -0
- package/src/relation-repository/belongs-to-many-repository.ts +20 -1
- package/src/relation-repository/hasmany-repository.ts +5 -3
- package/src/relation-repository/multiple-relation-repository.ts +13 -1
- package/src/relation-repository/single-relation-repository.ts +2 -0
- package/src/repository.ts +6 -13
- package/src/sql-parser/index.js +10698 -0
- package/src/sql-parser/readme.md +2 -0
- package/src/sql-parser/sql.pegjs +1297 -0
- package/src/sync-runner.ts +27 -32
- package/src/update-associations.ts +26 -22
- package/src/utils.ts +4 -3
- package/src/view/field-type-map.ts +56 -0
- package/src/view/view-inference.ts +106 -0
- 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
|
|
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
|
-
}
|
|
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
|
-
|
|
26
|
-
|
|
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
|
-
|
|
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
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
|
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
|
-
|
|
37
|
-
|
|
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
|
|
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
|
-
|
|
46
|
-
|
|
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
|
-
|
|
68
|
-
|
|
69
|
-
const Target = this.TargetModel;
|
|
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
|
-
}
|
|
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'])));
|
|
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
|
-
|
|
115
|
-
|
|
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
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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';
|