@nocobase/database 0.9.1-alpha.2 → 0.9.2-alpha.2
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 +24 -3
- package/lib/collection.js +176 -236
- package/lib/database-utils/index.js +3 -15
- package/lib/database.d.ts +3 -0
- package/lib/database.js +160 -298
- 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 +23 -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 +37 -101
- 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 +11 -0
- package/lib/query-interface/mysql-query-interface.js +59 -10
- package/lib/query-interface/postgres-query-interface.d.ts +8 -0
- package/lib/query-interface/postgres-query-interface.js +70 -12
- package/lib/query-interface/query-interface-builder.js +0 -5
- package/lib/query-interface/query-interface.d.ts +12 -0
- package/lib/query-interface/query-interface.js +33 -3
- package/lib/query-interface/sqlite-query-interface.d.ts +11 -0
- package/lib/query-interface/sqlite-query-interface.js +61 -10
- 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 +14 -68
- package/lib/relation-repository/relation-repository.js +5 -42
- package/lib/relation-repository/single-relation-repository.js +5 -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.js +19 -54
- package/lib/update-associations.js +58 -157
- package/lib/update-guard.js +10 -49
- package/lib/utils.js +6 -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 -4
- 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 +3 -3
- 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 +108 -14
- package/src/database-utils/index.ts +1 -0
- package/src/database.ts +79 -12
- package/src/features/ReferencesMap.ts +3 -2
- package/src/fields/belongs-to-many-field.ts +15 -2
- package/src/fields/date-field.ts +18 -0
- package/src/fields/field.ts +16 -8
- package/src/fields/json-field.ts +1 -0
- package/src/fields/sort-field.ts +90 -29
- package/src/filter-parser.ts +1 -0
- 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 +53 -1
- package/src/query-interface/postgres-query-interface.ts +84 -3
- package/src/query-interface/query-interface.ts +31 -0
- package/src/query-interface/sqlite-query-interface.ts +62 -1
- 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 +9 -1
- 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 +13 -15
- package/src/update-associations.ts +26 -22
- package/src/view/field-type-map.ts +56 -0
- package/src/view/view-inference.ts +106 -0
- package/src/view-collection.ts +21 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import Database from './database';
|
|
2
|
+
export interface CollectionGroup {
|
|
3
|
+
namespace: string;
|
|
4
|
+
collections: string[];
|
|
5
|
+
function: string;
|
|
6
|
+
dumpable: 'required' | 'optional' | 'skip';
|
|
7
|
+
delayRestore?: any;
|
|
8
|
+
}
|
|
9
|
+
export declare class CollectionGroupManager {
|
|
10
|
+
db: Database;
|
|
11
|
+
constructor(db: Database);
|
|
12
|
+
getGroups(): CollectionGroup[];
|
|
13
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.CollectionGroupManager = void 0;
|
|
7
|
+
function _lodash() {
|
|
8
|
+
const data = require("lodash");
|
|
9
|
+
_lodash = function _lodash() {
|
|
10
|
+
return data;
|
|
11
|
+
};
|
|
12
|
+
return data;
|
|
13
|
+
}
|
|
14
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
15
|
+
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."); }
|
|
16
|
+
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); }
|
|
17
|
+
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; }
|
|
18
|
+
function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
|
|
19
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
20
|
+
class CollectionGroupManager {
|
|
21
|
+
constructor(db) {
|
|
22
|
+
this.db = void 0;
|
|
23
|
+
this.db = db;
|
|
24
|
+
}
|
|
25
|
+
getGroups() {
|
|
26
|
+
const collections = [...this.db.collections.values()];
|
|
27
|
+
const groups = new Map();
|
|
28
|
+
const skipped = [];
|
|
29
|
+
for (var _i = 0, _collections = collections; _i < _collections.length; _i++) {
|
|
30
|
+
const collection = _collections[_i];
|
|
31
|
+
const groupKey = collection.options.namespace;
|
|
32
|
+
if (!groupKey) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
const _groupKey$split = groupKey.split('.'),
|
|
36
|
+
_groupKey$split2 = _slicedToArray(_groupKey$split, 2),
|
|
37
|
+
namespace = _groupKey$split2[0],
|
|
38
|
+
groupFunc = _groupKey$split2[1];
|
|
39
|
+
if (!groupFunc) {
|
|
40
|
+
skipped.push({
|
|
41
|
+
name: collection.name,
|
|
42
|
+
reason: 'no-group-function'
|
|
43
|
+
});
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (!groups.has(groupKey)) {
|
|
47
|
+
const dumpable = (() => {
|
|
48
|
+
if (!collection.options.duplicator) {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
if ((0, _lodash().isString)(collection.options.duplicator)) {
|
|
52
|
+
return {
|
|
53
|
+
dumpable: collection.options.duplicator
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
return collection.options.duplicator;
|
|
57
|
+
})();
|
|
58
|
+
if (!dumpable) {
|
|
59
|
+
skipped.push({
|
|
60
|
+
name: collection.name,
|
|
61
|
+
reason: 'no-dumpable'
|
|
62
|
+
});
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const group = {
|
|
66
|
+
namespace,
|
|
67
|
+
function: groupFunc,
|
|
68
|
+
collections: dumpable.with ? (0, _lodash().castArray)(dumpable.with) : [],
|
|
69
|
+
dumpable: dumpable.dumpable
|
|
70
|
+
};
|
|
71
|
+
if (dumpable.delayRestore) {
|
|
72
|
+
group.delayRestore = dumpable.delayRestore;
|
|
73
|
+
}
|
|
74
|
+
groups.set(groupKey, group);
|
|
75
|
+
}
|
|
76
|
+
const group = groups.get(groupKey);
|
|
77
|
+
group.collections.push(collection.name);
|
|
78
|
+
}
|
|
79
|
+
const results = [...groups.values()];
|
|
80
|
+
const groupCollections = results.map(i => i.collections).flat();
|
|
81
|
+
for (var _i2 = 0, _skipped = skipped; _i2 < _skipped.length; _i2++) {
|
|
82
|
+
const skipItem = _skipped[_i2];
|
|
83
|
+
if (groupCollections.includes(skipItem.name)) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
this.db.logger.warn(`collection ${skipItem.name} is not in any collection group, reason: ${skipItem.reason}.`);
|
|
87
|
+
}
|
|
88
|
+
return results;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
exports.CollectionGroupManager = CollectionGroupManager;
|
|
@@ -4,69 +4,49 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.ImporterReader = void 0;
|
|
7
|
-
|
|
8
7
|
function _path() {
|
|
9
8
|
const data = _interopRequireDefault(require("path"));
|
|
10
|
-
|
|
11
9
|
_path = function _path() {
|
|
12
10
|
return data;
|
|
13
11
|
};
|
|
14
|
-
|
|
15
12
|
return data;
|
|
16
13
|
}
|
|
17
|
-
|
|
18
14
|
function _promises() {
|
|
19
15
|
const data = require("fs/promises");
|
|
20
|
-
|
|
21
16
|
_promises = function _promises() {
|
|
22
17
|
return data;
|
|
23
18
|
};
|
|
24
|
-
|
|
25
19
|
return data;
|
|
26
20
|
}
|
|
27
|
-
|
|
28
21
|
function _lodash() {
|
|
29
22
|
const data = require("lodash");
|
|
30
|
-
|
|
31
23
|
_lodash = function _lodash() {
|
|
32
24
|
return data;
|
|
33
25
|
};
|
|
34
|
-
|
|
35
26
|
return data;
|
|
36
27
|
}
|
|
37
|
-
|
|
38
28
|
function _utils() {
|
|
39
29
|
const data = require("@nocobase/utils");
|
|
40
|
-
|
|
41
30
|
_utils = function _utils() {
|
|
42
31
|
return data;
|
|
43
32
|
};
|
|
44
|
-
|
|
45
33
|
return data;
|
|
46
34
|
}
|
|
47
|
-
|
|
48
35
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
49
|
-
|
|
50
36
|
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); } }
|
|
51
|
-
|
|
52
37
|
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); }); }; }
|
|
53
|
-
|
|
54
38
|
class ImporterReader {
|
|
55
39
|
constructor(directory, extensions) {
|
|
56
40
|
this.directory = void 0;
|
|
57
41
|
this.extensions = void 0;
|
|
58
42
|
this.directory = directory;
|
|
59
|
-
|
|
60
43
|
if (!extensions) {
|
|
61
44
|
extensions = ['js', 'ts', 'json'];
|
|
62
45
|
}
|
|
63
|
-
|
|
64
46
|
this.extensions = new Set(extensions);
|
|
65
47
|
}
|
|
66
|
-
|
|
67
48
|
read() {
|
|
68
49
|
var _this = this;
|
|
69
|
-
|
|
70
50
|
return _asyncToGenerator(function* () {
|
|
71
51
|
const files = yield (0, _promises().readdir)(_this.directory, {
|
|
72
52
|
encoding: 'utf-8'
|
|
@@ -75,9 +55,7 @@ class ImporterReader {
|
|
|
75
55
|
if (fileName.endsWith('.d.ts')) {
|
|
76
56
|
return false;
|
|
77
57
|
}
|
|
78
|
-
|
|
79
58
|
const ext = _path().default.parse(fileName).ext.replace('.', '');
|
|
80
|
-
|
|
81
59
|
return _this.extensions.has(ext);
|
|
82
60
|
}).map(fileName => {
|
|
83
61
|
const mod = (0, _utils().requireModule)(_path().default.join(_this.directory, fileName));
|
|
@@ -86,7 +64,5 @@ class ImporterReader {
|
|
|
86
64
|
return (yield Promise.all(modules)).filter(module => (0, _lodash().isPlainObject)(module)).map(module => (0, _lodash().cloneDeep)(module));
|
|
87
65
|
})();
|
|
88
66
|
}
|
|
89
|
-
|
|
90
67
|
}
|
|
91
|
-
|
|
92
68
|
exports.ImporterReader = ImporterReader;
|
package/lib/collection.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { EventEmitter } from 'events';
|
|
3
3
|
import { ModelOptions, ModelStatic, QueryInterfaceDropTableOptions, SyncOptions, Transactionable } from 'sequelize';
|
|
4
4
|
import { Database } from './database';
|
|
5
|
-
import { Field, FieldOptions } from './fields';
|
|
5
|
+
import { BelongsToField, Field, FieldOptions, HasManyField } from './fields';
|
|
6
6
|
import { Model } from './model';
|
|
7
7
|
import { Repository } from './repository';
|
|
8
8
|
export declare type RepositoryType = typeof Repository;
|
|
@@ -10,10 +10,18 @@ export declare type CollectionSortable = string | boolean | {
|
|
|
10
10
|
name?: string;
|
|
11
11
|
scopeKey?: string;
|
|
12
12
|
};
|
|
13
|
+
declare type dumpable = 'required' | 'optional' | 'skip';
|
|
13
14
|
export interface CollectionOptions extends Omit<ModelOptions, 'name' | 'hooks'> {
|
|
14
15
|
name: string;
|
|
16
|
+
namespace?: string;
|
|
17
|
+
duplicator?: dumpable | {
|
|
18
|
+
dumpable: dumpable;
|
|
19
|
+
with?: string[] | string;
|
|
20
|
+
delayRestore?: any;
|
|
21
|
+
};
|
|
15
22
|
tableName?: string;
|
|
16
23
|
inherits?: string[] | string;
|
|
24
|
+
viewName?: string;
|
|
17
25
|
filterTargetKey?: string;
|
|
18
26
|
fields?: FieldOptions[];
|
|
19
27
|
model?: string | ModelStatic<Model>;
|
|
@@ -27,6 +35,7 @@ export interface CollectionOptions extends Omit<ModelOptions, 'name' | 'hooks'>
|
|
|
27
35
|
* @default 'options'
|
|
28
36
|
*/
|
|
29
37
|
magicAttribute?: string;
|
|
38
|
+
tree?: string;
|
|
30
39
|
[key: string]: any;
|
|
31
40
|
}
|
|
32
41
|
export interface CollectionContext {
|
|
@@ -43,11 +52,17 @@ export declare class Collection<TModelAttributes extends {} = any, TCreationAttr
|
|
|
43
52
|
get name(): string;
|
|
44
53
|
get titleField(): string;
|
|
45
54
|
get db(): Database;
|
|
55
|
+
get treeParentField(): BelongsToField | null;
|
|
56
|
+
get treeChildrenField(): HasManyField | null;
|
|
46
57
|
constructor(options: CollectionOptions, context: CollectionContext);
|
|
47
58
|
private checkOptions;
|
|
48
59
|
private checkTableName;
|
|
49
60
|
tableName(): any;
|
|
50
|
-
|
|
61
|
+
protected sequelizeModelOptions(): {
|
|
62
|
+
modelName: string;
|
|
63
|
+
sequelize: import("sequelize").Sequelize;
|
|
64
|
+
tableName: any;
|
|
65
|
+
};
|
|
51
66
|
/**
|
|
52
67
|
* TODO
|
|
53
68
|
*/
|
|
@@ -89,7 +104,13 @@ export declare class Collection<TModelAttributes extends {} = any, TCreationAttr
|
|
|
89
104
|
sync(syncOptions?: SyncOptions): Promise<void>;
|
|
90
105
|
isInherited(): boolean;
|
|
91
106
|
isParent(): boolean;
|
|
92
|
-
|
|
107
|
+
getTableNameWithSchema(): any;
|
|
108
|
+
tableNameAsString(options?: {
|
|
109
|
+
ignorePublicSchema: boolean;
|
|
110
|
+
}): any;
|
|
111
|
+
getTableNameWithSchemaAsString(): string;
|
|
93
112
|
quotedTableName(): any;
|
|
94
113
|
collectionSchema(): string;
|
|
114
|
+
isView(): boolean;
|
|
95
115
|
}
|
|
116
|
+
export {};
|