@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.
Files changed (125) hide show
  1. package/lib/collection-importer.js +1 -1
  2. package/lib/collection.d.ts +9 -2
  3. package/lib/collection.js +153 -63
  4. package/lib/database-utils/index.d.ts +8 -0
  5. package/lib/database-utils/index.js +59 -0
  6. package/lib/database.d.ts +32 -3
  7. package/lib/database.js +237 -64
  8. package/lib/fields/array-field.d.ts +1 -1
  9. package/lib/fields/array-field.js +2 -2
  10. package/lib/fields/belongs-to-many-field.js +8 -3
  11. package/lib/fields/field.d.ts +1 -0
  12. package/lib/fields/field.js +37 -15
  13. package/lib/fields/has-one-field.d.ts +1 -1
  14. package/lib/fields/has-one-field.js +9 -5
  15. package/lib/fields/number-field.d.ts +9 -6
  16. package/lib/fields/number-field.js +8 -6
  17. package/lib/fields/sort-field.js +15 -1
  18. package/lib/filter-parser.js +1 -1
  19. package/lib/index.d.ts +6 -4
  20. package/lib/index.js +59 -36
  21. package/lib/mock-database.d.ts +2 -0
  22. package/lib/mock-database.js +3 -1
  23. package/lib/model.js +10 -1
  24. package/lib/options-parser.js +3 -0
  25. package/lib/query-interface/mysql-query-interface.d.ts +7 -0
  26. package/lib/query-interface/mysql-query-interface.js +39 -0
  27. package/lib/query-interface/postgres-query-interface.d.ts +6 -0
  28. package/lib/query-interface/postgres-query-interface.js +41 -0
  29. package/lib/query-interface/query-interface-builder.d.ts +2 -0
  30. package/lib/query-interface/query-interface-builder.js +23 -0
  31. package/lib/query-interface/query-interface.d.ts +9 -0
  32. package/lib/query-interface/query-interface.js +18 -0
  33. package/lib/query-interface/sqlite-query-interface.d.ts +6 -0
  34. package/lib/query-interface/sqlite-query-interface.js +38 -0
  35. package/lib/relation-repository/belongs-to-many-repository.js +4 -2
  36. package/lib/relation-repository/multiple-relation-repository.js +2 -0
  37. package/lib/relation-repository/single-relation-repository.js +1 -0
  38. package/lib/repository.js +5 -2
  39. package/lib/sync-runner.d.ts +1 -1
  40. package/lib/sync-runner.js +29 -22
  41. package/lib/types.d.ts +7 -1
  42. package/lib/update-associations.js +17 -3
  43. package/lib/update-guard.d.ts +1 -0
  44. package/lib/update-guard.js +6 -0
  45. package/lib/utils.d.ts +5 -0
  46. package/lib/utils.js +78 -0
  47. package/lib/value-parsers/array-value-parser.d.ts +8 -0
  48. package/lib/value-parsers/array-value-parser.js +76 -0
  49. package/lib/value-parsers/base-value-parser.d.ts +12 -0
  50. package/lib/value-parsers/base-value-parser.js +59 -0
  51. package/lib/value-parsers/boolean-value-parser.d.ts +4 -0
  52. package/lib/value-parsers/boolean-value-parser.js +46 -0
  53. package/lib/value-parsers/date-value-parser.d.ts +5 -0
  54. package/lib/value-parsers/date-value-parser.js +91 -0
  55. package/lib/value-parsers/index.d.ts +12 -0
  56. package/lib/value-parsers/index.js +102 -0
  57. package/lib/value-parsers/json-value-parser.d.ts +4 -0
  58. package/lib/value-parsers/json-value-parser.js +37 -0
  59. package/lib/value-parsers/number-value-parser.d.ts +4 -0
  60. package/lib/value-parsers/number-value-parser.js +49 -0
  61. package/lib/value-parsers/string-value-parser.d.ts +8 -0
  62. package/lib/value-parsers/string-value-parser.js +76 -0
  63. package/lib/value-parsers/to-many-value-parser.d.ts +13 -0
  64. package/lib/value-parsers/to-many-value-parser.js +169 -0
  65. package/lib/value-parsers/to-one-value-parser.d.ts +4 -0
  66. package/lib/value-parsers/to-one-value-parser.js +49 -0
  67. package/package.json +5 -3
  68. package/src/__tests__/bigint.test.ts +1 -1
  69. package/src/__tests__/collection-importer.test.ts +13 -1
  70. package/src/__tests__/collection.test.ts +19 -9
  71. package/src/__tests__/database.test.ts +32 -0
  72. package/src/__tests__/fields/sort-field.test.ts +23 -0
  73. package/src/__tests__/filter.test.ts +60 -0
  74. package/src/__tests__/inhertits/collection-inherits.test.ts +7 -5
  75. package/src/__tests__/percent2float.test.ts +14 -0
  76. package/src/__tests__/postgres/schema.test.ts +120 -0
  77. package/src/__tests__/underscored-options.test.ts +207 -0
  78. package/src/__tests__/update-associations-through.test.ts +73 -0
  79. package/src/__tests__/value-parsers/base.test.ts +20 -0
  80. package/src/__tests__/value-parsers/date.test.ts +67 -0
  81. package/src/__tests__/value-parsers/number.test.ts +46 -0
  82. package/src/__tests__/value-parsers/to-many.test.ts +206 -0
  83. package/src/__tests__/value-parsers/to-one.test.ts +60 -0
  84. package/src/collection-importer.ts +2 -2
  85. package/src/collection.ts +115 -17
  86. package/src/database-utils/index.ts +38 -0
  87. package/src/database.ts +188 -36
  88. package/src/fields/array-field.ts +1 -1
  89. package/src/fields/belongs-to-field.ts +1 -1
  90. package/src/fields/belongs-to-many-field.ts +8 -3
  91. package/src/fields/field.ts +48 -17
  92. package/src/fields/has-many-field.ts +1 -1
  93. package/src/fields/has-one-field.ts +11 -7
  94. package/src/fields/number-field.ts +10 -6
  95. package/src/fields/sort-field.ts +13 -1
  96. package/src/filter-parser.ts +1 -1
  97. package/src/index.ts +7 -4
  98. package/src/inherited-collection.ts +1 -0
  99. package/src/mock-database.ts +3 -1
  100. package/src/model.ts +11 -2
  101. package/src/options-parser.ts +5 -0
  102. package/src/query-interface/mysql-query-interface.ts +20 -0
  103. package/src/query-interface/postgres-query-interface.ts +22 -0
  104. package/src/query-interface/query-interface-builder.ts +14 -0
  105. package/src/query-interface/query-interface.ts +12 -0
  106. package/src/query-interface/sqlite-query-interface.ts +18 -0
  107. package/src/relation-repository/belongs-to-many-repository.ts +4 -2
  108. package/src/relation-repository/multiple-relation-repository.ts +4 -0
  109. package/src/relation-repository/single-relation-repository.ts +2 -0
  110. package/src/repository.ts +8 -3
  111. package/src/sync-runner.ts +35 -24
  112. package/src/types.ts +12 -1
  113. package/src/update-associations.ts +12 -5
  114. package/src/update-guard.ts +6 -0
  115. package/src/utils.ts +95 -0
  116. package/src/value-parsers/array-value-parser.ts +30 -0
  117. package/src/value-parsers/base-value-parser.ts +40 -0
  118. package/src/value-parsers/boolean-value-parser.ts +29 -0
  119. package/src/value-parsers/date-value-parser.ts +38 -0
  120. package/src/value-parsers/index.ts +46 -0
  121. package/src/value-parsers/json-value-parser.ts +19 -0
  122. package/src/value-parsers/number-value-parser.ts +29 -0
  123. package/src/value-parsers/string-value-parser.ts +31 -0
  124. package/src/value-parsers/to-many-value-parser.ts +85 -0
  125. package/src/value-parsers/to-one-value-parser.ts +20 -0
@@ -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
- if (['createdAt', 'updatedAt', 'deletedAt'].includes(_this2.name)) {
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
- return;
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.model.tableName, _this2.name, options);
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.name}'`;
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.name}'
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.name}'
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
- if (this.options.foreignKey) {
52
- return this.options.foreignKey;
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
- const model = this.context.collection.model;
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
- export declare class IntegerField extends Field {
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 Field {
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 Field {
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 Field {
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 Field {
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 Field {
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 IntegerField extends _field.Field {
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 _field.Field {
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 _field.Field {
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 _field.Field {
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 _field.Field {
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 _field.Field {
67
+ class DecimalField extends NumberField {
66
68
  get dataType() {
67
69
  return _sequelize().DataTypes.DECIMAL;
68
70
  }
@@ -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: [_this.collection.model.primaryKeyAttribute],
144
+ order: [orderKey],
131
145
  transaction
132
146
  });
133
147
  let start = 1;
@@ -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 './inherited-collection';
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 * from './collection-importer';
19
- export * from './filter-match';
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 _inheritedCollection = require("./inherited-collection");
60
+ var _collectionImporter = require("./collection-importer");
54
61
 
55
- Object.keys(_inheritedCollection).forEach(function (key) {
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] === _inheritedCollection[key]) return;
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 _inheritedCollection[key];
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 _collectionImporter = require("./collection-importer");
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
- Object.keys(_filterMatch).forEach(function (key) {
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
- var _arrayFieldRepository = require("./field-repository/array-field-repository");
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] === _arrayFieldRepository[key]) return;
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 _arrayFieldRepository[key];
309
+ return _valueParsers[key];
287
310
  }
288
311
  });
289
312
  });
@@ -19,5 +19,7 @@ export declare function getConfigByEnv(): {
19
19
  collate: string;
20
20
  };
21
21
  timezone: string;
22
+ underscored: boolean;
23
+ schema: string;
22
24
  };
23
25
  export declare function mockDatabase(options?: IDatabaseOptions): MockDatabase;
@@ -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; // fix sequelize sync with model that not have any column
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')) {
@@ -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,2 @@
1
+ import Database from '../database';
2
+ export default function buildQueryInterface(db: Database): any;
@@ -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
+ }