@nocobase/database 0.7.0-alpha.3 → 0.7.0-alpha.32

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/esm/database.d.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  import { AsyncEmitter } from '@nocobase/utils';
3
3
  import merge from 'deepmerge';
4
4
  import { EventEmitter } from 'events';
5
- import { ModelCtor, Options, QueryInterfaceDropAllTablesOptions, Sequelize, SyncOptions } from 'sequelize';
5
+ import { ModelCtor, Options, QueryInterfaceDropAllTablesOptions, QueryOptions, Sequelize, SyncOptions } from 'sequelize';
6
6
  import { Collection, CollectionOptions, RepositoryType } from './collection';
7
7
  import { ImportFileExtension } from './collection-importer';
8
8
  import * as FieldTypes from './fields';
@@ -77,6 +77,9 @@ export declare class Database extends EventEmitter implements AsyncEmitter {
77
77
  sync(options?: SyncOptions): Promise<Sequelize>;
78
78
  clean(options: CleanOptions): Promise<void>;
79
79
  isSqliteMemory(): boolean;
80
+ auth(options?: QueryOptions & {
81
+ repeat?: number;
82
+ }): Promise<any>;
80
83
  reconnect(): Promise<void>;
81
84
  closed(): any;
82
85
  close(): Promise<void>;
package/esm/database.js CHANGED
@@ -42,8 +42,14 @@ export class Database extends EventEmitter {
42
42
  this.sequelize = options;
43
43
  }
44
44
  else {
45
- this.sequelize = new Sequelize(options);
46
- this.options = options;
45
+ const opts = Object.assign({ sync: {
46
+ alter: {
47
+ drop: false,
48
+ },
49
+ force: false,
50
+ } }, options);
51
+ this.sequelize = new Sequelize(opts);
52
+ this.options = opts;
47
53
  }
48
54
  this.collections = new Map();
49
55
  this.modelHook = new ModelHook(this);
@@ -192,6 +198,30 @@ export class Database extends EventEmitter {
192
198
  isSqliteMemory() {
193
199
  return this.sequelize.getDialect() === 'sqlite' && lodash.get(this.options, 'storage') == ':memory:';
194
200
  }
201
+ auth(options = {}) {
202
+ return __awaiter(this, void 0, void 0, function* () {
203
+ const { repeat = 10 } = options, others = __rest(options, ["repeat"]);
204
+ const delay = (ms) => new Promise((yea) => setTimeout(yea, ms));
205
+ let count = 0;
206
+ const authenticate = () => __awaiter(this, void 0, void 0, function* () {
207
+ try {
208
+ yield this.sequelize.authenticate(others);
209
+ console.log('Connection has been established successfully.');
210
+ return true;
211
+ }
212
+ catch (error) {
213
+ console.log('reconnecting...', count);
214
+ if (count >= repeat) {
215
+ throw error;
216
+ }
217
+ ++count;
218
+ yield delay(500);
219
+ return yield authenticate();
220
+ }
221
+ });
222
+ return yield authenticate();
223
+ });
224
+ }
195
225
  reconnect() {
196
226
  return __awaiter(this, void 0, void 0, function* () {
197
227
  if (this.isSqliteMemory()) {
@@ -1 +1 @@
1
- {"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE5D,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAa,EAAE,EAA+C,SAAS,EAAe,KAAK,EAAE,MAAM,WAAW,CAAC;AACtH,OAAO,EAAE,UAAU,EAAqC,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAuB,MAAM,uBAAuB,CAAC;AAC5E,OAAO,KAAK,UAAU,MAAM,UAAU,CAAC;AAGvC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,eAAe,MAAM,aAAa,CAAC;AAkC1C,MAAM,OAAO,QAAS,SAAQ,YAAY;IAexC,YAAY,OAAwB;QAClC,KAAK,EAAE,CAAC;QAdV,eAAU,GAAG,IAAI,GAAG,EAAE,CAAC;QAEvB,WAAM,GAAG,IAAI,GAAG,EAA4B,CAAC;QAC7C,iBAAY,GAAG,IAAI,GAAG,EAA0B,CAAC;QACjD,cAAS,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,gBAAW,GAAG,IAAI,GAAG,EAAsB,CAAC;QAC5C,kBAAa,GAAG,IAAI,GAAG,EAA2B,CAAC;QACnD,oBAAe,GAAG,IAAI,GAAG,EAA8B,CAAC;QAIxD,0BAAqB,GAAG,IAAI,GAAG,EAA0E,CAAC;QAKxG,IAAI,OAAO,YAAY,SAAS,EAAE;YAChC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;SAC1B;aAAM;YACL,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;SACxB;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;QAErC,IAAI,CAAC,EAAE,CAAC,uBAAuB,EAAE,CAAC,UAAsB,EAAE,EAAE;;YAC1D,+DAA+D;YAC/D,MAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,0CAAE,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1E,MAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,0CAAE,OAAO,CAAC,CAAC,gBAAgB,EAAE,EAAE;gBAC5E,UAAU,CAAC,aAAa,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;YAC9F,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,gCAAgC;QAChC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;YACtD,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;gBAC7C,SAAS;aACV;YACD,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACtC,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC3D,IAAI,CAAC,kBAAkB,CAAC;gBACtB,CAAC,GAAG,CAAC,EAAE,KAAK;aACb,CAAC,CAAC;SACJ;QAED,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,UAAU,CACR,OAA0B;QAE1B,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAC;QAE7C,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,OAAO,EAAE;YACzC,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QAEH,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAClD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAEvD,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,UAAU,CAAC,CAAC;QAE/C,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;IACxC,CAAC;IAED;;;OAGG;IACH,aAAa,CAAC,IAAY;QACxB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,aAAa,CAAC,IAAY;QACxB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,gBAAgB,CAAC,IAAY;QAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,UAAU,CAAC,CAAC;QAEhD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAE7C,IAAI,MAAM,EAAE;YACV,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,UAAU,CAAC,CAAC;SAChD;IACH,CAAC;IAED,QAAQ,CAAkB,IAAY;QACpC,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,KAAqB,CAAC;IACxD,CAAC;IAKD,aAAa,CAA+B,IAAY,EAAE,UAA4B;;QACpF,IAAI,UAAU,EAAE;YACd,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/C,OAAO,MAAA,MAAA,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,0CAAE,QAAQ,CAAC,QAAQ,CAAC,0CAAE,EAAE,CAAC,UAAU,CAAM,CAAC;SAChF;QAED,OAAO,MAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,0CAAE,UAAU,CAAC;IAC9C,CAAC;IAED,eAAe,CAAC,KAAoB;QAClC,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACzD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,kBAAkB,CAAC,KAAoB;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACzD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;YAChB,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;SAC7C;IACH,CAAC;IAED,kBAAkB,CAAC,UAA+B;QAChD,KAAK,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;YAC1D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;SACtC;IACH,CAAC;IAED,cAAc,CAAC,MAA6B;QAC1C,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACvD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;SACnC;IACH,CAAC;IAED,oBAAoB,CAAC,YAAmC;QACtD,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;YAC7D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;SACzC;IACH,CAAC;IAED,aAAa;QACX,MAAM,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;QAE5B,eAAe;QACf,KAAK,MAAM,GAAG,IAAI,EAAE,EAAE;YACpB,SAAS,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAClC,MAAM,GAAG,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC3C,SAAS,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAClC,SAAS,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;SACrD;QAED,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAE3B,IAAI,CAAC,iBAAiB,mBACjB,eAAe,EAClB,CAAC;IACL,CAAC;IAED,iBAAiB,CAAC,SAA8B;QAC9C,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;YACvD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;SACnC;IACH,CAAC;IAED,UAAU,CAAC,OAAO,EAAE,OAAqB;QACvC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,EAAE;YACV,MAAM,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;SAC/C;QACD,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAEK,IAAI,CAAC,OAAqB;;YAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,OAAO,CAAC;YACxD,IAAI,OAAO,EAAE;gBACX,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,4BAA4B,EAAE,IAAI,CAAC,CAAC;aAChE;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAClD,IAAI,OAAO,EAAE;gBACX,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,4BAA4B,EAAE,IAAI,CAAC,CAAC;aAChE;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;KAAA;IAEK,KAAK,CAAC,OAAqB;;YAC/B,MAAM,EAAE,IAAI,KAAgB,OAAO,EAAlB,MAAM,UAAK,OAAO,EAA7B,QAAmB,CAAU,CAAC;YACpC,IAAI,IAAI,EAAE;gBACR,MAAM,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;aAChE;QACH,CAAC;KAAA;IAEM,cAAc;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,UAAU,CAAC;IACvG,CAAC;IAEK,SAAS;;YACb,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;gBACzB,OAAO;aACR;YACD,aAAa;YACb,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,iBAAiB,CAAC,WAAW,CAAC;YAC/E,aAAa;YACb,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YACxF,aAAa;YACb,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;YAC7D,aAAa;YACb,IAAI,CAAC,SAAS,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QACvD,CAAC;KAAA;IAED,MAAM;QACJ,aAAa;QACb,OAAO,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC;IACzD,CAAC;IAEK,KAAK;;YACT,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;gBACzB,OAAO;aACR;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QAChC,CAAC;KAAA;IAED,EAAE,CAAC,KAAsB,EAAE,QAAkC;QAC3D,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAEzD,IAAI,cAAc,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,cAAc,CAAC,EAAE;YAClE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC,CAAC;YAE5F,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;SAC1C;QAED,OAAO,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC;IAEK,MAAM,CAAC,OAAkE;;YAC7E,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;YACzE,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAsB,CAAC;YAE7C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;gBAC5B,IAAI,MAAM,CAAC,MAAM,EAAE;oBACjB,MAAM,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC;oBACrD,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;oBAC3D,IAAI,eAAe,EAAE;wBACnB,eAAe,CAAC,aAAa,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;qBAC9E;yBAAM;wBACL,MAAM,iBAAiB,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;wBAE/E,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,GAAG,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC;qBAChF;iBACF;qBAAM;oBACL,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;oBAC3C,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;iBACzC;aACF;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;KAAA;CAGF;AAED,MAAM,UAAU,MAAM,CAAC,iBAAoC,EAAE,YAA2B;IACtF,OAAO;QACL,iBAAiB;QACjB,YAAY;QACZ,MAAM,EAAE,IAAI;KACb,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,iBAAoC,EAAE,EAAE;IACvE,OAAO,iBAAiB,CAAC;AAC3B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,iBAAoC,EAAE,YAA2B,EAAE,EAAE;IACpG,OAAO;QACL,iBAAiB;QACjB,YAAY;QACZ,MAAM,EAAE,IAAI;KACb,CAAC;AACJ,CAAC,CAAC;AAEF,WAAW,CAAC,QAAQ,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;AAEtC,eAAe,QAAQ,CAAC","sourcesContent":["import { applyMixins, AsyncEmitter } from '@nocobase/utils';\nimport merge from 'deepmerge';\nimport { EventEmitter } from 'events';\nimport lodash from 'lodash';\nimport { ModelCtor, Op, Options, QueryInterfaceDropAllTablesOptions, Sequelize, SyncOptions, Utils } from 'sequelize';\nimport { Collection, CollectionOptions, RepositoryType } from './collection';\nimport { ImporterReader, ImportFileExtension } from './collection-importer';\nimport * as FieldTypes from './fields';\nimport { Field, FieldContext, RelationField } from './fields';\nimport { Model } from './model';\nimport { ModelHook } from './model-hook';\nimport extendOperators from './operators';\nimport { RelationRepository } from './relation-repository/relation-repository';\nimport { Repository } from './repository';\n\nexport interface MergeOptions extends merge.Options {}\n\nexport interface PendingOptions {\n field: RelationField;\n model: ModelCtor<Model>;\n}\n\ninterface MapOf<T> {\n [key: string]: T;\n}\n\nexport interface IDatabaseOptions extends Options {\n tablePrefix?: string;\n}\n\nexport type DatabaseOptions = IDatabaseOptions | Sequelize;\n\ninterface RegisterOperatorsContext {\n db?: Database;\n path?: string;\n field?: Field;\n app?: any;\n}\n\nexport interface CleanOptions extends QueryInterfaceDropAllTablesOptions {\n drop?: boolean;\n}\n\ntype OperatorFunc = (value: any, ctx?: RegisterOperatorsContext) => any;\n\nexport class Database extends EventEmitter implements AsyncEmitter {\n sequelize: Sequelize;\n fieldTypes = new Map();\n options: IDatabaseOptions;\n models = new Map<string, ModelCtor<Model>>();\n repositories = new Map<string, RepositoryType>();\n operators = new Map();\n collections = new Map<string, Collection>();\n pendingFields = new Map<string, RelationField[]>();\n modelCollection = new Map<ModelCtor<any>, Collection>();\n\n modelHook: ModelHook;\n\n delayCollectionExtend = new Map<string, { collectionOptions: CollectionOptions; mergeOptions?: any }[]>();\n\n constructor(options: DatabaseOptions) {\n super();\n\n if (options instanceof Sequelize) {\n this.sequelize = options;\n } else {\n this.sequelize = new Sequelize(options);\n this.options = options;\n }\n\n this.collections = new Map();\n this.modelHook = new ModelHook(this);\n\n this.on('afterDefineCollection', (collection: Collection) => {\n // after collection defined, call bind method on pending fields\n this.pendingFields.get(collection.name)?.forEach((field) => field.bind());\n this.delayCollectionExtend.get(collection.name)?.forEach((collectionExtend) => {\n collection.updateOptions(collectionExtend.collectionOptions, collectionExtend.mergeOptions);\n });\n });\n\n // register database field types\n for (const [name, field] of Object.entries(FieldTypes)) {\n if (['Field', 'RelationField'].includes(name)) {\n continue;\n }\n let key = name.replace(/Field$/g, '');\n key = key.substring(0, 1).toLowerCase() + key.substring(1);\n this.registerFieldTypes({\n [key]: field,\n });\n }\n\n this.initOperators();\n }\n\n /**\n * Add collection to database\n * @param options\n */\n collection<Attributes = any, CreateAttributes = Attributes>(\n options: CollectionOptions,\n ): Collection<Attributes, CreateAttributes> {\n this.emit('beforeDefineCollection', options);\n\n const collection = new Collection(options, {\n database: this,\n });\n\n this.collections.set(collection.name, collection);\n this.modelCollection.set(collection.model, collection);\n\n this.emit('afterDefineCollection', collection);\n\n return collection;\n }\n\n getTablePrefix() {\n return this.options.tablePrefix || '';\n }\n\n /**\n * get exists collection by its name\n * @param name\n */\n getCollection(name: string): Collection {\n return this.collections.get(name);\n }\n\n hasCollection(name: string): boolean {\n return this.collections.has(name);\n }\n\n removeCollection(name: string) {\n const collection = this.collections.get(name);\n this.emit('beforeRemoveCollection', collection);\n\n const result = this.collections.delete(name);\n\n if (result) {\n this.emit('afterRemoveCollection', collection);\n }\n }\n\n getModel<M extends Model>(name: string) {\n return this.getCollection(name).model as ModelCtor<M>;\n }\n\n getRepository<R extends Repository>(name: string): R;\n getRepository<R extends RelationRepository>(name: string, relationId: string | number): R;\n\n getRepository<R extends RelationRepository>(name: string, relationId?: string | number): Repository | R {\n if (relationId) {\n const [collection, relation] = name.split('.');\n return this.getRepository(collection)?.relation(relation)?.of(relationId) as R;\n }\n\n return this.getCollection(name)?.repository;\n }\n\n addPendingField(field: RelationField) {\n const associating = this.pendingFields;\n const items = this.pendingFields.get(field.target) || [];\n items.push(field);\n associating.set(field.target, items);\n }\n\n removePendingField(field: RelationField) {\n const items = this.pendingFields.get(field.target) || [];\n const index = items.indexOf(field);\n if (index !== -1) {\n delete items[index];\n this.pendingFields.set(field.target, items);\n }\n }\n\n registerFieldTypes(fieldTypes: MapOf<typeof Field>) {\n for (const [type, fieldType] of Object.entries(fieldTypes)) {\n this.fieldTypes.set(type, fieldType);\n }\n }\n\n registerModels(models: MapOf<ModelCtor<any>>) {\n for (const [type, schemaType] of Object.entries(models)) {\n this.models.set(type, schemaType);\n }\n }\n\n registerRepositories(repositories: MapOf<RepositoryType>) {\n for (const [type, schemaType] of Object.entries(repositories)) {\n this.repositories.set(type, schemaType);\n }\n }\n\n initOperators() {\n const operators = new Map();\n\n // Sequelize 内置\n for (const key in Op) {\n operators.set('$' + key, Op[key]);\n const val = Utils.underscoredIf(key, true);\n operators.set('$' + val, Op[key]);\n operators.set('$' + val.replace(/_/g, ''), Op[key]);\n }\n\n this.operators = operators;\n\n this.registerOperators({\n ...extendOperators,\n });\n }\n\n registerOperators(operators: MapOf<OperatorFunc>) {\n for (const [key, operator] of Object.entries(operators)) {\n this.operators.set(key, operator);\n }\n }\n\n buildField(options, context: FieldContext) {\n const { type } = options;\n const Field = this.fieldTypes.get(type);\n if (!Field) {\n throw Error(`unsupported field type ${type}`);\n }\n return new Field(options, context);\n }\n\n async sync(options?: SyncOptions) {\n const isMySQL = this.sequelize.getDialect() === 'mysql';\n if (isMySQL) {\n await this.sequelize.query('SET FOREIGN_KEY_CHECKS = 0', null);\n }\n const result = await this.sequelize.sync(options);\n if (isMySQL) {\n await this.sequelize.query('SET FOREIGN_KEY_CHECKS = 1', null);\n }\n return result;\n }\n\n async clean(options: CleanOptions) {\n const { drop, ...others } = options;\n if (drop) {\n await this.sequelize.getQueryInterface().dropAllTables(others);\n }\n }\n\n public isSqliteMemory() {\n return this.sequelize.getDialect() === 'sqlite' && lodash.get(this.options, 'storage') == ':memory:';\n }\n\n async reconnect() {\n if (this.isSqliteMemory()) {\n return;\n }\n // @ts-ignore\n const ConnectionManager = this.sequelize.dialect.connectionManager.constructor;\n // @ts-ignore\n const connectionManager = new ConnectionManager(this.sequelize.dialect, this.sequelize);\n // @ts-ignore\n this.sequelize.dialect.connectionManager = connectionManager;\n // @ts-ignore\n this.sequelize.connectionManager = connectionManager;\n }\n\n closed() {\n // @ts-ignore\n return this.sequelize.connectionManager.pool._draining;\n }\n\n async close() {\n if (this.isSqliteMemory()) {\n return;\n }\n\n return this.sequelize.close();\n }\n\n on(event: string | symbol, listener: (...args: any[]) => void): this {\n const modelEventName = this.modelHook.isModelHook(event);\n\n if (modelEventName && !this.modelHook.hasBindEvent(modelEventName)) {\n this.sequelize.addHook(modelEventName, this.modelHook.sequelizeHookBuilder(modelEventName));\n\n this.modelHook.bindEvent(modelEventName);\n }\n\n return super.on(event, listener);\n }\n\n async import(options: { directory: string; extensions?: ImportFileExtension[] }): Promise<Map<string, Collection>> {\n const reader = new ImporterReader(options.directory, options.extensions);\n const modules = await reader.read();\n const result = new Map<string, Collection>();\n\n for (const module of modules) {\n if (module.extend) {\n const collectionName = module.collectionOptions.name;\n const existCollection = this.getCollection(collectionName);\n if (existCollection) {\n existCollection.updateOptions(module.collectionOptions, module.mergeOptions);\n } else {\n const existDelayExtends = this.delayCollectionExtend.get(collectionName) || [];\n\n this.delayCollectionExtend.set(collectionName, [...existDelayExtends, module]);\n }\n } else {\n const collection = this.collection(module);\n result.set(collection.name, collection);\n }\n }\n\n return result;\n }\n\n emitAsync: (event: string | symbol, ...args: any[]) => Promise<boolean>;\n}\n\nexport function extend(collectionOptions: CollectionOptions, mergeOptions?: MergeOptions) {\n return {\n collectionOptions,\n mergeOptions,\n extend: true,\n };\n}\n\nexport const defineCollection = (collectionOptions: CollectionOptions) => {\n return collectionOptions;\n};\n\nexport const extendCollection = (collectionOptions: CollectionOptions, mergeOptions?: MergeOptions) => {\n return {\n collectionOptions,\n mergeOptions,\n extend: true,\n };\n};\n\napplyMixins(Database, [AsyncEmitter]);\n\nexport default Database;\n"]}
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"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","sourcesContent":["import { applyMixins, AsyncEmitter } from '@nocobase/utils';\nimport merge from 'deepmerge';\nimport { EventEmitter } from 'events';\nimport lodash from 'lodash';\nimport {\n ModelCtor,\n Op,\n Options,\n QueryInterfaceDropAllTablesOptions,\n QueryOptions,\n Sequelize,\n SyncOptions,\n Utils\n} from 'sequelize';\nimport { Collection, CollectionOptions, RepositoryType } from './collection';\nimport { ImporterReader, ImportFileExtension } from './collection-importer';\nimport * as FieldTypes from './fields';\nimport { Field, FieldContext, RelationField } from './fields';\nimport { Model } from './model';\nimport { ModelHook } from './model-hook';\nimport extendOperators from './operators';\nimport { RelationRepository } from './relation-repository/relation-repository';\nimport { Repository } from './repository';\n\nexport interface MergeOptions extends merge.Options {}\n\nexport interface PendingOptions {\n field: RelationField;\n model: ModelCtor<Model>;\n}\n\ninterface MapOf<T> {\n [key: string]: T;\n}\n\nexport interface IDatabaseOptions extends Options {\n tablePrefix?: string;\n}\n\nexport type DatabaseOptions = IDatabaseOptions | Sequelize;\n\ninterface RegisterOperatorsContext {\n db?: Database;\n path?: string;\n field?: Field;\n app?: any;\n}\n\nexport interface CleanOptions extends QueryInterfaceDropAllTablesOptions {\n drop?: boolean;\n}\n\ntype OperatorFunc = (value: any, ctx?: RegisterOperatorsContext) => any;\n\nexport class Database extends EventEmitter implements AsyncEmitter {\n sequelize: Sequelize;\n fieldTypes = new Map();\n options: IDatabaseOptions;\n models = new Map<string, ModelCtor<Model>>();\n repositories = new Map<string, RepositoryType>();\n operators = new Map();\n collections = new Map<string, Collection>();\n pendingFields = new Map<string, RelationField[]>();\n modelCollection = new Map<ModelCtor<any>, Collection>();\n\n modelHook: ModelHook;\n\n delayCollectionExtend = new Map<string, { collectionOptions: CollectionOptions; mergeOptions?: any }[]>();\n\n constructor(options: DatabaseOptions) {\n super();\n\n if (options instanceof Sequelize) {\n this.sequelize = options;\n } else {\n const opts = {\n sync: {\n alter: {\n drop: false,\n },\n force: false,\n },\n ...options,\n };\n this.sequelize = new Sequelize(opts);\n this.options = opts;\n }\n\n this.collections = new Map();\n this.modelHook = new ModelHook(this);\n\n this.on('afterDefineCollection', (collection: Collection) => {\n // after collection defined, call bind method on pending fields\n this.pendingFields.get(collection.name)?.forEach((field) => field.bind());\n this.delayCollectionExtend.get(collection.name)?.forEach((collectionExtend) => {\n collection.updateOptions(collectionExtend.collectionOptions, collectionExtend.mergeOptions);\n });\n });\n\n // register database field types\n for (const [name, field] of Object.entries(FieldTypes)) {\n if (['Field', 'RelationField'].includes(name)) {\n continue;\n }\n let key = name.replace(/Field$/g, '');\n key = key.substring(0, 1).toLowerCase() + key.substring(1);\n this.registerFieldTypes({\n [key]: field,\n });\n }\n\n this.initOperators();\n }\n\n /**\n * Add collection to database\n * @param options\n */\n collection<Attributes = any, CreateAttributes = Attributes>(\n options: CollectionOptions,\n ): Collection<Attributes, CreateAttributes> {\n this.emit('beforeDefineCollection', options);\n\n const collection = new Collection(options, {\n database: this,\n });\n\n this.collections.set(collection.name, collection);\n this.modelCollection.set(collection.model, collection);\n\n this.emit('afterDefineCollection', collection);\n\n return collection;\n }\n\n getTablePrefix() {\n return this.options.tablePrefix || '';\n }\n\n /**\n * get exists collection by its name\n * @param name\n */\n getCollection(name: string): Collection {\n return this.collections.get(name);\n }\n\n hasCollection(name: string): boolean {\n return this.collections.has(name);\n }\n\n removeCollection(name: string) {\n const collection = this.collections.get(name);\n this.emit('beforeRemoveCollection', collection);\n\n const result = this.collections.delete(name);\n\n if (result) {\n this.emit('afterRemoveCollection', collection);\n }\n }\n\n getModel<M extends Model>(name: string) {\n return this.getCollection(name).model as ModelCtor<M>;\n }\n\n getRepository<R extends Repository>(name: string): R;\n getRepository<R extends RelationRepository>(name: string, relationId: string | number): R;\n\n getRepository<R extends RelationRepository>(name: string, relationId?: string | number): Repository | R {\n if (relationId) {\n const [collection, relation] = name.split('.');\n return this.getRepository(collection)?.relation(relation)?.of(relationId) as R;\n }\n\n return this.getCollection(name)?.repository;\n }\n\n addPendingField(field: RelationField) {\n const associating = this.pendingFields;\n const items = this.pendingFields.get(field.target) || [];\n items.push(field);\n associating.set(field.target, items);\n }\n\n removePendingField(field: RelationField) {\n const items = this.pendingFields.get(field.target) || [];\n const index = items.indexOf(field);\n if (index !== -1) {\n delete items[index];\n this.pendingFields.set(field.target, items);\n }\n }\n\n registerFieldTypes(fieldTypes: MapOf<typeof Field>) {\n for (const [type, fieldType] of Object.entries(fieldTypes)) {\n this.fieldTypes.set(type, fieldType);\n }\n }\n\n registerModels(models: MapOf<ModelCtor<any>>) {\n for (const [type, schemaType] of Object.entries(models)) {\n this.models.set(type, schemaType);\n }\n }\n\n registerRepositories(repositories: MapOf<RepositoryType>) {\n for (const [type, schemaType] of Object.entries(repositories)) {\n this.repositories.set(type, schemaType);\n }\n }\n\n initOperators() {\n const operators = new Map();\n\n // Sequelize 内置\n for (const key in Op) {\n operators.set('$' + key, Op[key]);\n const val = Utils.underscoredIf(key, true);\n operators.set('$' + val, Op[key]);\n operators.set('$' + val.replace(/_/g, ''), Op[key]);\n }\n\n this.operators = operators;\n\n this.registerOperators({\n ...extendOperators,\n });\n }\n\n registerOperators(operators: MapOf<OperatorFunc>) {\n for (const [key, operator] of Object.entries(operators)) {\n this.operators.set(key, operator);\n }\n }\n\n buildField(options, context: FieldContext) {\n const { type } = options;\n const Field = this.fieldTypes.get(type);\n if (!Field) {\n throw Error(`unsupported field type ${type}`);\n }\n return new Field(options, context);\n }\n\n async sync(options?: SyncOptions) {\n const isMySQL = this.sequelize.getDialect() === 'mysql';\n if (isMySQL) {\n await this.sequelize.query('SET FOREIGN_KEY_CHECKS = 0', null);\n }\n const result = await this.sequelize.sync(options);\n if (isMySQL) {\n await this.sequelize.query('SET FOREIGN_KEY_CHECKS = 1', null);\n }\n return result;\n }\n\n async clean(options: CleanOptions) {\n const { drop, ...others } = options;\n if (drop) {\n await this.sequelize.getQueryInterface().dropAllTables(others);\n }\n }\n\n public isSqliteMemory() {\n return this.sequelize.getDialect() === 'sqlite' && lodash.get(this.options, 'storage') == ':memory:';\n }\n\n async auth(options: QueryOptions & { repeat?: number } = {}) {\n const { repeat = 10, ...others } = options;\n const delay = (ms) => new Promise((yea) => setTimeout(yea, ms));\n let count = 0;\n const authenticate = async () => {\n try {\n await this.sequelize.authenticate(others);\n console.log('Connection has been established successfully.');\n return true;\n } catch (error) {\n console.log('reconnecting...', count);\n if (count >= repeat) {\n throw error;\n }\n ++count;\n await delay(500);\n return await authenticate();\n }\n };\n\n return await authenticate();\n }\n\n async reconnect() {\n if (this.isSqliteMemory()) {\n return;\n }\n // @ts-ignore\n const ConnectionManager = this.sequelize.dialect.connectionManager.constructor;\n // @ts-ignore\n const connectionManager = new ConnectionManager(this.sequelize.dialect, this.sequelize);\n // @ts-ignore\n this.sequelize.dialect.connectionManager = connectionManager;\n // @ts-ignore\n this.sequelize.connectionManager = connectionManager;\n }\n\n closed() {\n // @ts-ignore\n return this.sequelize.connectionManager.pool._draining;\n }\n\n async close() {\n if (this.isSqliteMemory()) {\n return;\n }\n\n return this.sequelize.close();\n }\n\n on(event: string | symbol, listener: (...args: any[]) => void): this {\n const modelEventName = this.modelHook.isModelHook(event);\n\n if (modelEventName && !this.modelHook.hasBindEvent(modelEventName)) {\n this.sequelize.addHook(modelEventName, this.modelHook.sequelizeHookBuilder(modelEventName));\n\n this.modelHook.bindEvent(modelEventName);\n }\n\n return super.on(event, listener);\n }\n\n async import(options: { directory: string; extensions?: ImportFileExtension[] }): Promise<Map<string, Collection>> {\n const reader = new ImporterReader(options.directory, options.extensions);\n const modules = await reader.read();\n const result = new Map<string, Collection>();\n\n for (const module of modules) {\n if (module.extend) {\n const collectionName = module.collectionOptions.name;\n const existCollection = this.getCollection(collectionName);\n if (existCollection) {\n existCollection.updateOptions(module.collectionOptions, module.mergeOptions);\n } else {\n const existDelayExtends = this.delayCollectionExtend.get(collectionName) || [];\n\n this.delayCollectionExtend.set(collectionName, [...existDelayExtends, module]);\n }\n } else {\n const collection = this.collection(module);\n result.set(collection.name, collection);\n }\n }\n\n return result;\n }\n\n emitAsync: (event: string | symbol, ...args: any[]) => Promise<boolean>;\n}\n\nexport function extend(collectionOptions: CollectionOptions, mergeOptions?: MergeOptions) {\n return {\n collectionOptions,\n mergeOptions,\n extend: true,\n };\n}\n\nexport const defineCollection = (collectionOptions: CollectionOptions) => {\n return collectionOptions;\n};\n\nexport const extendCollection = (collectionOptions: CollectionOptions, mergeOptions?: MergeOptions) => {\n return {\n collectionOptions,\n mergeOptions,\n extend: true,\n };\n};\n\napplyMixins(Database, [AsyncEmitter]);\n\nexport default Database;\n"]}
@@ -7,7 +7,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
- import { lodash } from '@umijs/utils';
10
+ import lodash from 'lodash';
11
11
  import { DataTypes } from 'sequelize';
12
12
  import { Field } from './field';
13
13
  export class ContextField extends Field {
@@ -1 +1 @@
1
- {"version":3,"file":"context-field.js","sourceRoot":"","sources":["../../src/fields/context-field.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAA0B,KAAK,EAAE,MAAM,SAAS,CAAC;AAExD,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrC,IAAI,QAAQ;QACV,MAAM,IAAI,GAAW,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC;QACvD,OAAO,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC;IAC3D,CAAC;IAED,IAAI;QACF,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACzC,IAAI,CAAC,QAAQ,GAAG,CAAO,KAAY,EAAE,OAAO,EAAE,EAAE;YAC9C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;YAC5B,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;YAChD,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAA,CAAC;IACJ,CAAC;IAED,IAAI;QACF,KAAK,CAAC,IAAI,EAAE,CAAC;QACb,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACpC,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,CAAC,UAAU,EAAE;YACf,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;SACxC;IACH,CAAC;IAED,MAAM;QACJ,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,UAAU,EAAE;YACf,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;SACzC;IACH,CAAC;CACF","sourcesContent":["import { lodash } from '@umijs/utils';\nimport { DataTypes } from 'sequelize';\nimport { Model } from '../model';\nimport { BaseColumnFieldOptions, Field } from './field';\n\nexport class ContextField extends Field {\n get dataType() {\n const type: string = this.options.dataType || 'string';\n return DataTypes[type.toUpperCase()] || DataTypes.STRING;\n }\n\n init() {\n const { name, dataIndex } = this.options;\n this.listener = async (model: Model, options) => {\n const { context } = options;\n model.set(name, lodash.get(context, dataIndex));\n model.changed(name, true);\n };\n }\n\n bind() {\n super.bind();\n const { createOnly } = this.options;\n this.on('beforeCreate', this.listener);\n if (!createOnly) {\n this.on('beforeUpdate', this.listener);\n }\n }\n\n unbind() {\n super.unbind();\n const { createOnly } = this.options;\n this.off('beforeCreate', this.listener);\n if (!createOnly) {\n this.off('beforeUpdate', this.listener);\n }\n }\n}\n\nexport interface ContextFieldOptions extends BaseColumnFieldOptions {\n type: 'context';\n dataIndex: string;\n dataType?: string;\n createOnly?: boolean;\n}\n"]}
1
+ {"version":3,"file":"context-field.js","sourceRoot":"","sources":["../../src/fields/context-field.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAA0B,KAAK,EAAE,MAAM,SAAS,CAAC;AAExD,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrC,IAAI,QAAQ;QACV,MAAM,IAAI,GAAW,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC;QACvD,OAAO,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC;IAC3D,CAAC;IAED,IAAI;QACF,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACzC,IAAI,CAAC,QAAQ,GAAG,CAAO,KAAY,EAAE,OAAO,EAAE,EAAE;YAC9C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;YAC5B,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;YAChD,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAA,CAAC;IACJ,CAAC;IAED,IAAI;QACF,KAAK,CAAC,IAAI,EAAE,CAAC;QACb,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACpC,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,CAAC,UAAU,EAAE;YACf,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;SACxC;IACH,CAAC;IAED,MAAM;QACJ,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,UAAU,EAAE;YACf,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;SACzC;IACH,CAAC;CACF","sourcesContent":["import lodash from 'lodash';\nimport { DataTypes } from 'sequelize';\nimport { Model } from '../model';\nimport { BaseColumnFieldOptions, Field } from './field';\n\nexport class ContextField extends Field {\n get dataType() {\n const type: string = this.options.dataType || 'string';\n return DataTypes[type.toUpperCase()] || DataTypes.STRING;\n }\n\n init() {\n const { name, dataIndex } = this.options;\n this.listener = async (model: Model, options) => {\n const { context } = options;\n model.set(name, lodash.get(context, dataIndex));\n model.changed(name, true);\n };\n }\n\n bind() {\n super.bind();\n const { createOnly } = this.options;\n this.on('beforeCreate', this.listener);\n if (!createOnly) {\n this.on('beforeUpdate', this.listener);\n }\n }\n\n unbind() {\n super.unbind();\n const { createOnly } = this.options;\n this.off('beforeCreate', this.listener);\n if (!createOnly) {\n this.off('beforeUpdate', this.listener);\n }\n }\n}\n\nexport interface ContextFieldOptions extends BaseColumnFieldOptions {\n type: 'context';\n dataIndex: string;\n dataType?: string;\n createOnly?: boolean;\n}\n"]}
@@ -16,6 +16,7 @@ import { StringFieldOptions } from './string-field';
16
16
  import { TextFieldOptions } from './text-field';
17
17
  import { TimeFieldOptions } from './time-field';
18
18
  import { UidFieldOptions } from './uid-field';
19
+ import { UUIDFieldOptions } from './uuid-field';
19
20
  import { VirtualFieldOptions } from './virtual-field';
20
21
  export * from './array-field';
21
22
  export * from './belongs-to-field';
@@ -36,5 +37,6 @@ export * from './string-field';
36
37
  export * from './text-field';
37
38
  export * from './time-field';
38
39
  export * from './uid-field';
40
+ export * from './uuid-field';
39
41
  export * from './virtual-field';
40
- export declare type FieldOptions = BaseFieldOptions | StringFieldOptions | IntegerFieldOptions | FloatFieldOptions | DecimalFieldOptions | DoubleFieldOptions | RealFieldOptions | JsonFieldOptions | JsonbFieldOptions | BooleanFieldOptions | RadioFieldOptions | SortFieldOptions | TextFieldOptions | VirtualFieldOptions | ArrayFieldOptions | TimeFieldOptions | DateFieldOptions | UidFieldOptions | PasswordFieldOptions | ContextFieldOptions | BelongsToFieldOptions | HasOneFieldOptions | HasManyFieldOptions | BelongsToManyFieldOptions;
42
+ export declare type FieldOptions = BaseFieldOptions | StringFieldOptions | IntegerFieldOptions | FloatFieldOptions | DecimalFieldOptions | DoubleFieldOptions | RealFieldOptions | JsonFieldOptions | JsonbFieldOptions | BooleanFieldOptions | RadioFieldOptions | SortFieldOptions | TextFieldOptions | VirtualFieldOptions | ArrayFieldOptions | TimeFieldOptions | DateFieldOptions | UidFieldOptions | UUIDFieldOptions | PasswordFieldOptions | ContextFieldOptions | BelongsToFieldOptions | HasOneFieldOptions | HasManyFieldOptions | BelongsToManyFieldOptions;
@@ -17,5 +17,6 @@ export * from './string-field';
17
17
  export * from './text-field';
18
18
  export * from './time-field';
19
19
  export * from './uid-field';
20
+ export * from './uuid-field';
20
21
  export * from './virtual-field';
21
22
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fields/index.ts"],"names":[],"mappings":"AA0BA,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC","sourcesContent":["import { ArrayFieldOptions } from './array-field';\nimport { BelongsToFieldOptions } from './belongs-to-field';\nimport { BelongsToManyFieldOptions } from './belongs-to-many-field';\nimport { BooleanFieldOptions } from './boolean-field';\nimport { ContextFieldOptions } from './context-field';\nimport { DateFieldOptions } from './date-field';\nimport { BaseFieldOptions } from './field';\nimport { HasManyFieldOptions } from './has-many-field';\nimport { HasOneFieldOptions } from './has-one-field';\nimport { JsonbFieldOptions, JsonFieldOptions } from './json-field';\nimport {\n DecimalFieldOptions,\n DoubleFieldOptions,\n FloatFieldOptions,\n IntegerFieldOptions,\n RealFieldOptions\n} from './number-field';\nimport { PasswordFieldOptions } from './password-field';\nimport { RadioFieldOptions } from './radio-field';\nimport { SortFieldOptions } from './sort-field';\nimport { StringFieldOptions } from './string-field';\nimport { TextFieldOptions } from './text-field';\nimport { TimeFieldOptions } from './time-field';\nimport { UidFieldOptions } from './uid-field';\nimport { VirtualFieldOptions } from './virtual-field';\n\nexport * from './array-field';\nexport * from './belongs-to-field';\nexport * from './belongs-to-many-field';\nexport * from './boolean-field';\nexport * from './context-field';\nexport * from './date-field';\nexport * from './field';\nexport * from './has-many-field';\nexport * from './has-one-field';\nexport * from './json-field';\nexport * from './number-field';\nexport * from './password-field';\nexport * from './radio-field';\nexport * from './relation-field';\nexport * from './sort-field';\nexport * from './string-field';\nexport * from './text-field';\nexport * from './time-field';\nexport * from './uid-field';\nexport * from './virtual-field';\n\nexport type FieldOptions =\n | BaseFieldOptions\n | StringFieldOptions\n | IntegerFieldOptions\n | FloatFieldOptions\n | DecimalFieldOptions\n | DoubleFieldOptions\n | RealFieldOptions\n | JsonFieldOptions\n | JsonbFieldOptions\n | BooleanFieldOptions\n | RadioFieldOptions\n | SortFieldOptions\n | TextFieldOptions\n | VirtualFieldOptions\n | ArrayFieldOptions\n | TimeFieldOptions\n | DateFieldOptions\n | UidFieldOptions\n | PasswordFieldOptions\n | ContextFieldOptions\n | BelongsToFieldOptions\n | HasOneFieldOptions\n | HasManyFieldOptions\n | BelongsToManyFieldOptions;\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fields/index.ts"],"names":[],"mappings":"AA2BA,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC","sourcesContent":["import { ArrayFieldOptions } from './array-field';\nimport { BelongsToFieldOptions } from './belongs-to-field';\nimport { BelongsToManyFieldOptions } from './belongs-to-many-field';\nimport { BooleanFieldOptions } from './boolean-field';\nimport { ContextFieldOptions } from './context-field';\nimport { DateFieldOptions } from './date-field';\nimport { BaseFieldOptions } from './field';\nimport { HasManyFieldOptions } from './has-many-field';\nimport { HasOneFieldOptions } from './has-one-field';\nimport { JsonbFieldOptions, JsonFieldOptions } from './json-field';\nimport {\n DecimalFieldOptions,\n DoubleFieldOptions,\n FloatFieldOptions,\n IntegerFieldOptions,\n RealFieldOptions\n} from './number-field';\nimport { PasswordFieldOptions } from './password-field';\nimport { RadioFieldOptions } from './radio-field';\nimport { SortFieldOptions } from './sort-field';\nimport { StringFieldOptions } from './string-field';\nimport { TextFieldOptions } from './text-field';\nimport { TimeFieldOptions } from './time-field';\nimport { UidFieldOptions } from './uid-field';\nimport { UUIDFieldOptions } from './uuid-field';\nimport { VirtualFieldOptions } from './virtual-field';\n\nexport * from './array-field';\nexport * from './belongs-to-field';\nexport * from './belongs-to-many-field';\nexport * from './boolean-field';\nexport * from './context-field';\nexport * from './date-field';\nexport * from './field';\nexport * from './has-many-field';\nexport * from './has-one-field';\nexport * from './json-field';\nexport * from './number-field';\nexport * from './password-field';\nexport * from './radio-field';\nexport * from './relation-field';\nexport * from './sort-field';\nexport * from './string-field';\nexport * from './text-field';\nexport * from './time-field';\nexport * from './uid-field';\nexport * from './uuid-field';\nexport * from './virtual-field';\n\nexport type FieldOptions =\n | BaseFieldOptions\n | StringFieldOptions\n | IntegerFieldOptions\n | FloatFieldOptions\n | DecimalFieldOptions\n | DoubleFieldOptions\n | RealFieldOptions\n | JsonFieldOptions\n | JsonbFieldOptions\n | BooleanFieldOptions\n | RadioFieldOptions\n | SortFieldOptions\n | TextFieldOptions\n | VirtualFieldOptions\n | ArrayFieldOptions\n | TimeFieldOptions\n | DateFieldOptions\n | UidFieldOptions\n | UUIDFieldOptions\n | PasswordFieldOptions\n | ContextFieldOptions\n | BelongsToFieldOptions\n | HasOneFieldOptions\n | HasManyFieldOptions\n | BelongsToManyFieldOptions;\n"]}
@@ -0,0 +1,9 @@
1
+ import { DataTypes } from 'sequelize';
2
+ import { BaseColumnFieldOptions, Field, FieldContext } from './field';
3
+ export declare class UuidField extends Field {
4
+ constructor(options?: any, context?: FieldContext);
5
+ get dataType(): DataTypes.AbstractDataTypeConstructor;
6
+ }
7
+ export interface UUIDFieldOptions extends BaseColumnFieldOptions {
8
+ type: 'uuid';
9
+ }
@@ -0,0 +1,11 @@
1
+ import { DataTypes } from 'sequelize';
2
+ import { Field } from './field';
3
+ export class UuidField extends Field {
4
+ constructor(options, context) {
5
+ super(Object.assign({ defaultValue: DataTypes.UUIDV4 }, options), context);
6
+ }
7
+ get dataType() {
8
+ return DataTypes.UUID;
9
+ }
10
+ }
11
+ //# sourceMappingURL=uuid-field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uuid-field.js","sourceRoot":"","sources":["../../src/fields/uuid-field.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAA0B,KAAK,EAAgB,MAAM,SAAS,CAAC;AAEtE,MAAM,OAAO,SAAU,SAAQ,KAAK;IAClC,YAAY,OAAa,EAAE,OAAsB;QAC/C,KAAK,iBAED,YAAY,EAAE,SAAS,CAAC,MAAM,IAC3B,OAAO,GAEZ,OAAO,CACR,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ;QACV,OAAO,SAAS,CAAC,IAAI,CAAC;IACxB,CAAC;CACF","sourcesContent":["import { DataTypes } from 'sequelize';\nimport { BaseColumnFieldOptions, Field, FieldContext } from './field';\n\nexport class UuidField extends Field {\n constructor(options?: any, context?: FieldContext) {\n super(\n {\n defaultValue: DataTypes.UUIDV4,\n ...options,\n },\n context,\n );\n }\n get dataType() {\n return DataTypes.UUID;\n }\n}\n\nexport interface UUIDFieldOptions extends BaseColumnFieldOptions {\n type: 'uuid';\n}\n"]}
package/esm/model-hook.js CHANGED
@@ -8,7 +8,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  });
9
9
  };
10
10
  import lodash from 'lodash';
11
- import { Model } from './model';
12
11
  const { hooks } = require('sequelize/lib/hooks');
13
12
  export class ModelHook {
14
13
  constructor(database) {
@@ -26,7 +25,7 @@ export class ModelHook {
26
25
  }
27
26
  findModelName(hookArgs) {
28
27
  for (const arg of hookArgs) {
29
- if (arg instanceof Model) {
28
+ if (arg === null || arg === void 0 ? void 0 : arg._previousDataValues) {
30
29
  return arg.constructor.name;
31
30
  }
32
31
  if (lodash.isPlainObject(arg)) {
@@ -1 +1 @@
1
- {"version":3,"file":"model-hook.js","sourceRoot":"","sources":["../src/model-hook.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAG5B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAEjD,MAAM,OAAO,SAAS;IAIpB,YAAY,QAAkB;QAF9B,eAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QAG7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,WAAW,CAAC,SAA0B;QACpC,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;YAC9B,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAE5C,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE;gBACnB,OAA6B,QAAQ,CAAC;aACvC;SACF;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,aAAa,CAAC,QAAQ;QACpB,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE;YAC1B,IAAI,GAAG,YAAY,KAAK,EAAE;gBACxB,OAAe,GAAI,CAAC,WAAW,CAAC,IAAI,CAAC;aACtC;YAED,IAAI,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE;gBAC7B,IAAI,GAAG,CAAC,OAAO,CAAC,EAAE;oBAChB,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;iBAC1B;gBAED,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE;oBAClC,OAAO,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;iBACvC;aACF;SACF;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,CAAC,SAAS;QACjB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IAED,YAAY,CAAC,SAAS;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,oBAAoB,CAAC,SAAS;QAC5B,OAAO,CAAO,GAAG,IAAW,EAAE,EAAE;YAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAE3C,IAAI,SAAS,EAAE;gBACb,mBAAmB;gBACnB,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,SAAS,IAAI,SAAS,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;aACrE;YAED,8BAA8B;YAC9B,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;QACpD,CAAC,CAAA,CAAC;IACJ,CAAC;CACF","sourcesContent":["import lodash from 'lodash';\nimport type { SequelizeHooks } from 'sequelize/types/lib/hooks';\nimport Database from './database';\nimport { Model } from './model';\n\nconst { hooks } = require('sequelize/lib/hooks');\n\nexport class ModelHook {\n database: Database;\n boundEvent = new Set<string>();\n\n constructor(database: Database) {\n this.database = database;\n }\n\n isModelHook(eventName: string | symbol): keyof SequelizeHooks | false {\n if (lodash.isString(eventName)) {\n const hookType = eventName.split('.').pop();\n\n if (hooks[hookType]) {\n return <keyof SequelizeHooks>hookType;\n }\n }\n\n return false;\n }\n\n findModelName(hookArgs) {\n for (const arg of hookArgs) {\n if (arg instanceof Model) {\n return (<Model>arg).constructor.name;\n }\n\n if (lodash.isPlainObject(arg)) {\n if (arg['model']) {\n return arg['model'].name;\n }\n\n if (lodash.get(arg, 'name.plural')) {\n return lodash.get(arg, 'name.plural');\n }\n }\n }\n\n return null;\n }\n\n bindEvent(eventName) {\n this.boundEvent.add(eventName);\n }\n\n hasBindEvent(eventName) {\n return this.boundEvent.has(eventName);\n }\n\n sequelizeHookBuilder(eventName) {\n return async (...args: any[]) => {\n const modelName = this.findModelName(args);\n\n if (modelName) {\n // emit model event\n await this.database.emitAsync(`${modelName}.${eventName}`, ...args);\n }\n\n // emit sequelize global event\n await this.database.emitAsync(eventName, ...args);\n };\n }\n}\n"]}
1
+ {"version":3,"file":"model-hook.js","sourceRoot":"","sources":["../src/model-hook.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAK5B,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAEjD,MAAM,OAAO,SAAS;IAIpB,YAAY,QAAkB;QAF9B,eAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QAG7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,WAAW,CAAC,SAA0B;QACpC,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;YAC9B,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAE5C,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE;gBACnB,OAA6B,QAAQ,CAAC;aACvC;SACF;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,aAAa,CAAC,QAAQ;QACpB,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE;YAC1B,IAAI,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,mBAAmB,EAAE;gBAC5B,OAAe,GAAI,CAAC,WAAW,CAAC,IAAI,CAAC;aACtC;YAED,IAAI,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE;gBAC7B,IAAI,GAAG,CAAC,OAAO,CAAC,EAAE;oBAChB,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;iBAC1B;gBAED,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE;oBAClC,OAAO,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;iBACvC;aACF;SACF;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,CAAC,SAAS;QACjB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IAED,YAAY,CAAC,SAAS;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,oBAAoB,CAAC,SAAS;QAC5B,OAAO,CAAO,GAAG,IAAW,EAAE,EAAE;YAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAE3C,IAAI,SAAS,EAAE;gBACb,mBAAmB;gBACnB,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,SAAS,IAAI,SAAS,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;aACrE;YAED,8BAA8B;YAC9B,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;QACpD,CAAC,CAAA,CAAC;IACJ,CAAC;CACF","sourcesContent":["import lodash from 'lodash';\nimport type { SequelizeHooks } from 'sequelize/types/lib/hooks';\nimport Database from './database';\nimport { Model } from './model';\n\nconst { hooks } = require('sequelize/lib/hooks');\n\nexport class ModelHook {\n database: Database;\n boundEvent = new Set<string>();\n\n constructor(database: Database) {\n this.database = database;\n }\n\n isModelHook(eventName: string | symbol): keyof SequelizeHooks | false {\n if (lodash.isString(eventName)) {\n const hookType = eventName.split('.').pop();\n\n if (hooks[hookType]) {\n return <keyof SequelizeHooks>hookType;\n }\n }\n\n return false;\n }\n\n findModelName(hookArgs) {\n for (const arg of hookArgs) {\n if (arg?._previousDataValues) {\n return (<Model>arg).constructor.name;\n }\n\n if (lodash.isPlainObject(arg)) {\n if (arg['model']) {\n return arg['model'].name;\n }\n\n if (lodash.get(arg, 'name.plural')) {\n return lodash.get(arg, 'name.plural');\n }\n }\n }\n\n return null;\n }\n\n bindEvent(eventName) {\n this.boundEvent.add(eventName);\n }\n\n hasBindEvent(eventName) {\n return this.boundEvent.has(eventName);\n }\n\n sequelizeHookBuilder(eventName) {\n return async (...args: any[]) => {\n const modelName = this.findModelName(args);\n\n if (modelName) {\n // emit model event\n await this.database.emitAsync(`${modelName}.${eventName}`, ...args);\n }\n\n // emit sequelize global event\n await this.database.emitAsync(eventName, ...args);\n };\n }\n}\n"]}
package/lib/database.d.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  import { AsyncEmitter } from '@nocobase/utils';
3
3
  import merge from 'deepmerge';
4
4
  import { EventEmitter } from 'events';
5
- import { ModelCtor, Options, QueryInterfaceDropAllTablesOptions, Sequelize, SyncOptions } from 'sequelize';
5
+ import { ModelCtor, Options, QueryInterfaceDropAllTablesOptions, QueryOptions, Sequelize, SyncOptions } from 'sequelize';
6
6
  import { Collection, CollectionOptions, RepositoryType } from './collection';
7
7
  import { ImportFileExtension } from './collection-importer';
8
8
  import * as FieldTypes from './fields';
@@ -77,6 +77,9 @@ export declare class Database extends EventEmitter implements AsyncEmitter {
77
77
  sync(options?: SyncOptions): Promise<Sequelize>;
78
78
  clean(options: CleanOptions): Promise<void>;
79
79
  isSqliteMemory(): boolean;
80
+ auth(options?: QueryOptions & {
81
+ repeat?: number;
82
+ }): Promise<any>;
80
83
  reconnect(): Promise<void>;
81
84
  closed(): any;
82
85
  close(): Promise<void>;
package/lib/database.js CHANGED
@@ -67,8 +67,14 @@ class Database extends events_1.EventEmitter {
67
67
  this.sequelize = options;
68
68
  }
69
69
  else {
70
- this.sequelize = new sequelize_1.Sequelize(options);
71
- this.options = options;
70
+ const opts = Object.assign({ sync: {
71
+ alter: {
72
+ drop: false,
73
+ },
74
+ force: false,
75
+ } }, options);
76
+ this.sequelize = new sequelize_1.Sequelize(opts);
77
+ this.options = opts;
72
78
  }
73
79
  this.collections = new Map();
74
80
  this.modelHook = new model_hook_1.ModelHook(this);
@@ -217,6 +223,30 @@ class Database extends events_1.EventEmitter {
217
223
  isSqliteMemory() {
218
224
  return this.sequelize.getDialect() === 'sqlite' && lodash_1.default.get(this.options, 'storage') == ':memory:';
219
225
  }
226
+ auth(options = {}) {
227
+ return __awaiter(this, void 0, void 0, function* () {
228
+ const { repeat = 10 } = options, others = __rest(options, ["repeat"]);
229
+ const delay = (ms) => new Promise((yea) => setTimeout(yea, ms));
230
+ let count = 0;
231
+ const authenticate = () => __awaiter(this, void 0, void 0, function* () {
232
+ try {
233
+ yield this.sequelize.authenticate(others);
234
+ console.log('Connection has been established successfully.');
235
+ return true;
236
+ }
237
+ catch (error) {
238
+ console.log('reconnecting...', count);
239
+ if (count >= repeat) {
240
+ throw error;
241
+ }
242
+ ++count;
243
+ yield delay(500);
244
+ return yield authenticate();
245
+ }
246
+ });
247
+ return yield authenticate();
248
+ });
249
+ }
220
250
  reconnect() {
221
251
  return __awaiter(this, void 0, void 0, function* () {
222
252
  if (this.isSqliteMemory()) {
@@ -1 +1 @@
1
- {"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"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","sourcesContent":["import { applyMixins, AsyncEmitter } from '@nocobase/utils';\nimport merge from 'deepmerge';\nimport { EventEmitter } from 'events';\nimport lodash from 'lodash';\nimport { ModelCtor, Op, Options, QueryInterfaceDropAllTablesOptions, Sequelize, SyncOptions, Utils } from 'sequelize';\nimport { Collection, CollectionOptions, RepositoryType } from './collection';\nimport { ImporterReader, ImportFileExtension } from './collection-importer';\nimport * as FieldTypes from './fields';\nimport { Field, FieldContext, RelationField } from './fields';\nimport { Model } from './model';\nimport { ModelHook } from './model-hook';\nimport extendOperators from './operators';\nimport { RelationRepository } from './relation-repository/relation-repository';\nimport { Repository } from './repository';\n\nexport interface MergeOptions extends merge.Options {}\n\nexport interface PendingOptions {\n field: RelationField;\n model: ModelCtor<Model>;\n}\n\ninterface MapOf<T> {\n [key: string]: T;\n}\n\nexport interface IDatabaseOptions extends Options {\n tablePrefix?: string;\n}\n\nexport type DatabaseOptions = IDatabaseOptions | Sequelize;\n\ninterface RegisterOperatorsContext {\n db?: Database;\n path?: string;\n field?: Field;\n app?: any;\n}\n\nexport interface CleanOptions extends QueryInterfaceDropAllTablesOptions {\n drop?: boolean;\n}\n\ntype OperatorFunc = (value: any, ctx?: RegisterOperatorsContext) => any;\n\nexport class Database extends EventEmitter implements AsyncEmitter {\n sequelize: Sequelize;\n fieldTypes = new Map();\n options: IDatabaseOptions;\n models = new Map<string, ModelCtor<Model>>();\n repositories = new Map<string, RepositoryType>();\n operators = new Map();\n collections = new Map<string, Collection>();\n pendingFields = new Map<string, RelationField[]>();\n modelCollection = new Map<ModelCtor<any>, Collection>();\n\n modelHook: ModelHook;\n\n delayCollectionExtend = new Map<string, { collectionOptions: CollectionOptions; mergeOptions?: any }[]>();\n\n constructor(options: DatabaseOptions) {\n super();\n\n if (options instanceof Sequelize) {\n this.sequelize = options;\n } else {\n this.sequelize = new Sequelize(options);\n this.options = options;\n }\n\n this.collections = new Map();\n this.modelHook = new ModelHook(this);\n\n this.on('afterDefineCollection', (collection: Collection) => {\n // after collection defined, call bind method on pending fields\n this.pendingFields.get(collection.name)?.forEach((field) => field.bind());\n this.delayCollectionExtend.get(collection.name)?.forEach((collectionExtend) => {\n collection.updateOptions(collectionExtend.collectionOptions, collectionExtend.mergeOptions);\n });\n });\n\n // register database field types\n for (const [name, field] of Object.entries(FieldTypes)) {\n if (['Field', 'RelationField'].includes(name)) {\n continue;\n }\n let key = name.replace(/Field$/g, '');\n key = key.substring(0, 1).toLowerCase() + key.substring(1);\n this.registerFieldTypes({\n [key]: field,\n });\n }\n\n this.initOperators();\n }\n\n /**\n * Add collection to database\n * @param options\n */\n collection<Attributes = any, CreateAttributes = Attributes>(\n options: CollectionOptions,\n ): Collection<Attributes, CreateAttributes> {\n this.emit('beforeDefineCollection', options);\n\n const collection = new Collection(options, {\n database: this,\n });\n\n this.collections.set(collection.name, collection);\n this.modelCollection.set(collection.model, collection);\n\n this.emit('afterDefineCollection', collection);\n\n return collection;\n }\n\n getTablePrefix() {\n return this.options.tablePrefix || '';\n }\n\n /**\n * get exists collection by its name\n * @param name\n */\n getCollection(name: string): Collection {\n return this.collections.get(name);\n }\n\n hasCollection(name: string): boolean {\n return this.collections.has(name);\n }\n\n removeCollection(name: string) {\n const collection = this.collections.get(name);\n this.emit('beforeRemoveCollection', collection);\n\n const result = this.collections.delete(name);\n\n if (result) {\n this.emit('afterRemoveCollection', collection);\n }\n }\n\n getModel<M extends Model>(name: string) {\n return this.getCollection(name).model as ModelCtor<M>;\n }\n\n getRepository<R extends Repository>(name: string): R;\n getRepository<R extends RelationRepository>(name: string, relationId: string | number): R;\n\n getRepository<R extends RelationRepository>(name: string, relationId?: string | number): Repository | R {\n if (relationId) {\n const [collection, relation] = name.split('.');\n return this.getRepository(collection)?.relation(relation)?.of(relationId) as R;\n }\n\n return this.getCollection(name)?.repository;\n }\n\n addPendingField(field: RelationField) {\n const associating = this.pendingFields;\n const items = this.pendingFields.get(field.target) || [];\n items.push(field);\n associating.set(field.target, items);\n }\n\n removePendingField(field: RelationField) {\n const items = this.pendingFields.get(field.target) || [];\n const index = items.indexOf(field);\n if (index !== -1) {\n delete items[index];\n this.pendingFields.set(field.target, items);\n }\n }\n\n registerFieldTypes(fieldTypes: MapOf<typeof Field>) {\n for (const [type, fieldType] of Object.entries(fieldTypes)) {\n this.fieldTypes.set(type, fieldType);\n }\n }\n\n registerModels(models: MapOf<ModelCtor<any>>) {\n for (const [type, schemaType] of Object.entries(models)) {\n this.models.set(type, schemaType);\n }\n }\n\n registerRepositories(repositories: MapOf<RepositoryType>) {\n for (const [type, schemaType] of Object.entries(repositories)) {\n this.repositories.set(type, schemaType);\n }\n }\n\n initOperators() {\n const operators = new Map();\n\n // Sequelize 内置\n for (const key in Op) {\n operators.set('$' + key, Op[key]);\n const val = Utils.underscoredIf(key, true);\n operators.set('$' + val, Op[key]);\n operators.set('$' + val.replace(/_/g, ''), Op[key]);\n }\n\n this.operators = operators;\n\n this.registerOperators({\n ...extendOperators,\n });\n }\n\n registerOperators(operators: MapOf<OperatorFunc>) {\n for (const [key, operator] of Object.entries(operators)) {\n this.operators.set(key, operator);\n }\n }\n\n buildField(options, context: FieldContext) {\n const { type } = options;\n const Field = this.fieldTypes.get(type);\n if (!Field) {\n throw Error(`unsupported field type ${type}`);\n }\n return new Field(options, context);\n }\n\n async sync(options?: SyncOptions) {\n const isMySQL = this.sequelize.getDialect() === 'mysql';\n if (isMySQL) {\n await this.sequelize.query('SET FOREIGN_KEY_CHECKS = 0', null);\n }\n const result = await this.sequelize.sync(options);\n if (isMySQL) {\n await this.sequelize.query('SET FOREIGN_KEY_CHECKS = 1', null);\n }\n return result;\n }\n\n async clean(options: CleanOptions) {\n const { drop, ...others } = options;\n if (drop) {\n await this.sequelize.getQueryInterface().dropAllTables(others);\n }\n }\n\n public isSqliteMemory() {\n return this.sequelize.getDialect() === 'sqlite' && lodash.get(this.options, 'storage') == ':memory:';\n }\n\n async reconnect() {\n if (this.isSqliteMemory()) {\n return;\n }\n // @ts-ignore\n const ConnectionManager = this.sequelize.dialect.connectionManager.constructor;\n // @ts-ignore\n const connectionManager = new ConnectionManager(this.sequelize.dialect, this.sequelize);\n // @ts-ignore\n this.sequelize.dialect.connectionManager = connectionManager;\n // @ts-ignore\n this.sequelize.connectionManager = connectionManager;\n }\n\n closed() {\n // @ts-ignore\n return this.sequelize.connectionManager.pool._draining;\n }\n\n async close() {\n if (this.isSqliteMemory()) {\n return;\n }\n\n return this.sequelize.close();\n }\n\n on(event: string | symbol, listener: (...args: any[]) => void): this {\n const modelEventName = this.modelHook.isModelHook(event);\n\n if (modelEventName && !this.modelHook.hasBindEvent(modelEventName)) {\n this.sequelize.addHook(modelEventName, this.modelHook.sequelizeHookBuilder(modelEventName));\n\n this.modelHook.bindEvent(modelEventName);\n }\n\n return super.on(event, listener);\n }\n\n async import(options: { directory: string; extensions?: ImportFileExtension[] }): Promise<Map<string, Collection>> {\n const reader = new ImporterReader(options.directory, options.extensions);\n const modules = await reader.read();\n const result = new Map<string, Collection>();\n\n for (const module of modules) {\n if (module.extend) {\n const collectionName = module.collectionOptions.name;\n const existCollection = this.getCollection(collectionName);\n if (existCollection) {\n existCollection.updateOptions(module.collectionOptions, module.mergeOptions);\n } else {\n const existDelayExtends = this.delayCollectionExtend.get(collectionName) || [];\n\n this.delayCollectionExtend.set(collectionName, [...existDelayExtends, module]);\n }\n } else {\n const collection = this.collection(module);\n result.set(collection.name, collection);\n }\n }\n\n return result;\n }\n\n emitAsync: (event: string | symbol, ...args: any[]) => Promise<boolean>;\n}\n\nexport function extend(collectionOptions: CollectionOptions, mergeOptions?: MergeOptions) {\n return {\n collectionOptions,\n mergeOptions,\n extend: true,\n };\n}\n\nexport const defineCollection = (collectionOptions: CollectionOptions) => {\n return collectionOptions;\n};\n\nexport const extendCollection = (collectionOptions: CollectionOptions, mergeOptions?: MergeOptions) => {\n return {\n collectionOptions,\n mergeOptions,\n extend: true,\n };\n};\n\napplyMixins(Database, [AsyncEmitter]);\n\nexport default Database;\n"]}
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"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","sourcesContent":["import { applyMixins, AsyncEmitter } from '@nocobase/utils';\nimport merge from 'deepmerge';\nimport { EventEmitter } from 'events';\nimport lodash from 'lodash';\nimport {\n ModelCtor,\n Op,\n Options,\n QueryInterfaceDropAllTablesOptions,\n QueryOptions,\n Sequelize,\n SyncOptions,\n Utils\n} from 'sequelize';\nimport { Collection, CollectionOptions, RepositoryType } from './collection';\nimport { ImporterReader, ImportFileExtension } from './collection-importer';\nimport * as FieldTypes from './fields';\nimport { Field, FieldContext, RelationField } from './fields';\nimport { Model } from './model';\nimport { ModelHook } from './model-hook';\nimport extendOperators from './operators';\nimport { RelationRepository } from './relation-repository/relation-repository';\nimport { Repository } from './repository';\n\nexport interface MergeOptions extends merge.Options {}\n\nexport interface PendingOptions {\n field: RelationField;\n model: ModelCtor<Model>;\n}\n\ninterface MapOf<T> {\n [key: string]: T;\n}\n\nexport interface IDatabaseOptions extends Options {\n tablePrefix?: string;\n}\n\nexport type DatabaseOptions = IDatabaseOptions | Sequelize;\n\ninterface RegisterOperatorsContext {\n db?: Database;\n path?: string;\n field?: Field;\n app?: any;\n}\n\nexport interface CleanOptions extends QueryInterfaceDropAllTablesOptions {\n drop?: boolean;\n}\n\ntype OperatorFunc = (value: any, ctx?: RegisterOperatorsContext) => any;\n\nexport class Database extends EventEmitter implements AsyncEmitter {\n sequelize: Sequelize;\n fieldTypes = new Map();\n options: IDatabaseOptions;\n models = new Map<string, ModelCtor<Model>>();\n repositories = new Map<string, RepositoryType>();\n operators = new Map();\n collections = new Map<string, Collection>();\n pendingFields = new Map<string, RelationField[]>();\n modelCollection = new Map<ModelCtor<any>, Collection>();\n\n modelHook: ModelHook;\n\n delayCollectionExtend = new Map<string, { collectionOptions: CollectionOptions; mergeOptions?: any }[]>();\n\n constructor(options: DatabaseOptions) {\n super();\n\n if (options instanceof Sequelize) {\n this.sequelize = options;\n } else {\n const opts = {\n sync: {\n alter: {\n drop: false,\n },\n force: false,\n },\n ...options,\n };\n this.sequelize = new Sequelize(opts);\n this.options = opts;\n }\n\n this.collections = new Map();\n this.modelHook = new ModelHook(this);\n\n this.on('afterDefineCollection', (collection: Collection) => {\n // after collection defined, call bind method on pending fields\n this.pendingFields.get(collection.name)?.forEach((field) => field.bind());\n this.delayCollectionExtend.get(collection.name)?.forEach((collectionExtend) => {\n collection.updateOptions(collectionExtend.collectionOptions, collectionExtend.mergeOptions);\n });\n });\n\n // register database field types\n for (const [name, field] of Object.entries(FieldTypes)) {\n if (['Field', 'RelationField'].includes(name)) {\n continue;\n }\n let key = name.replace(/Field$/g, '');\n key = key.substring(0, 1).toLowerCase() + key.substring(1);\n this.registerFieldTypes({\n [key]: field,\n });\n }\n\n this.initOperators();\n }\n\n /**\n * Add collection to database\n * @param options\n */\n collection<Attributes = any, CreateAttributes = Attributes>(\n options: CollectionOptions,\n ): Collection<Attributes, CreateAttributes> {\n this.emit('beforeDefineCollection', options);\n\n const collection = new Collection(options, {\n database: this,\n });\n\n this.collections.set(collection.name, collection);\n this.modelCollection.set(collection.model, collection);\n\n this.emit('afterDefineCollection', collection);\n\n return collection;\n }\n\n getTablePrefix() {\n return this.options.tablePrefix || '';\n }\n\n /**\n * get exists collection by its name\n * @param name\n */\n getCollection(name: string): Collection {\n return this.collections.get(name);\n }\n\n hasCollection(name: string): boolean {\n return this.collections.has(name);\n }\n\n removeCollection(name: string) {\n const collection = this.collections.get(name);\n this.emit('beforeRemoveCollection', collection);\n\n const result = this.collections.delete(name);\n\n if (result) {\n this.emit('afterRemoveCollection', collection);\n }\n }\n\n getModel<M extends Model>(name: string) {\n return this.getCollection(name).model as ModelCtor<M>;\n }\n\n getRepository<R extends Repository>(name: string): R;\n getRepository<R extends RelationRepository>(name: string, relationId: string | number): R;\n\n getRepository<R extends RelationRepository>(name: string, relationId?: string | number): Repository | R {\n if (relationId) {\n const [collection, relation] = name.split('.');\n return this.getRepository(collection)?.relation(relation)?.of(relationId) as R;\n }\n\n return this.getCollection(name)?.repository;\n }\n\n addPendingField(field: RelationField) {\n const associating = this.pendingFields;\n const items = this.pendingFields.get(field.target) || [];\n items.push(field);\n associating.set(field.target, items);\n }\n\n removePendingField(field: RelationField) {\n const items = this.pendingFields.get(field.target) || [];\n const index = items.indexOf(field);\n if (index !== -1) {\n delete items[index];\n this.pendingFields.set(field.target, items);\n }\n }\n\n registerFieldTypes(fieldTypes: MapOf<typeof Field>) {\n for (const [type, fieldType] of Object.entries(fieldTypes)) {\n this.fieldTypes.set(type, fieldType);\n }\n }\n\n registerModels(models: MapOf<ModelCtor<any>>) {\n for (const [type, schemaType] of Object.entries(models)) {\n this.models.set(type, schemaType);\n }\n }\n\n registerRepositories(repositories: MapOf<RepositoryType>) {\n for (const [type, schemaType] of Object.entries(repositories)) {\n this.repositories.set(type, schemaType);\n }\n }\n\n initOperators() {\n const operators = new Map();\n\n // Sequelize 内置\n for (const key in Op) {\n operators.set('$' + key, Op[key]);\n const val = Utils.underscoredIf(key, true);\n operators.set('$' + val, Op[key]);\n operators.set('$' + val.replace(/_/g, ''), Op[key]);\n }\n\n this.operators = operators;\n\n this.registerOperators({\n ...extendOperators,\n });\n }\n\n registerOperators(operators: MapOf<OperatorFunc>) {\n for (const [key, operator] of Object.entries(operators)) {\n this.operators.set(key, operator);\n }\n }\n\n buildField(options, context: FieldContext) {\n const { type } = options;\n const Field = this.fieldTypes.get(type);\n if (!Field) {\n throw Error(`unsupported field type ${type}`);\n }\n return new Field(options, context);\n }\n\n async sync(options?: SyncOptions) {\n const isMySQL = this.sequelize.getDialect() === 'mysql';\n if (isMySQL) {\n await this.sequelize.query('SET FOREIGN_KEY_CHECKS = 0', null);\n }\n const result = await this.sequelize.sync(options);\n if (isMySQL) {\n await this.sequelize.query('SET FOREIGN_KEY_CHECKS = 1', null);\n }\n return result;\n }\n\n async clean(options: CleanOptions) {\n const { drop, ...others } = options;\n if (drop) {\n await this.sequelize.getQueryInterface().dropAllTables(others);\n }\n }\n\n public isSqliteMemory() {\n return this.sequelize.getDialect() === 'sqlite' && lodash.get(this.options, 'storage') == ':memory:';\n }\n\n async auth(options: QueryOptions & { repeat?: number } = {}) {\n const { repeat = 10, ...others } = options;\n const delay = (ms) => new Promise((yea) => setTimeout(yea, ms));\n let count = 0;\n const authenticate = async () => {\n try {\n await this.sequelize.authenticate(others);\n console.log('Connection has been established successfully.');\n return true;\n } catch (error) {\n console.log('reconnecting...', count);\n if (count >= repeat) {\n throw error;\n }\n ++count;\n await delay(500);\n return await authenticate();\n }\n };\n\n return await authenticate();\n }\n\n async reconnect() {\n if (this.isSqliteMemory()) {\n return;\n }\n // @ts-ignore\n const ConnectionManager = this.sequelize.dialect.connectionManager.constructor;\n // @ts-ignore\n const connectionManager = new ConnectionManager(this.sequelize.dialect, this.sequelize);\n // @ts-ignore\n this.sequelize.dialect.connectionManager = connectionManager;\n // @ts-ignore\n this.sequelize.connectionManager = connectionManager;\n }\n\n closed() {\n // @ts-ignore\n return this.sequelize.connectionManager.pool._draining;\n }\n\n async close() {\n if (this.isSqliteMemory()) {\n return;\n }\n\n return this.sequelize.close();\n }\n\n on(event: string | symbol, listener: (...args: any[]) => void): this {\n const modelEventName = this.modelHook.isModelHook(event);\n\n if (modelEventName && !this.modelHook.hasBindEvent(modelEventName)) {\n this.sequelize.addHook(modelEventName, this.modelHook.sequelizeHookBuilder(modelEventName));\n\n this.modelHook.bindEvent(modelEventName);\n }\n\n return super.on(event, listener);\n }\n\n async import(options: { directory: string; extensions?: ImportFileExtension[] }): Promise<Map<string, Collection>> {\n const reader = new ImporterReader(options.directory, options.extensions);\n const modules = await reader.read();\n const result = new Map<string, Collection>();\n\n for (const module of modules) {\n if (module.extend) {\n const collectionName = module.collectionOptions.name;\n const existCollection = this.getCollection(collectionName);\n if (existCollection) {\n existCollection.updateOptions(module.collectionOptions, module.mergeOptions);\n } else {\n const existDelayExtends = this.delayCollectionExtend.get(collectionName) || [];\n\n this.delayCollectionExtend.set(collectionName, [...existDelayExtends, module]);\n }\n } else {\n const collection = this.collection(module);\n result.set(collection.name, collection);\n }\n }\n\n return result;\n }\n\n emitAsync: (event: string | symbol, ...args: any[]) => Promise<boolean>;\n}\n\nexport function extend(collectionOptions: CollectionOptions, mergeOptions?: MergeOptions) {\n return {\n collectionOptions,\n mergeOptions,\n extend: true,\n };\n}\n\nexport const defineCollection = (collectionOptions: CollectionOptions) => {\n return collectionOptions;\n};\n\nexport const extendCollection = (collectionOptions: CollectionOptions, mergeOptions?: MergeOptions) => {\n return {\n collectionOptions,\n mergeOptions,\n extend: true,\n };\n};\n\napplyMixins(Database, [AsyncEmitter]);\n\nexport default Database;\n"]}
@@ -8,9 +8,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
9
  });
10
10
  };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
11
14
  Object.defineProperty(exports, "__esModule", { value: true });
12
15
  exports.ContextField = void 0;
13
- const utils_1 = require("@umijs/utils");
16
+ const lodash_1 = __importDefault(require("lodash"));
14
17
  const sequelize_1 = require("sequelize");
15
18
  const field_1 = require("./field");
16
19
  class ContextField extends field_1.Field {
@@ -22,7 +25,7 @@ class ContextField extends field_1.Field {
22
25
  const { name, dataIndex } = this.options;
23
26
  this.listener = (model, options) => __awaiter(this, void 0, void 0, function* () {
24
27
  const { context } = options;
25
- model.set(name, utils_1.lodash.get(context, dataIndex));
28
+ model.set(name, lodash_1.default.get(context, dataIndex));
26
29
  model.changed(name, true);
27
30
  });
28
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"context-field.js","sourceRoot":"","sources":["../../src/fields/context-field.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wCAAsC;AACtC,yCAAsC;AAEtC,mCAAwD;AAExD,MAAa,YAAa,SAAQ,aAAK;IACrC,IAAI,QAAQ;QACV,MAAM,IAAI,GAAW,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC;QACvD,OAAO,qBAAS,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,qBAAS,CAAC,MAAM,CAAC;IAC3D,CAAC;IAED,IAAI;QACF,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACzC,IAAI,CAAC,QAAQ,GAAG,CAAO,KAAY,EAAE,OAAO,EAAE,EAAE;YAC9C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;YAC5B,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,cAAM,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;YAChD,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAA,CAAC;IACJ,CAAC;IAED,IAAI;QACF,KAAK,CAAC,IAAI,EAAE,CAAC;QACb,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACpC,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,CAAC,UAAU,EAAE;YACf,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;SACxC;IACH,CAAC;IAED,MAAM;QACJ,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,UAAU,EAAE;YACf,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;SACzC;IACH,CAAC;CACF;AAhCD,oCAgCC","sourcesContent":["import { lodash } from '@umijs/utils';\nimport { DataTypes } from 'sequelize';\nimport { Model } from '../model';\nimport { BaseColumnFieldOptions, Field } from './field';\n\nexport class ContextField extends Field {\n get dataType() {\n const type: string = this.options.dataType || 'string';\n return DataTypes[type.toUpperCase()] || DataTypes.STRING;\n }\n\n init() {\n const { name, dataIndex } = this.options;\n this.listener = async (model: Model, options) => {\n const { context } = options;\n model.set(name, lodash.get(context, dataIndex));\n model.changed(name, true);\n };\n }\n\n bind() {\n super.bind();\n const { createOnly } = this.options;\n this.on('beforeCreate', this.listener);\n if (!createOnly) {\n this.on('beforeUpdate', this.listener);\n }\n }\n\n unbind() {\n super.unbind();\n const { createOnly } = this.options;\n this.off('beforeCreate', this.listener);\n if (!createOnly) {\n this.off('beforeUpdate', this.listener);\n }\n }\n}\n\nexport interface ContextFieldOptions extends BaseColumnFieldOptions {\n type: 'context';\n dataIndex: string;\n dataType?: string;\n createOnly?: boolean;\n}\n"]}
1
+ {"version":3,"file":"context-field.js","sourceRoot":"","sources":["../../src/fields/context-field.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,oDAA4B;AAC5B,yCAAsC;AAEtC,mCAAwD;AAExD,MAAa,YAAa,SAAQ,aAAK;IACrC,IAAI,QAAQ;QACV,MAAM,IAAI,GAAW,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC;QACvD,OAAO,qBAAS,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,qBAAS,CAAC,MAAM,CAAC;IAC3D,CAAC;IAED,IAAI;QACF,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACzC,IAAI,CAAC,QAAQ,GAAG,CAAO,KAAY,EAAE,OAAO,EAAE,EAAE;YAC9C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;YAC5B,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,gBAAM,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;YAChD,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAA,CAAC;IACJ,CAAC;IAED,IAAI;QACF,KAAK,CAAC,IAAI,EAAE,CAAC;QACb,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACpC,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,CAAC,UAAU,EAAE;YACf,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;SACxC;IACH,CAAC;IAED,MAAM;QACJ,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,UAAU,EAAE;YACf,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;SACzC;IACH,CAAC;CACF;AAhCD,oCAgCC","sourcesContent":["import lodash from 'lodash';\nimport { DataTypes } from 'sequelize';\nimport { Model } from '../model';\nimport { BaseColumnFieldOptions, Field } from './field';\n\nexport class ContextField extends Field {\n get dataType() {\n const type: string = this.options.dataType || 'string';\n return DataTypes[type.toUpperCase()] || DataTypes.STRING;\n }\n\n init() {\n const { name, dataIndex } = this.options;\n this.listener = async (model: Model, options) => {\n const { context } = options;\n model.set(name, lodash.get(context, dataIndex));\n model.changed(name, true);\n };\n }\n\n bind() {\n super.bind();\n const { createOnly } = this.options;\n this.on('beforeCreate', this.listener);\n if (!createOnly) {\n this.on('beforeUpdate', this.listener);\n }\n }\n\n unbind() {\n super.unbind();\n const { createOnly } = this.options;\n this.off('beforeCreate', this.listener);\n if (!createOnly) {\n this.off('beforeUpdate', this.listener);\n }\n }\n}\n\nexport interface ContextFieldOptions extends BaseColumnFieldOptions {\n type: 'context';\n dataIndex: string;\n dataType?: string;\n createOnly?: boolean;\n}\n"]}
@@ -16,6 +16,7 @@ import { StringFieldOptions } from './string-field';
16
16
  import { TextFieldOptions } from './text-field';
17
17
  import { TimeFieldOptions } from './time-field';
18
18
  import { UidFieldOptions } from './uid-field';
19
+ import { UUIDFieldOptions } from './uuid-field';
19
20
  import { VirtualFieldOptions } from './virtual-field';
20
21
  export * from './array-field';
21
22
  export * from './belongs-to-field';
@@ -36,5 +37,6 @@ export * from './string-field';
36
37
  export * from './text-field';
37
38
  export * from './time-field';
38
39
  export * from './uid-field';
40
+ export * from './uuid-field';
39
41
  export * from './virtual-field';
40
- export declare type FieldOptions = BaseFieldOptions | StringFieldOptions | IntegerFieldOptions | FloatFieldOptions | DecimalFieldOptions | DoubleFieldOptions | RealFieldOptions | JsonFieldOptions | JsonbFieldOptions | BooleanFieldOptions | RadioFieldOptions | SortFieldOptions | TextFieldOptions | VirtualFieldOptions | ArrayFieldOptions | TimeFieldOptions | DateFieldOptions | UidFieldOptions | PasswordFieldOptions | ContextFieldOptions | BelongsToFieldOptions | HasOneFieldOptions | HasManyFieldOptions | BelongsToManyFieldOptions;
42
+ export declare type FieldOptions = BaseFieldOptions | StringFieldOptions | IntegerFieldOptions | FloatFieldOptions | DecimalFieldOptions | DoubleFieldOptions | RealFieldOptions | JsonFieldOptions | JsonbFieldOptions | BooleanFieldOptions | RadioFieldOptions | SortFieldOptions | TextFieldOptions | VirtualFieldOptions | ArrayFieldOptions | TimeFieldOptions | DateFieldOptions | UidFieldOptions | UUIDFieldOptions | PasswordFieldOptions | ContextFieldOptions | BelongsToFieldOptions | HasOneFieldOptions | HasManyFieldOptions | BelongsToManyFieldOptions;
@@ -29,5 +29,6 @@ __exportStar(require("./string-field"), exports);
29
29
  __exportStar(require("./text-field"), exports);
30
30
  __exportStar(require("./time-field"), exports);
31
31
  __exportStar(require("./uid-field"), exports);
32
+ __exportStar(require("./uuid-field"), exports);
32
33
  __exportStar(require("./virtual-field"), exports);
33
34
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fields/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AA0BA,gDAA8B;AAC9B,qDAAmC;AACnC,0DAAwC;AACxC,kDAAgC;AAChC,kDAAgC;AAChC,+CAA6B;AAC7B,0CAAwB;AACxB,mDAAiC;AACjC,kDAAgC;AAChC,+CAA6B;AAC7B,iDAA+B;AAC/B,mDAAiC;AACjC,gDAA8B;AAC9B,mDAAiC;AACjC,+CAA6B;AAC7B,iDAA+B;AAC/B,+CAA6B;AAC7B,+CAA6B;AAC7B,8CAA4B;AAC5B,kDAAgC","sourcesContent":["import { ArrayFieldOptions } from './array-field';\nimport { BelongsToFieldOptions } from './belongs-to-field';\nimport { BelongsToManyFieldOptions } from './belongs-to-many-field';\nimport { BooleanFieldOptions } from './boolean-field';\nimport { ContextFieldOptions } from './context-field';\nimport { DateFieldOptions } from './date-field';\nimport { BaseFieldOptions } from './field';\nimport { HasManyFieldOptions } from './has-many-field';\nimport { HasOneFieldOptions } from './has-one-field';\nimport { JsonbFieldOptions, JsonFieldOptions } from './json-field';\nimport {\n DecimalFieldOptions,\n DoubleFieldOptions,\n FloatFieldOptions,\n IntegerFieldOptions,\n RealFieldOptions\n} from './number-field';\nimport { PasswordFieldOptions } from './password-field';\nimport { RadioFieldOptions } from './radio-field';\nimport { SortFieldOptions } from './sort-field';\nimport { StringFieldOptions } from './string-field';\nimport { TextFieldOptions } from './text-field';\nimport { TimeFieldOptions } from './time-field';\nimport { UidFieldOptions } from './uid-field';\nimport { VirtualFieldOptions } from './virtual-field';\n\nexport * from './array-field';\nexport * from './belongs-to-field';\nexport * from './belongs-to-many-field';\nexport * from './boolean-field';\nexport * from './context-field';\nexport * from './date-field';\nexport * from './field';\nexport * from './has-many-field';\nexport * from './has-one-field';\nexport * from './json-field';\nexport * from './number-field';\nexport * from './password-field';\nexport * from './radio-field';\nexport * from './relation-field';\nexport * from './sort-field';\nexport * from './string-field';\nexport * from './text-field';\nexport * from './time-field';\nexport * from './uid-field';\nexport * from './virtual-field';\n\nexport type FieldOptions =\n | BaseFieldOptions\n | StringFieldOptions\n | IntegerFieldOptions\n | FloatFieldOptions\n | DecimalFieldOptions\n | DoubleFieldOptions\n | RealFieldOptions\n | JsonFieldOptions\n | JsonbFieldOptions\n | BooleanFieldOptions\n | RadioFieldOptions\n | SortFieldOptions\n | TextFieldOptions\n | VirtualFieldOptions\n | ArrayFieldOptions\n | TimeFieldOptions\n | DateFieldOptions\n | UidFieldOptions\n | PasswordFieldOptions\n | ContextFieldOptions\n | BelongsToFieldOptions\n | HasOneFieldOptions\n | HasManyFieldOptions\n | BelongsToManyFieldOptions;\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fields/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AA2BA,gDAA8B;AAC9B,qDAAmC;AACnC,0DAAwC;AACxC,kDAAgC;AAChC,kDAAgC;AAChC,+CAA6B;AAC7B,0CAAwB;AACxB,mDAAiC;AACjC,kDAAgC;AAChC,+CAA6B;AAC7B,iDAA+B;AAC/B,mDAAiC;AACjC,gDAA8B;AAC9B,mDAAiC;AACjC,+CAA6B;AAC7B,iDAA+B;AAC/B,+CAA6B;AAC7B,+CAA6B;AAC7B,8CAA4B;AAC5B,+CAA6B;AAC7B,kDAAgC","sourcesContent":["import { ArrayFieldOptions } from './array-field';\nimport { BelongsToFieldOptions } from './belongs-to-field';\nimport { BelongsToManyFieldOptions } from './belongs-to-many-field';\nimport { BooleanFieldOptions } from './boolean-field';\nimport { ContextFieldOptions } from './context-field';\nimport { DateFieldOptions } from './date-field';\nimport { BaseFieldOptions } from './field';\nimport { HasManyFieldOptions } from './has-many-field';\nimport { HasOneFieldOptions } from './has-one-field';\nimport { JsonbFieldOptions, JsonFieldOptions } from './json-field';\nimport {\n DecimalFieldOptions,\n DoubleFieldOptions,\n FloatFieldOptions,\n IntegerFieldOptions,\n RealFieldOptions\n} from './number-field';\nimport { PasswordFieldOptions } from './password-field';\nimport { RadioFieldOptions } from './radio-field';\nimport { SortFieldOptions } from './sort-field';\nimport { StringFieldOptions } from './string-field';\nimport { TextFieldOptions } from './text-field';\nimport { TimeFieldOptions } from './time-field';\nimport { UidFieldOptions } from './uid-field';\nimport { UUIDFieldOptions } from './uuid-field';\nimport { VirtualFieldOptions } from './virtual-field';\n\nexport * from './array-field';\nexport * from './belongs-to-field';\nexport * from './belongs-to-many-field';\nexport * from './boolean-field';\nexport * from './context-field';\nexport * from './date-field';\nexport * from './field';\nexport * from './has-many-field';\nexport * from './has-one-field';\nexport * from './json-field';\nexport * from './number-field';\nexport * from './password-field';\nexport * from './radio-field';\nexport * from './relation-field';\nexport * from './sort-field';\nexport * from './string-field';\nexport * from './text-field';\nexport * from './time-field';\nexport * from './uid-field';\nexport * from './uuid-field';\nexport * from './virtual-field';\n\nexport type FieldOptions =\n | BaseFieldOptions\n | StringFieldOptions\n | IntegerFieldOptions\n | FloatFieldOptions\n | DecimalFieldOptions\n | DoubleFieldOptions\n | RealFieldOptions\n | JsonFieldOptions\n | JsonbFieldOptions\n | BooleanFieldOptions\n | RadioFieldOptions\n | SortFieldOptions\n | TextFieldOptions\n | VirtualFieldOptions\n | ArrayFieldOptions\n | TimeFieldOptions\n | DateFieldOptions\n | UidFieldOptions\n | UUIDFieldOptions\n | PasswordFieldOptions\n | ContextFieldOptions\n | BelongsToFieldOptions\n | HasOneFieldOptions\n | HasManyFieldOptions\n | BelongsToManyFieldOptions;\n"]}
@@ -0,0 +1,9 @@
1
+ import { DataTypes } from 'sequelize';
2
+ import { BaseColumnFieldOptions, Field, FieldContext } from './field';
3
+ export declare class UuidField extends Field {
4
+ constructor(options?: any, context?: FieldContext);
5
+ get dataType(): DataTypes.AbstractDataTypeConstructor;
6
+ }
7
+ export interface UUIDFieldOptions extends BaseColumnFieldOptions {
8
+ type: 'uuid';
9
+ }
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UuidField = void 0;
4
+ const sequelize_1 = require("sequelize");
5
+ const field_1 = require("./field");
6
+ class UuidField extends field_1.Field {
7
+ constructor(options, context) {
8
+ super(Object.assign({ defaultValue: sequelize_1.DataTypes.UUIDV4 }, options), context);
9
+ }
10
+ get dataType() {
11
+ return sequelize_1.DataTypes.UUID;
12
+ }
13
+ }
14
+ exports.UuidField = UuidField;
15
+ //# sourceMappingURL=uuid-field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uuid-field.js","sourceRoot":"","sources":["../../src/fields/uuid-field.ts"],"names":[],"mappings":";;;AAAA,yCAAsC;AACtC,mCAAsE;AAEtE,MAAa,SAAU,SAAQ,aAAK;IAClC,YAAY,OAAa,EAAE,OAAsB;QAC/C,KAAK,iBAED,YAAY,EAAE,qBAAS,CAAC,MAAM,IAC3B,OAAO,GAEZ,OAAO,CACR,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ;QACV,OAAO,qBAAS,CAAC,IAAI,CAAC;IACxB,CAAC;CACF;AAbD,8BAaC","sourcesContent":["import { DataTypes } from 'sequelize';\nimport { BaseColumnFieldOptions, Field, FieldContext } from './field';\n\nexport class UuidField extends Field {\n constructor(options?: any, context?: FieldContext) {\n super(\n {\n defaultValue: DataTypes.UUIDV4,\n ...options,\n },\n context,\n );\n }\n get dataType() {\n return DataTypes.UUID;\n }\n}\n\nexport interface UUIDFieldOptions extends BaseColumnFieldOptions {\n type: 'uuid';\n}\n"]}
package/lib/model-hook.js CHANGED
@@ -14,7 +14,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.ModelHook = void 0;
16
16
  const lodash_1 = __importDefault(require("lodash"));
17
- const model_1 = require("./model");
18
17
  const { hooks } = require('sequelize/lib/hooks');
19
18
  class ModelHook {
20
19
  constructor(database) {
@@ -32,7 +31,7 @@ class ModelHook {
32
31
  }
33
32
  findModelName(hookArgs) {
34
33
  for (const arg of hookArgs) {
35
- if (arg instanceof model_1.Model) {
34
+ if (arg === null || arg === void 0 ? void 0 : arg._previousDataValues) {
36
35
  return arg.constructor.name;
37
36
  }
38
37
  if (lodash_1.default.isPlainObject(arg)) {
@@ -1 +1 @@
1
- {"version":3,"file":"model-hook.js","sourceRoot":"","sources":["../src/model-hook.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,oDAA4B;AAG5B,mCAAgC;AAEhC,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAEjD,MAAa,SAAS;IAIpB,YAAY,QAAkB;QAF9B,eAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QAG7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,WAAW,CAAC,SAA0B;QACpC,IAAI,gBAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;YAC9B,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAE5C,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE;gBACnB,OAA6B,QAAQ,CAAC;aACvC;SACF;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,aAAa,CAAC,QAAQ;QACpB,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE;YAC1B,IAAI,GAAG,YAAY,aAAK,EAAE;gBACxB,OAAe,GAAI,CAAC,WAAW,CAAC,IAAI,CAAC;aACtC;YAED,IAAI,gBAAM,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE;gBAC7B,IAAI,GAAG,CAAC,OAAO,CAAC,EAAE;oBAChB,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;iBAC1B;gBAED,IAAI,gBAAM,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE;oBAClC,OAAO,gBAAM,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;iBACvC;aACF;SACF;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,CAAC,SAAS;QACjB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IAED,YAAY,CAAC,SAAS;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,oBAAoB,CAAC,SAAS;QAC5B,OAAO,CAAO,GAAG,IAAW,EAAE,EAAE;YAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAE3C,IAAI,SAAS,EAAE;gBACb,mBAAmB;gBACnB,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,SAAS,IAAI,SAAS,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;aACrE;YAED,8BAA8B;YAC9B,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;QACpD,CAAC,CAAA,CAAC;IACJ,CAAC;CACF;AA7DD,8BA6DC","sourcesContent":["import lodash from 'lodash';\nimport type { SequelizeHooks } from 'sequelize/types/lib/hooks';\nimport Database from './database';\nimport { Model } from './model';\n\nconst { hooks } = require('sequelize/lib/hooks');\n\nexport class ModelHook {\n database: Database;\n boundEvent = new Set<string>();\n\n constructor(database: Database) {\n this.database = database;\n }\n\n isModelHook(eventName: string | symbol): keyof SequelizeHooks | false {\n if (lodash.isString(eventName)) {\n const hookType = eventName.split('.').pop();\n\n if (hooks[hookType]) {\n return <keyof SequelizeHooks>hookType;\n }\n }\n\n return false;\n }\n\n findModelName(hookArgs) {\n for (const arg of hookArgs) {\n if (arg instanceof Model) {\n return (<Model>arg).constructor.name;\n }\n\n if (lodash.isPlainObject(arg)) {\n if (arg['model']) {\n return arg['model'].name;\n }\n\n if (lodash.get(arg, 'name.plural')) {\n return lodash.get(arg, 'name.plural');\n }\n }\n }\n\n return null;\n }\n\n bindEvent(eventName) {\n this.boundEvent.add(eventName);\n }\n\n hasBindEvent(eventName) {\n return this.boundEvent.has(eventName);\n }\n\n sequelizeHookBuilder(eventName) {\n return async (...args: any[]) => {\n const modelName = this.findModelName(args);\n\n if (modelName) {\n // emit model event\n await this.database.emitAsync(`${modelName}.${eventName}`, ...args);\n }\n\n // emit sequelize global event\n await this.database.emitAsync(eventName, ...args);\n };\n }\n}\n"]}
1
+ {"version":3,"file":"model-hook.js","sourceRoot":"","sources":["../src/model-hook.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,oDAA4B;AAK5B,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAEjD,MAAa,SAAS;IAIpB,YAAY,QAAkB;QAF9B,eAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QAG7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,WAAW,CAAC,SAA0B;QACpC,IAAI,gBAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;YAC9B,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAE5C,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE;gBACnB,OAA6B,QAAQ,CAAC;aACvC;SACF;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,aAAa,CAAC,QAAQ;QACpB,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE;YAC1B,IAAI,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,mBAAmB,EAAE;gBAC5B,OAAe,GAAI,CAAC,WAAW,CAAC,IAAI,CAAC;aACtC;YAED,IAAI,gBAAM,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE;gBAC7B,IAAI,GAAG,CAAC,OAAO,CAAC,EAAE;oBAChB,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;iBAC1B;gBAED,IAAI,gBAAM,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE;oBAClC,OAAO,gBAAM,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;iBACvC;aACF;SACF;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,CAAC,SAAS;QACjB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IAED,YAAY,CAAC,SAAS;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,oBAAoB,CAAC,SAAS;QAC5B,OAAO,CAAO,GAAG,IAAW,EAAE,EAAE;YAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAE3C,IAAI,SAAS,EAAE;gBACb,mBAAmB;gBACnB,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,SAAS,IAAI,SAAS,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;aACrE;YAED,8BAA8B;YAC9B,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;QACpD,CAAC,CAAA,CAAC;IACJ,CAAC;CACF;AA7DD,8BA6DC","sourcesContent":["import lodash from 'lodash';\nimport type { SequelizeHooks } from 'sequelize/types/lib/hooks';\nimport Database from './database';\nimport { Model } from './model';\n\nconst { hooks } = require('sequelize/lib/hooks');\n\nexport class ModelHook {\n database: Database;\n boundEvent = new Set<string>();\n\n constructor(database: Database) {\n this.database = database;\n }\n\n isModelHook(eventName: string | symbol): keyof SequelizeHooks | false {\n if (lodash.isString(eventName)) {\n const hookType = eventName.split('.').pop();\n\n if (hooks[hookType]) {\n return <keyof SequelizeHooks>hookType;\n }\n }\n\n return false;\n }\n\n findModelName(hookArgs) {\n for (const arg of hookArgs) {\n if (arg?._previousDataValues) {\n return (<Model>arg).constructor.name;\n }\n\n if (lodash.isPlainObject(arg)) {\n if (arg['model']) {\n return arg['model'].name;\n }\n\n if (lodash.get(arg, 'name.plural')) {\n return lodash.get(arg, 'name.plural');\n }\n }\n }\n\n return null;\n }\n\n bindEvent(eventName) {\n this.boundEvent.add(eventName);\n }\n\n hasBindEvent(eventName) {\n return this.boundEvent.has(eventName);\n }\n\n sequelizeHookBuilder(eventName) {\n return async (...args: any[]) => {\n const modelName = this.findModelName(args);\n\n if (modelName) {\n // emit model event\n await this.database.emitAsync(`${modelName}.${eventName}`, ...args);\n }\n\n // emit sequelize global event\n await this.database.emitAsync(eventName, ...args);\n };\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nocobase/database",
3
- "version": "0.7.0-alpha.3",
3
+ "version": "0.7.0-alpha.32",
4
4
  "description": "",
5
5
  "main": "./lib/index.js",
6
6
  "types": "./lib/index.d.ts",
@@ -17,7 +17,7 @@
17
17
  "build:esm": "tsc --project tsconfig.build.json --module es2015 --outDir esm"
18
18
  },
19
19
  "dependencies": {
20
- "@nocobase/utils": "0.7.0-alpha.3",
20
+ "@nocobase/utils": "0.7.0-alpha.32",
21
21
  "async-mutex": "^0.3.2",
22
22
  "deepmerge": "^4.2.2",
23
23
  "flat": "^5.0.2",
@@ -29,5 +29,5 @@
29
29
  "url": "git+https://github.com/nocobase/nocobase.git",
30
30
  "directory": "packages/database"
31
31
  },
32
- "gitHead": "b12507f6e4bcb5f1fd8285670a43fb3807d90ea0"
32
+ "gitHead": "fbe14de5c02aeaa460d143245abf317c4ff2e3a9"
33
33
  }
@@ -0,0 +1,30 @@
1
+ import { mockDatabase } from '../';
2
+ import { Database } from '../../database';
3
+
4
+ describe('string field', () => {
5
+ let db: Database;
6
+
7
+ beforeEach(async () => {
8
+ db = mockDatabase();
9
+ });
10
+
11
+ afterEach(async () => {
12
+ await db.close();
13
+ });
14
+
15
+ it('define', async () => {
16
+ const Test = db.collection({
17
+ name: 'tests',
18
+ autoGenId: false,
19
+ fields: [
20
+ {
21
+ type: 'uuid',
22
+ name: 'id',
23
+ primaryKey: true,
24
+ },
25
+ ],
26
+ });
27
+ await Test.sync();
28
+ await Test.model.create();
29
+ });
30
+ });
package/src/database.ts CHANGED
@@ -2,7 +2,16 @@ import { applyMixins, AsyncEmitter } from '@nocobase/utils';
2
2
  import merge from 'deepmerge';
3
3
  import { EventEmitter } from 'events';
4
4
  import lodash from 'lodash';
5
- import { ModelCtor, Op, Options, QueryInterfaceDropAllTablesOptions, Sequelize, SyncOptions, Utils } from 'sequelize';
5
+ import {
6
+ ModelCtor,
7
+ Op,
8
+ Options,
9
+ QueryInterfaceDropAllTablesOptions,
10
+ QueryOptions,
11
+ Sequelize,
12
+ SyncOptions,
13
+ Utils
14
+ } from 'sequelize';
6
15
  import { Collection, CollectionOptions, RepositoryType } from './collection';
7
16
  import { ImporterReader, ImportFileExtension } from './collection-importer';
8
17
  import * as FieldTypes from './fields';
@@ -64,8 +73,17 @@ export class Database extends EventEmitter implements AsyncEmitter {
64
73
  if (options instanceof Sequelize) {
65
74
  this.sequelize = options;
66
75
  } else {
67
- this.sequelize = new Sequelize(options);
68
- this.options = options;
76
+ const opts = {
77
+ sync: {
78
+ alter: {
79
+ drop: false,
80
+ },
81
+ force: false,
82
+ },
83
+ ...options,
84
+ };
85
+ this.sequelize = new Sequelize(opts);
86
+ this.options = opts;
69
87
  }
70
88
 
71
89
  this.collections = new Map();
@@ -248,6 +266,29 @@ export class Database extends EventEmitter implements AsyncEmitter {
248
266
  return this.sequelize.getDialect() === 'sqlite' && lodash.get(this.options, 'storage') == ':memory:';
249
267
  }
250
268
 
269
+ async auth(options: QueryOptions & { repeat?: number } = {}) {
270
+ const { repeat = 10, ...others } = options;
271
+ const delay = (ms) => new Promise((yea) => setTimeout(yea, ms));
272
+ let count = 0;
273
+ const authenticate = async () => {
274
+ try {
275
+ await this.sequelize.authenticate(others);
276
+ console.log('Connection has been established successfully.');
277
+ return true;
278
+ } catch (error) {
279
+ console.log('reconnecting...', count);
280
+ if (count >= repeat) {
281
+ throw error;
282
+ }
283
+ ++count;
284
+ await delay(500);
285
+ return await authenticate();
286
+ }
287
+ };
288
+
289
+ return await authenticate();
290
+ }
291
+
251
292
  async reconnect() {
252
293
  if (this.isSqliteMemory()) {
253
294
  return;
@@ -1,4 +1,4 @@
1
- import { lodash } from '@umijs/utils';
1
+ import lodash from 'lodash';
2
2
  import { DataTypes } from 'sequelize';
3
3
  import { Model } from '../model';
4
4
  import { BaseColumnFieldOptions, Field } from './field';
@@ -22,6 +22,7 @@ import { StringFieldOptions } from './string-field';
22
22
  import { TextFieldOptions } from './text-field';
23
23
  import { TimeFieldOptions } from './time-field';
24
24
  import { UidFieldOptions } from './uid-field';
25
+ import { UUIDFieldOptions } from './uuid-field';
25
26
  import { VirtualFieldOptions } from './virtual-field';
26
27
 
27
28
  export * from './array-field';
@@ -43,6 +44,7 @@ export * from './string-field';
43
44
  export * from './text-field';
44
45
  export * from './time-field';
45
46
  export * from './uid-field';
47
+ export * from './uuid-field';
46
48
  export * from './virtual-field';
47
49
 
48
50
  export type FieldOptions =
@@ -64,6 +66,7 @@ export type FieldOptions =
64
66
  | TimeFieldOptions
65
67
  | DateFieldOptions
66
68
  | UidFieldOptions
69
+ | UUIDFieldOptions
67
70
  | PasswordFieldOptions
68
71
  | ContextFieldOptions
69
72
  | BelongsToFieldOptions
@@ -0,0 +1,21 @@
1
+ import { DataTypes } from 'sequelize';
2
+ import { BaseColumnFieldOptions, Field, FieldContext } from './field';
3
+
4
+ export class UuidField extends Field {
5
+ constructor(options?: any, context?: FieldContext) {
6
+ super(
7
+ {
8
+ defaultValue: DataTypes.UUIDV4,
9
+ ...options,
10
+ },
11
+ context,
12
+ );
13
+ }
14
+ get dataType() {
15
+ return DataTypes.UUID;
16
+ }
17
+ }
18
+
19
+ export interface UUIDFieldOptions extends BaseColumnFieldOptions {
20
+ type: 'uuid';
21
+ }
package/src/model-hook.ts CHANGED
@@ -27,7 +27,7 @@ export class ModelHook {
27
27
 
28
28
  findModelName(hookArgs) {
29
29
  for (const arg of hookArgs) {
30
- if (arg instanceof Model) {
30
+ if (arg?._previousDataValues) {
31
31
  return (<Model>arg).constructor.name;
32
32
  }
33
33