@nocobase/database 0.9.0-alpha.2 → 0.9.1-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-importer.js +1 -1
- package/lib/collection.d.ts +9 -2
- package/lib/collection.js +153 -63
- package/lib/database-utils/index.d.ts +8 -0
- package/lib/database-utils/index.js +59 -0
- package/lib/database.d.ts +32 -3
- package/lib/database.js +237 -64
- package/lib/fields/array-field.d.ts +1 -1
- package/lib/fields/array-field.js +2 -2
- package/lib/fields/belongs-to-many-field.js +8 -3
- package/lib/fields/field.d.ts +1 -0
- package/lib/fields/field.js +37 -15
- package/lib/fields/has-one-field.d.ts +1 -1
- package/lib/fields/has-one-field.js +9 -5
- package/lib/fields/number-field.d.ts +9 -6
- package/lib/fields/number-field.js +8 -6
- package/lib/fields/sort-field.js +15 -1
- package/lib/filter-parser.js +1 -1
- package/lib/index.d.ts +6 -4
- package/lib/index.js +59 -36
- package/lib/mock-database.d.ts +2 -0
- package/lib/mock-database.js +3 -1
- package/lib/model.js +10 -1
- package/lib/options-parser.js +3 -0
- package/lib/query-interface/mysql-query-interface.d.ts +7 -0
- package/lib/query-interface/mysql-query-interface.js +39 -0
- package/lib/query-interface/postgres-query-interface.d.ts +6 -0
- package/lib/query-interface/postgres-query-interface.js +41 -0
- package/lib/query-interface/query-interface-builder.d.ts +2 -0
- package/lib/query-interface/query-interface-builder.js +23 -0
- package/lib/query-interface/query-interface.d.ts +9 -0
- package/lib/query-interface/query-interface.js +18 -0
- package/lib/query-interface/sqlite-query-interface.d.ts +6 -0
- package/lib/query-interface/sqlite-query-interface.js +38 -0
- package/lib/relation-repository/belongs-to-many-repository.js +4 -2
- package/lib/relation-repository/multiple-relation-repository.js +2 -0
- package/lib/relation-repository/single-relation-repository.js +1 -0
- package/lib/repository.js +5 -2
- package/lib/sync-runner.d.ts +1 -1
- package/lib/sync-runner.js +29 -22
- package/lib/types.d.ts +7 -1
- package/lib/update-associations.js +17 -3
- package/lib/update-guard.d.ts +1 -0
- package/lib/update-guard.js +6 -0
- package/lib/utils.d.ts +5 -0
- package/lib/utils.js +78 -0
- package/lib/value-parsers/array-value-parser.d.ts +8 -0
- package/lib/value-parsers/array-value-parser.js +76 -0
- package/lib/value-parsers/base-value-parser.d.ts +12 -0
- package/lib/value-parsers/base-value-parser.js +59 -0
- package/lib/value-parsers/boolean-value-parser.d.ts +4 -0
- package/lib/value-parsers/boolean-value-parser.js +46 -0
- package/lib/value-parsers/date-value-parser.d.ts +5 -0
- package/lib/value-parsers/date-value-parser.js +91 -0
- package/lib/value-parsers/index.d.ts +12 -0
- package/lib/value-parsers/index.js +102 -0
- package/lib/value-parsers/json-value-parser.d.ts +4 -0
- package/lib/value-parsers/json-value-parser.js +37 -0
- package/lib/value-parsers/number-value-parser.d.ts +4 -0
- package/lib/value-parsers/number-value-parser.js +49 -0
- package/lib/value-parsers/string-value-parser.d.ts +8 -0
- package/lib/value-parsers/string-value-parser.js +76 -0
- package/lib/value-parsers/to-many-value-parser.d.ts +13 -0
- package/lib/value-parsers/to-many-value-parser.js +169 -0
- package/lib/value-parsers/to-one-value-parser.d.ts +4 -0
- package/lib/value-parsers/to-one-value-parser.js +49 -0
- package/package.json +5 -3
- package/src/__tests__/bigint.test.ts +1 -1
- package/src/__tests__/collection-importer.test.ts +13 -1
- package/src/__tests__/collection.test.ts +19 -9
- package/src/__tests__/database.test.ts +32 -0
- package/src/__tests__/fields/sort-field.test.ts +23 -0
- package/src/__tests__/filter.test.ts +60 -0
- package/src/__tests__/inhertits/collection-inherits.test.ts +7 -5
- package/src/__tests__/percent2float.test.ts +14 -0
- package/src/__tests__/postgres/schema.test.ts +120 -0
- package/src/__tests__/underscored-options.test.ts +207 -0
- package/src/__tests__/update-associations-through.test.ts +73 -0
- package/src/__tests__/value-parsers/base.test.ts +20 -0
- package/src/__tests__/value-parsers/date.test.ts +67 -0
- package/src/__tests__/value-parsers/number.test.ts +46 -0
- package/src/__tests__/value-parsers/to-many.test.ts +206 -0
- package/src/__tests__/value-parsers/to-one.test.ts +60 -0
- package/src/collection-importer.ts +2 -2
- package/src/collection.ts +115 -17
- package/src/database-utils/index.ts +38 -0
- package/src/database.ts +188 -36
- package/src/fields/array-field.ts +1 -1
- package/src/fields/belongs-to-field.ts +1 -1
- package/src/fields/belongs-to-many-field.ts +8 -3
- package/src/fields/field.ts +48 -17
- package/src/fields/has-many-field.ts +1 -1
- package/src/fields/has-one-field.ts +11 -7
- package/src/fields/number-field.ts +10 -6
- package/src/fields/sort-field.ts +13 -1
- package/src/filter-parser.ts +1 -1
- package/src/index.ts +7 -4
- package/src/inherited-collection.ts +1 -0
- package/src/mock-database.ts +3 -1
- package/src/model.ts +11 -2
- package/src/options-parser.ts +5 -0
- package/src/query-interface/mysql-query-interface.ts +20 -0
- package/src/query-interface/postgres-query-interface.ts +22 -0
- package/src/query-interface/query-interface-builder.ts +14 -0
- package/src/query-interface/query-interface.ts +12 -0
- package/src/query-interface/sqlite-query-interface.ts +18 -0
- package/src/relation-repository/belongs-to-many-repository.ts +4 -2
- package/src/relation-repository/multiple-relation-repository.ts +4 -0
- package/src/relation-repository/single-relation-repository.ts +2 -0
- package/src/repository.ts +8 -3
- package/src/sync-runner.ts +35 -24
- package/src/types.ts +12 -1
- package/src/update-associations.ts +12 -5
- package/src/update-guard.ts +6 -0
- package/src/utils.ts +95 -0
- package/src/value-parsers/array-value-parser.ts +30 -0
- package/src/value-parsers/base-value-parser.ts +40 -0
- package/src/value-parsers/boolean-value-parser.ts +29 -0
- package/src/value-parsers/date-value-parser.ts +38 -0
- package/src/value-parsers/index.ts +46 -0
- package/src/value-parsers/json-value-parser.ts +19 -0
- package/src/value-parsers/number-value-parser.ts +29 -0
- package/src/value-parsers/string-value-parser.ts +31 -0
- package/src/value-parsers/to-many-value-parser.ts +85 -0
- package/src/value-parsers/to-one-value-parser.ts +20 -0
package/lib/fields/field.js
CHANGED
|
@@ -15,6 +15,8 @@ function _lodash() {
|
|
|
15
15
|
return data;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
+
var _utils = require("../utils");
|
|
19
|
+
|
|
18
20
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
19
21
|
|
|
20
22
|
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
@@ -46,8 +48,8 @@ class Field {
|
|
|
46
48
|
this.database = void 0;
|
|
47
49
|
this.collection = void 0;
|
|
48
50
|
this.context = context;
|
|
49
|
-
this.database = context.database;
|
|
50
|
-
this.collection = context.collection;
|
|
51
|
+
this.database = this.context.database;
|
|
52
|
+
this.collection = this.context.collection;
|
|
51
53
|
this.options = options || {};
|
|
52
54
|
this.init();
|
|
53
55
|
}
|
|
@@ -95,6 +97,18 @@ class Field {
|
|
|
95
97
|
return this.collection.removeField(this.name);
|
|
96
98
|
}
|
|
97
99
|
|
|
100
|
+
columnName() {
|
|
101
|
+
if (this.options.field) {
|
|
102
|
+
return this.options.field;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (this.database.options.underscored) {
|
|
106
|
+
return (0, _utils.snakeCase)(this.name);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return this.name;
|
|
110
|
+
}
|
|
111
|
+
|
|
98
112
|
removeFromDb(options) {
|
|
99
113
|
var _this2 = this;
|
|
100
114
|
|
|
@@ -126,7 +140,15 @@ class Field {
|
|
|
126
140
|
|
|
127
141
|
if (_this2.collection.model.options.timestamps !== false) {
|
|
128
142
|
// timestamps 相关字段不删除
|
|
129
|
-
|
|
143
|
+
let timestampsFields = ['createdAt', 'updatedAt', 'deletedAt'];
|
|
144
|
+
|
|
145
|
+
if (_this2.database.options.underscored) {
|
|
146
|
+
timestampsFields = timestampsFields.map(field => (0, _utils.snakeCase)(field));
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
if (timestampsFields.includes(_this2.columnName())) {
|
|
150
|
+
_this2.collection.fields.delete(_this2.name);
|
|
151
|
+
|
|
130
152
|
return;
|
|
131
153
|
}
|
|
132
154
|
} // 排序字段通过 sortable 控制
|
|
@@ -148,21 +170,21 @@ class Field {
|
|
|
148
170
|
if (_this2.name === sortField) {
|
|
149
171
|
return;
|
|
150
172
|
}
|
|
151
|
-
}
|
|
173
|
+
} // if (this.options.field && this.name !== this.options.field) {
|
|
174
|
+
// // field 指向的是真实的字段名,如果与 name 不一样,说明字段只是引用
|
|
175
|
+
// this.remove();
|
|
176
|
+
// return;
|
|
177
|
+
// }
|
|
152
178
|
|
|
153
|
-
if (_this2.options.field && _this2.name !== _this2.options.field) {
|
|
154
|
-
// field 指向的是真实的字段名,如果与 name 不一样,说明字段只是引用
|
|
155
|
-
_this2.remove();
|
|
156
179
|
|
|
157
|
-
|
|
158
|
-
}
|
|
180
|
+
const columnReferencesCount = _lodash().default.filter(_this2.collection.model.rawAttributes, attr => attr.field == _this2.columnName()).length;
|
|
159
181
|
|
|
160
|
-
if (yield _this2.existsInDb({
|
|
182
|
+
if ((yield _this2.existsInDb({
|
|
161
183
|
transaction: options === null || options === void 0 ? void 0 : options.transaction
|
|
162
|
-
})) {
|
|
184
|
+
})) && columnReferencesCount == 1) {
|
|
163
185
|
const queryInterface = _this2.database.sequelize.getQueryInterface();
|
|
164
186
|
|
|
165
|
-
yield queryInterface.removeColumn(_this2.collection.
|
|
187
|
+
yield queryInterface.removeColumn(_this2.collection.addSchemaTableName(), _this2.columnName(), options);
|
|
166
188
|
}
|
|
167
189
|
|
|
168
190
|
_this2.remove();
|
|
@@ -179,18 +201,18 @@ class Field {
|
|
|
179
201
|
let sql;
|
|
180
202
|
|
|
181
203
|
if (_this3.database.sequelize.getDialect() === 'sqlite') {
|
|
182
|
-
sql = `SELECT * from pragma_table_info('${_this3.collection.model.tableName}') WHERE name = '${_this3.
|
|
204
|
+
sql = `SELECT * from pragma_table_info('${_this3.collection.model.tableName}') WHERE name = '${_this3.columnName()}'`;
|
|
183
205
|
} else if (_this3.database.inDialect('mysql')) {
|
|
184
206
|
sql = `
|
|
185
207
|
select column_name
|
|
186
208
|
from INFORMATION_SCHEMA.COLUMNS
|
|
187
|
-
where TABLE_SCHEMA='${_this3.database.options.database}' AND TABLE_NAME='${_this3.collection.model.tableName}' AND column_name='${_this3.
|
|
209
|
+
where TABLE_SCHEMA='${_this3.database.options.database}' AND TABLE_NAME='${_this3.collection.model.tableName}' AND column_name='${_this3.columnName()}'
|
|
188
210
|
`;
|
|
189
211
|
} else {
|
|
190
212
|
sql = `
|
|
191
213
|
select column_name
|
|
192
214
|
from INFORMATION_SCHEMA.COLUMNS
|
|
193
|
-
where TABLE_NAME='${_this3.collection.model.tableName}' AND column_name='${_this3.
|
|
215
|
+
where TABLE_NAME='${_this3.collection.model.tableName}' AND column_name='${_this3.columnName()}' AND table_schema='${_this3.collection.collectionSchema() || 'public'}'
|
|
194
216
|
`;
|
|
195
217
|
}
|
|
196
218
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AssociationScope, DataType, ForeignKeyOptions, HasOneOptions, HasOneOptions as SequelizeHasOneOptions } from 'sequelize';
|
|
2
|
-
import { BaseRelationFieldOptions, RelationField } from './relation-field';
|
|
3
2
|
import { Reference } from '../features/ReferencesMap';
|
|
3
|
+
import { BaseRelationFieldOptions, RelationField } from './relation-field';
|
|
4
4
|
export interface HasOneFieldOptions extends HasOneOptions {
|
|
5
5
|
/**
|
|
6
6
|
* The name of the field to use as the key for the association in the source table. Defaults to the primary
|
|
@@ -48,12 +48,16 @@ class HasOneField extends _relationField.RelationField {
|
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
get foreignKey() {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
51
|
+
const foreignKey = (() => {
|
|
52
|
+
if (this.options.foreignKey) {
|
|
53
|
+
return this.options.foreignKey;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const model = this.context.collection.model;
|
|
57
|
+
return _sequelize().Utils.camelize([model.options.name.singular, model.primaryKeyAttribute].join('_'));
|
|
58
|
+
})();
|
|
54
59
|
|
|
55
|
-
|
|
56
|
-
return _sequelize().Utils.camelize([model.options.name.singular, model.primaryKeyAttribute].join('_'));
|
|
60
|
+
return foreignKey;
|
|
57
61
|
}
|
|
58
62
|
|
|
59
63
|
reference(association) {
|
|
@@ -1,38 +1,41 @@
|
|
|
1
1
|
import { DataTypes } from 'sequelize';
|
|
2
2
|
import { BaseColumnFieldOptions, Field } from './field';
|
|
3
|
-
|
|
3
|
+
declare abstract class NumberField extends Field {
|
|
4
|
+
}
|
|
5
|
+
export declare class IntegerField extends NumberField {
|
|
4
6
|
get dataType(): DataTypes.IntegerDataTypeConstructor;
|
|
5
7
|
}
|
|
6
8
|
export interface IntegerFieldOptions extends BaseColumnFieldOptions {
|
|
7
9
|
type: 'integer';
|
|
8
10
|
}
|
|
9
|
-
export declare class BigIntField extends
|
|
11
|
+
export declare class BigIntField extends NumberField {
|
|
10
12
|
get dataType(): DataTypes.BigIntDataTypeConstructor;
|
|
11
13
|
}
|
|
12
14
|
export interface BigIntFieldOptions extends BaseColumnFieldOptions {
|
|
13
15
|
type: 'bigInt';
|
|
14
16
|
}
|
|
15
|
-
export declare class FloatField extends
|
|
17
|
+
export declare class FloatField extends NumberField {
|
|
16
18
|
get dataType(): DataTypes.FloatDataTypeConstructor;
|
|
17
19
|
}
|
|
18
20
|
export interface FloatFieldOptions extends BaseColumnFieldOptions {
|
|
19
21
|
type: 'float';
|
|
20
22
|
}
|
|
21
|
-
export declare class DoubleField extends
|
|
23
|
+
export declare class DoubleField extends NumberField {
|
|
22
24
|
get dataType(): DataTypes.DoubleDataTypeConstructor;
|
|
23
25
|
}
|
|
24
26
|
export interface DoubleFieldOptions extends BaseColumnFieldOptions {
|
|
25
27
|
type: 'double';
|
|
26
28
|
}
|
|
27
|
-
export declare class RealField extends
|
|
29
|
+
export declare class RealField extends NumberField {
|
|
28
30
|
get dataType(): DataTypes.RealDataTypeConstructor;
|
|
29
31
|
}
|
|
30
32
|
export interface RealFieldOptions extends BaseColumnFieldOptions {
|
|
31
33
|
type: 'real';
|
|
32
34
|
}
|
|
33
|
-
export declare class DecimalField extends
|
|
35
|
+
export declare class DecimalField extends NumberField {
|
|
34
36
|
get dataType(): DataTypes.DecimalDataTypeConstructor;
|
|
35
37
|
}
|
|
36
38
|
export interface DecimalFieldOptions extends BaseColumnFieldOptions {
|
|
37
39
|
type: 'decimal';
|
|
38
40
|
}
|
|
41
|
+
export {};
|
|
@@ -17,7 +17,9 @@ function _sequelize() {
|
|
|
17
17
|
|
|
18
18
|
var _field = require("./field");
|
|
19
19
|
|
|
20
|
-
class
|
|
20
|
+
class NumberField extends _field.Field {}
|
|
21
|
+
|
|
22
|
+
class IntegerField extends NumberField {
|
|
21
23
|
get dataType() {
|
|
22
24
|
return _sequelize().DataTypes.INTEGER;
|
|
23
25
|
}
|
|
@@ -26,7 +28,7 @@ class IntegerField extends _field.Field {
|
|
|
26
28
|
|
|
27
29
|
exports.IntegerField = IntegerField;
|
|
28
30
|
|
|
29
|
-
class BigIntField extends
|
|
31
|
+
class BigIntField extends NumberField {
|
|
30
32
|
get dataType() {
|
|
31
33
|
return _sequelize().DataTypes.BIGINT;
|
|
32
34
|
}
|
|
@@ -35,7 +37,7 @@ class BigIntField extends _field.Field {
|
|
|
35
37
|
|
|
36
38
|
exports.BigIntField = BigIntField;
|
|
37
39
|
|
|
38
|
-
class FloatField extends
|
|
40
|
+
class FloatField extends NumberField {
|
|
39
41
|
get dataType() {
|
|
40
42
|
return _sequelize().DataTypes.FLOAT;
|
|
41
43
|
}
|
|
@@ -44,7 +46,7 @@ class FloatField extends _field.Field {
|
|
|
44
46
|
|
|
45
47
|
exports.FloatField = FloatField;
|
|
46
48
|
|
|
47
|
-
class DoubleField extends
|
|
49
|
+
class DoubleField extends NumberField {
|
|
48
50
|
get dataType() {
|
|
49
51
|
return _sequelize().DataTypes.DOUBLE;
|
|
50
52
|
}
|
|
@@ -53,7 +55,7 @@ class DoubleField extends _field.Field {
|
|
|
53
55
|
|
|
54
56
|
exports.DoubleField = DoubleField;
|
|
55
57
|
|
|
56
|
-
class RealField extends
|
|
58
|
+
class RealField extends NumberField {
|
|
57
59
|
get dataType() {
|
|
58
60
|
return _sequelize().DataTypes.REAL;
|
|
59
61
|
}
|
|
@@ -62,7 +64,7 @@ class RealField extends _field.Field {
|
|
|
62
64
|
|
|
63
65
|
exports.RealField = RealField;
|
|
64
66
|
|
|
65
|
-
class DecimalField extends
|
|
67
|
+
class DecimalField extends NumberField {
|
|
66
68
|
get dataType() {
|
|
67
69
|
return _sequelize().DataTypes.DECIMAL;
|
|
68
70
|
}
|
package/lib/fields/sort-field.js
CHANGED
|
@@ -125,9 +125,23 @@ class SortField extends _field.Field {
|
|
|
125
125
|
transaction
|
|
126
126
|
});
|
|
127
127
|
|
|
128
|
+
const orderKey = (() => {
|
|
129
|
+
const model = _this.collection.model;
|
|
130
|
+
|
|
131
|
+
if (model.primaryKeyAttribute) {
|
|
132
|
+
return model.primaryKeyAttribute;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (model.rawAttributes['createdAt']) {
|
|
136
|
+
return 'createdAt';
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
throw new Error(`can not find order key for collection ${_this.collection.name}`);
|
|
140
|
+
})();
|
|
141
|
+
|
|
128
142
|
if (emptyCount === totalCount && emptyCount > 0) {
|
|
129
143
|
const records = yield _this.collection.repository.find({
|
|
130
|
-
order: [
|
|
144
|
+
order: [orderKey],
|
|
131
145
|
transaction
|
|
132
146
|
});
|
|
133
147
|
let start = 1;
|
package/lib/filter-parser.js
CHANGED
|
@@ -215,7 +215,7 @@ class FilterParser {
|
|
|
215
215
|
origins.push(attr); // if it is target model attribute
|
|
216
216
|
|
|
217
217
|
if (target.rawAttributes[attr]) {
|
|
218
|
-
associationKeys.push(attr);
|
|
218
|
+
associationKeys.push(target.rawAttributes[attr].field || attr);
|
|
219
219
|
target = null;
|
|
220
220
|
} else if (target.associations[attr]) {
|
|
221
221
|
// if it is target model association (nested association filter)
|
package/lib/index.d.ts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
export { DataTypes, ModelStatic, Op, SyncOptions } from 'sequelize';
|
|
2
2
|
export * from './collection';
|
|
3
|
-
export * from './
|
|
3
|
+
export * from './collection-importer';
|
|
4
4
|
export * from './database';
|
|
5
5
|
export { Database as default } from './database';
|
|
6
|
+
export * from './field-repository/array-field-repository';
|
|
6
7
|
export * from './fields';
|
|
8
|
+
export * from './filter-match';
|
|
9
|
+
export * from './inherited-collection';
|
|
7
10
|
export * from './magic-attribute-model';
|
|
8
11
|
export * from './migration';
|
|
9
12
|
export * from './mock-database';
|
|
@@ -15,6 +18,5 @@ export * from './relation-repository/multiple-relation-repository';
|
|
|
15
18
|
export * from './relation-repository/single-relation-repository';
|
|
16
19
|
export * from './repository';
|
|
17
20
|
export * from './update-associations';
|
|
18
|
-
export
|
|
19
|
-
export * from './
|
|
20
|
-
export * from './field-repository/array-field-repository';
|
|
21
|
+
export { snakeCase } from './utils';
|
|
22
|
+
export * from './value-parsers';
|
package/lib/index.js
CHANGED
|
@@ -5,7 +5,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
var _exportNames = {
|
|
7
7
|
DataTypes: true,
|
|
8
|
-
Op: true
|
|
8
|
+
Op: true,
|
|
9
|
+
snakeCase: true
|
|
9
10
|
};
|
|
10
11
|
Object.defineProperty(exports, "DataTypes", {
|
|
11
12
|
enumerable: true,
|
|
@@ -25,6 +26,12 @@ Object.defineProperty(exports, "default", {
|
|
|
25
26
|
return _database.Database;
|
|
26
27
|
}
|
|
27
28
|
});
|
|
29
|
+
Object.defineProperty(exports, "snakeCase", {
|
|
30
|
+
enumerable: true,
|
|
31
|
+
get: function get() {
|
|
32
|
+
return _utils.snakeCase;
|
|
33
|
+
}
|
|
34
|
+
});
|
|
28
35
|
|
|
29
36
|
function _sequelize() {
|
|
30
37
|
const data = require("sequelize");
|
|
@@ -50,16 +57,16 @@ Object.keys(_collection).forEach(function (key) {
|
|
|
50
57
|
});
|
|
51
58
|
});
|
|
52
59
|
|
|
53
|
-
var
|
|
60
|
+
var _collectionImporter = require("./collection-importer");
|
|
54
61
|
|
|
55
|
-
Object.keys(
|
|
62
|
+
Object.keys(_collectionImporter).forEach(function (key) {
|
|
56
63
|
if (key === "default" || key === "__esModule") return;
|
|
57
64
|
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
58
|
-
if (key in exports && exports[key] ===
|
|
65
|
+
if (key in exports && exports[key] === _collectionImporter[key]) return;
|
|
59
66
|
Object.defineProperty(exports, key, {
|
|
60
67
|
enumerable: true,
|
|
61
68
|
get: function get() {
|
|
62
|
-
return
|
|
69
|
+
return _collectionImporter[key];
|
|
63
70
|
}
|
|
64
71
|
});
|
|
65
72
|
});
|
|
@@ -78,6 +85,20 @@ Object.keys(_database).forEach(function (key) {
|
|
|
78
85
|
});
|
|
79
86
|
});
|
|
80
87
|
|
|
88
|
+
var _arrayFieldRepository = require("./field-repository/array-field-repository");
|
|
89
|
+
|
|
90
|
+
Object.keys(_arrayFieldRepository).forEach(function (key) {
|
|
91
|
+
if (key === "default" || key === "__esModule") return;
|
|
92
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
93
|
+
if (key in exports && exports[key] === _arrayFieldRepository[key]) return;
|
|
94
|
+
Object.defineProperty(exports, key, {
|
|
95
|
+
enumerable: true,
|
|
96
|
+
get: function get() {
|
|
97
|
+
return _arrayFieldRepository[key];
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
|
|
81
102
|
var _fields = require("./fields");
|
|
82
103
|
|
|
83
104
|
Object.keys(_fields).forEach(function (key) {
|
|
@@ -92,6 +113,34 @@ Object.keys(_fields).forEach(function (key) {
|
|
|
92
113
|
});
|
|
93
114
|
});
|
|
94
115
|
|
|
116
|
+
var _filterMatch = require("./filter-match");
|
|
117
|
+
|
|
118
|
+
Object.keys(_filterMatch).forEach(function (key) {
|
|
119
|
+
if (key === "default" || key === "__esModule") return;
|
|
120
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
121
|
+
if (key in exports && exports[key] === _filterMatch[key]) return;
|
|
122
|
+
Object.defineProperty(exports, key, {
|
|
123
|
+
enumerable: true,
|
|
124
|
+
get: function get() {
|
|
125
|
+
return _filterMatch[key];
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
var _inheritedCollection = require("./inherited-collection");
|
|
131
|
+
|
|
132
|
+
Object.keys(_inheritedCollection).forEach(function (key) {
|
|
133
|
+
if (key === "default" || key === "__esModule") return;
|
|
134
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
135
|
+
if (key in exports && exports[key] === _inheritedCollection[key]) return;
|
|
136
|
+
Object.defineProperty(exports, key, {
|
|
137
|
+
enumerable: true,
|
|
138
|
+
get: function get() {
|
|
139
|
+
return _inheritedCollection[key];
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
|
|
95
144
|
var _magicAttributeModel = require("./magic-attribute-model");
|
|
96
145
|
|
|
97
146
|
Object.keys(_magicAttributeModel).forEach(function (key) {
|
|
@@ -246,44 +295,18 @@ Object.keys(_updateAssociations).forEach(function (key) {
|
|
|
246
295
|
});
|
|
247
296
|
});
|
|
248
297
|
|
|
249
|
-
var
|
|
250
|
-
|
|
251
|
-
Object.keys(_collectionImporter).forEach(function (key) {
|
|
252
|
-
if (key === "default" || key === "__esModule") return;
|
|
253
|
-
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
254
|
-
if (key in exports && exports[key] === _collectionImporter[key]) return;
|
|
255
|
-
Object.defineProperty(exports, key, {
|
|
256
|
-
enumerable: true,
|
|
257
|
-
get: function get() {
|
|
258
|
-
return _collectionImporter[key];
|
|
259
|
-
}
|
|
260
|
-
});
|
|
261
|
-
});
|
|
262
|
-
|
|
263
|
-
var _filterMatch = require("./filter-match");
|
|
298
|
+
var _utils = require("./utils");
|
|
264
299
|
|
|
265
|
-
|
|
266
|
-
if (key === "default" || key === "__esModule") return;
|
|
267
|
-
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
268
|
-
if (key in exports && exports[key] === _filterMatch[key]) return;
|
|
269
|
-
Object.defineProperty(exports, key, {
|
|
270
|
-
enumerable: true,
|
|
271
|
-
get: function get() {
|
|
272
|
-
return _filterMatch[key];
|
|
273
|
-
}
|
|
274
|
-
});
|
|
275
|
-
});
|
|
300
|
+
var _valueParsers = require("./value-parsers");
|
|
276
301
|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
Object.keys(_arrayFieldRepository).forEach(function (key) {
|
|
302
|
+
Object.keys(_valueParsers).forEach(function (key) {
|
|
280
303
|
if (key === "default" || key === "__esModule") return;
|
|
281
304
|
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
282
|
-
if (key in exports && exports[key] ===
|
|
305
|
+
if (key in exports && exports[key] === _valueParsers[key]) return;
|
|
283
306
|
Object.defineProperty(exports, key, {
|
|
284
307
|
enumerable: true,
|
|
285
308
|
get: function get() {
|
|
286
|
-
return
|
|
309
|
+
return _valueParsers[key];
|
|
287
310
|
}
|
|
288
311
|
});
|
|
289
312
|
});
|
package/lib/mock-database.d.ts
CHANGED
package/lib/mock-database.js
CHANGED
|
@@ -62,7 +62,9 @@ function getConfigByEnv() {
|
|
|
62
62
|
charset: 'utf8mb4',
|
|
63
63
|
collate: 'utf8mb4_unicode_ci'
|
|
64
64
|
},
|
|
65
|
-
timezone: process.env.DB_TIMEZONE
|
|
65
|
+
timezone: process.env.DB_TIMEZONE,
|
|
66
|
+
underscored: process.env.DB_UNDERSCORED === 'true',
|
|
67
|
+
schema: process.env.DB_SCHEMA !== 'public' ? process.env.DB_SCHEMA : undefined
|
|
66
68
|
};
|
|
67
69
|
}
|
|
68
70
|
|
package/lib/model.js
CHANGED
|
@@ -169,7 +169,16 @@ class Model extends _sequelize().Model {
|
|
|
169
169
|
var _this = this;
|
|
170
170
|
|
|
171
171
|
return _asyncToGenerator(function* () {
|
|
172
|
-
const model = _this;
|
|
172
|
+
const model = _this;
|
|
173
|
+
const _schema = model._schema;
|
|
174
|
+
|
|
175
|
+
if (_schema && _schema != 'public') {
|
|
176
|
+
yield _this.sequelize.query(`CREATE SCHEMA IF NOT EXISTS "${_schema}";`, {
|
|
177
|
+
raw: true,
|
|
178
|
+
transaction: options === null || options === void 0 ? void 0 : options.transaction
|
|
179
|
+
});
|
|
180
|
+
} // fix sequelize sync with model that not have any column
|
|
181
|
+
|
|
173
182
|
|
|
174
183
|
if (Object.keys(model.tableAttributes).length === 0) {
|
|
175
184
|
if (_this.database.inDialect('sqlite', 'mysql')) {
|
package/lib/options-parser.js
CHANGED
|
@@ -118,6 +118,9 @@ class OptionsParser {
|
|
|
118
118
|
sortField[i] = associationModel.associations[associationKey].target;
|
|
119
119
|
associationModel = sortField[i];
|
|
120
120
|
}
|
|
121
|
+
} else {
|
|
122
|
+
const rawField = this.model.rawAttributes[sortField[0]];
|
|
123
|
+
sortField[0] = (rawField === null || rawField === void 0 ? void 0 : rawField.field) || sortField[0];
|
|
121
124
|
}
|
|
122
125
|
|
|
123
126
|
sortField.push(direction);
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import QueryInterface from './query-interface';
|
|
2
|
+
import { Collection } from '../collection';
|
|
3
|
+
import { Transactionable } from 'sequelize';
|
|
4
|
+
export default class MysqlQueryInterface extends QueryInterface {
|
|
5
|
+
constructor(db: any);
|
|
6
|
+
collectionTableExists(collection: Collection, options?: Transactionable): Promise<boolean>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _queryInterface = _interopRequireDefault(require("./query-interface"));
|
|
9
|
+
|
|
10
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
+
|
|
12
|
+
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); } }
|
|
13
|
+
|
|
14
|
+
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); }); }; }
|
|
15
|
+
|
|
16
|
+
class MysqlQueryInterface extends _queryInterface.default {
|
|
17
|
+
constructor(db) {
|
|
18
|
+
super(db);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
collectionTableExists(collection, options) {
|
|
22
|
+
var _this = this;
|
|
23
|
+
|
|
24
|
+
return _asyncToGenerator(function* () {
|
|
25
|
+
const transaction = options === null || options === void 0 ? void 0 : options.transaction;
|
|
26
|
+
const tableName = collection.model.tableName;
|
|
27
|
+
const databaseName = _this.db.options.database;
|
|
28
|
+
const sql = `SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '${databaseName}' AND TABLE_NAME = '${tableName}'`;
|
|
29
|
+
const results = yield _this.db.sequelize.query(sql, {
|
|
30
|
+
type: 'SELECT',
|
|
31
|
+
transaction
|
|
32
|
+
});
|
|
33
|
+
return results.length > 0;
|
|
34
|
+
})();
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
exports.default = MysqlQueryInterface;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import QueryInterface from './query-interface';
|
|
2
|
+
import { Collection } from '../collection';
|
|
3
|
+
export default class PostgresQueryInterface extends QueryInterface {
|
|
4
|
+
constructor(db: any);
|
|
5
|
+
collectionTableExists(collection: Collection, options?: any): Promise<any>;
|
|
6
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _queryInterface = _interopRequireDefault(require("./query-interface"));
|
|
9
|
+
|
|
10
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
+
|
|
12
|
+
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); } }
|
|
13
|
+
|
|
14
|
+
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); }); }; }
|
|
15
|
+
|
|
16
|
+
class PostgresQueryInterface extends _queryInterface.default {
|
|
17
|
+
constructor(db) {
|
|
18
|
+
super(db);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
collectionTableExists(collection, options) {
|
|
22
|
+
var _this = this;
|
|
23
|
+
|
|
24
|
+
return _asyncToGenerator(function* () {
|
|
25
|
+
const transaction = options === null || options === void 0 ? void 0 : options.transaction;
|
|
26
|
+
const tableName = collection.model.tableName;
|
|
27
|
+
const schema = collection.collectionSchema() || 'public';
|
|
28
|
+
const sql = `SELECT EXISTS(SELECT 1 FROM information_schema.tables
|
|
29
|
+
WHERE table_schema = '${schema}'
|
|
30
|
+
AND table_name = '${tableName}')`;
|
|
31
|
+
const results = yield _this.db.sequelize.query(sql, {
|
|
32
|
+
type: 'SELECT',
|
|
33
|
+
transaction
|
|
34
|
+
});
|
|
35
|
+
return results[0]['exists'];
|
|
36
|
+
})();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
exports.default = PostgresQueryInterface;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = buildQueryInterface;
|
|
7
|
+
|
|
8
|
+
var _mysqlQueryInterface = _interopRequireDefault(require("./mysql-query-interface"));
|
|
9
|
+
|
|
10
|
+
var _postgresQueryInterface = _interopRequireDefault(require("./postgres-query-interface"));
|
|
11
|
+
|
|
12
|
+
var _sqliteQueryInterface = _interopRequireDefault(require("./sqlite-query-interface"));
|
|
13
|
+
|
|
14
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
+
|
|
16
|
+
function buildQueryInterface(db) {
|
|
17
|
+
const map = {
|
|
18
|
+
mysql: _mysqlQueryInterface.default,
|
|
19
|
+
postgres: _postgresQueryInterface.default,
|
|
20
|
+
sqlite: _sqliteQueryInterface.default
|
|
21
|
+
};
|
|
22
|
+
return new map[db.options.dialect](db);
|
|
23
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import Database from '../database';
|
|
2
|
+
import { Collection } from '../collection';
|
|
3
|
+
import { QueryInterface as SequelizeQueryInterface, Transactionable } from 'sequelize';
|
|
4
|
+
export default abstract class QueryInterface {
|
|
5
|
+
db: Database;
|
|
6
|
+
sequelizeQueryInterface: SequelizeQueryInterface;
|
|
7
|
+
protected constructor(db: Database);
|
|
8
|
+
abstract collectionTableExists(collection: Collection, options?: Transactionable): Promise<boolean>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
class QueryInterface {
|
|
9
|
+
constructor(db) {
|
|
10
|
+
this.db = void 0;
|
|
11
|
+
this.sequelizeQueryInterface = void 0;
|
|
12
|
+
this.db = db;
|
|
13
|
+
this.sequelizeQueryInterface = db.sequelize.getQueryInterface();
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
exports.default = QueryInterface;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import QueryInterface from './query-interface';
|
|
2
|
+
import { Collection } from '../collection';
|
|
3
|
+
export default class SqliteQueryInterface extends QueryInterface {
|
|
4
|
+
constructor(db: any);
|
|
5
|
+
collectionTableExists(collection: Collection, options?: any): Promise<boolean>;
|
|
6
|
+
}
|