@nocobase/database 0.5.0-alpha.30 → 0.5.0-alpha.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/database.js CHANGED
@@ -269,7 +269,7 @@ class Database extends events_1.EventEmitter {
269
269
  });
270
270
  const tables = new Map();
271
271
  files.forEach(file => {
272
- const result = utils_1.requireModule(file);
272
+ const result = (0, utils_1.requireModule)(file);
273
273
 
274
274
  if (result instanceof Extend) {
275
275
  if (!this.tables.has(result.tableOptions.name)) {
@@ -1 +1 @@
1
- {"version":3,"sources":["database.ts"],"names":[],"mappings":"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","file":"database.js","sourcesContent":["import {\n Options,\n Sequelize,\n SyncOptions as SequelizeSyncOptions,\n} from 'sequelize';\nimport glob from 'glob';\nimport Table, { MergeOptions, TableOptions } from './table';\nimport { Model, ModelCtor } from './model';\nimport { requireModule } from './utils';\nimport _ from 'lodash';\nimport { EventEmitter } from 'events';\n\nexport interface SyncOptions extends SequelizeSyncOptions {\n\n /**\n * 指定需要更新字段的 tables\n */\n tables?: string[] | Table[] | Map<string, Table>;\n}\n\nexport interface ImportOptions {\n\n /**\n * 指定配置所在路径\n */\n directory: string;\n\n /**\n * 文件后缀,默认值 ['js', 'ts', 'json']\n */\n extensions?: string[];\n}\n\nexport interface DatabaseOptions extends Options {\n}\n\n// export type HookType = 'beforeTableInit' | 'afterTableInit' | 'beforeAddField' | 'afterAddField';\n\nexport class Extend {\n tableOptions: TableOptions;\n mergeOptions: MergeOptions\n constructor(tableOptions: TableOptions, mergeOptions?: MergeOptions) {\n this.tableOptions = tableOptions;\n this.mergeOptions = mergeOptions;\n }\n}\n\nexport function extend(tableOptions: TableOptions, mergeOptions: MergeOptions = {}) {\n return new Extend(tableOptions, mergeOptions);\n}\n\ntype HookType =\n 'beforeValidate' |\n 'afterValidate' |\n 'beforeCreate' |\n 'afterCreate' |\n 'beforeDestroy' |\n 'afterDestroy' |\n 'beforeRestore' |\n 'afterRestore' |\n 'beforeUpdate' |\n 'afterUpdate' |\n 'beforeSave' |\n 'afterSave' |\n 'beforeBulkCreate' |\n 'afterBulkCreate' |\n 'beforeBulkDestroy' |\n 'afterBulkDestroy' |\n 'beforeBulkRestore' |\n 'afterBulkRestore' |\n 'beforeBulkUpdate' |\n 'afterBulkUpdate' |\n 'beforeSync' |\n 'afterSync' |\n 'beforeBulkSync' |\n 'afterBulkSync' |\n 'beforeDefine' |\n 'afterDefine' |\n 'beforeInit' |\n 'afterInit' |\n 'beforeConnect' |\n 'afterConnect' |\n 'beforeDisconnect' |\n 'afterDisconnect';\n\n export default class Database extends EventEmitter {\n\n public readonly sequelize: Sequelize;\n\n /**\n * 哪些 Model 需要建立表关系\n */\n public readonly associating = new Set<string>();\n\n /**\n * 中间表\n */\n public readonly throughTables = new Map<string, Array<string>>();\n\n protected tables = new Map<string, Table>();\n\n protected options: DatabaseOptions;\n\n protected hooks = {};\n\n protected extTableOptions = new Map<string, any>();\n\n protected hookTypes = new Map(Object.entries({\n beforeValidate: 1,\n afterValidate: 1,\n beforeCreate: 1,\n afterCreate: 1,\n beforeDestroy: 1,\n afterDestroy: 1,\n beforeRestore: 1,\n afterRestore: 1,\n beforeUpdate: 1,\n afterUpdate: 1,\n beforeSave: 1,\n afterSave: 1,\n\n beforeBulkCreate: 2,\n afterBulkCreate: 2,\n\n beforeBulkDestroy: 3,\n afterBulkDestroy: 3,\n beforeBulkRestore: 3,\n afterBulkRestore: 3,\n beforeBulkUpdate: 3,\n afterBulkUpdate: 3,\n\n beforeSync: 4,\n afterSync: 4,\n beforeBulkSync: 4,\n afterBulkSync: 4,\n\n beforeDefine: 0,\n afterDefine: 0,\n beforeInit: 0,\n afterInit: 0,\n beforeConnect: 0,\n afterConnect: 0,\n beforeDisconnect: 0,\n afterDisconnect: 0,\n }));\n\n constructor(options?: DatabaseOptions) {\n super();\n this.options = options;\n this.sequelize = new Sequelize(options);\n }\n\n private _getHookType(event: any) {\n if (typeof event === 'string') {\n event = event.split('.');\n }\n if (!Array.isArray(event)) {\n return;\n }\n const hookType = [...event].pop();\n if (!this.hookTypes.has(hookType)) {\n return;\n }\n return hookType;\n }\n\n on(event: HookType | Omit<string, HookType> | symbol, listener: (...args: any[]) => void) {\n const hookType = this._getHookType(event);\n if (hookType) {\n const state = this.hookTypes.get(hookType);\n\n this.sequelize.addHook(hookType, async (...args: any[]) => {\n let modelName: string;\n switch (state) {\n case 1:\n modelName = args?.[0]?.constructor?.name;\n break;\n case 2:\n modelName = args?.[1]?.model?.name;\n break;\n case 3:\n modelName = args?.[0]?.model?.name;\n break;\n }\n // console.log({ modelName, args });\n if (modelName) {\n await this.emitAsync(`${modelName}.${hookType}`, ...args);\n }\n await this.emitAsync(hookType, ...args);\n });\n this.hookTypes.delete(hookType);\n }\n return super.on(event as any, listener);\n }\n\n async emitAsync(event: string | symbol, ...args: any[]): Promise<boolean> {\n // @ts-ignore\n const events = this._events;\n let callbacks = events?.[event];\n if (!callbacks) {\n return false;\n }\n // helper function to reuse as much code as possible\n const run = (cb) => {\n switch (args.length) {\n // fast cases\n case 0:\n cb = cb.call(this);\n break;\n case 1:\n cb = cb.call(this, args[0]);\n break;\n case 2:\n cb = cb.call(this, args[0], args[1]);\n break;\n case 3:\n cb = cb.call(this, args[0], args[1], args[2]);\n break;\n // slower\n default:\n cb = cb.apply(this, args);\n }\n\n if (\n cb && (\n cb instanceof Promise ||\n typeof cb.then === 'function'\n )\n ) {\n return cb;\n }\n\n return Promise.resolve(true);\n };\n\n if (typeof callbacks === 'function') {\n await run(callbacks);\n } else if (typeof callbacks === 'object') {\n callbacks = callbacks.slice().filter(Boolean);\n await callbacks.reduce((prev, next) => {\n return prev.then((res) => {\n return run(next).then((result) => Promise.resolve(res.concat(result)));\n });\n }, Promise.resolve([]));\n }\n\n return true;\n }\n\n /**\n * 载入指定目录下 tables 配置(配置的文件驱动)\n * \n * TODO: 配置的文件驱动现在会全部初始化,大数据时可能存在性能瓶颈,后续可以加入动态加载\n * \n * @param {object} [options]\n * @param {string} [options.directory] 指定配置所在路径\n * @param {array} [options.extensions = ['js', 'ts', 'json']] 文件后缀\n */\n public import(options: ImportOptions): Map<string, Table> {\n const { extensions = ['js', 'ts', 'json'], directory } = options;\n const patten = `${directory}/*.{${extensions.join(',')}}`;\n const files = glob.sync(patten, {\n ignore: [\n '**/*.d.ts'\n ]\n });\n const tables = new Map<string, Table>();\n files.forEach((file: string) => {\n const result = requireModule(file);\n if (result instanceof Extend) {\n // 如果还没初始化,extend 的先暂存起来,后续处理\n if (!this.tables.has(result.tableOptions.name)) {\n this.extTableOptions.set(result.tableOptions.name, result);\n } else {\n const table = this.extend(result.tableOptions, result.mergeOptions);\n tables.set(table.getName(), table);\n }\n } else {\n let table = this.extend(typeof result === 'function' ? result(this) : result);\n // 如果有未处理的 extend 取回来合并\n if (this.extTableOptions.has(table.getName())) {\n const result = this.extTableOptions.get(table.getName());\n table = this.extend(result.tableOptions, result.mergeOptions);\n this.extTableOptions.delete(table.getName());\n }\n tables.set(table.getName(), table);\n }\n });\n return tables;\n }\n\n /**\n * 配置表\n *\n * @param options \n */\n public table(options: TableOptions): Table {\n const { name } = options;\n const table = new Table(options, { database: this });\n this.tables.set(name, table);\n // 在 source 或 target 之后定义 through,需要更新 source 和 target 的 model\n if (this.throughTables.has(name)) {\n const [sourceTable, targetTable] = this.getTables(this.throughTables.get(name));\n sourceTable && sourceTable.modelInit(true);\n targetTable && targetTable.modelInit(true);\n // this.throughTables.delete(name);\n }\n return table;\n }\n\n /**\n * 扩展配置(实验性 API)\n * \n * @param options \n */\n public extend(options: TableOptions, mergeOptions?: MergeOptions): Table {\n const { name } = options;\n let table: Table;\n if (this.tables.has(name)) {\n table = this.tables.get(name);\n table.extend(options, mergeOptions);\n } else {\n table = this.table(options);\n this.tables.set(name, table);\n }\n return table;\n }\n\n /**\n * 是否已配置\n * \n * @param name \n */\n public isDefined(name: string): boolean {\n return this.sequelize.isDefined(name);\n }\n\n /**\n * 获取 Model\n * \n * TODO: 动态初始化并加载配置(懒汉式)\n * 动态初始化需要支持文件驱动和数据库驱动\n *\n * @param name \n */\n public getModel(name: string): ModelCtor<Model> {\n return this.isDefined(name) ? this.sequelize.model(name) as any : undefined;\n }\n\n /**\n * 获取指定 names 的 Models\n *\n * @param names \n */\n public getModels(names: string[] = []): Array<ModelCtor<Model>> {\n if (names.length === 0) {\n return this.sequelize.models as any;\n }\n return names.map(name => this.getModel(name));\n }\n\n /**\n * 获取 table 配置\n * \n * TODO:\n * 未单独配置多对多中间表时,取不到中间表的 table,但是可以取到 Model\n * 动态初始化并加载配置(懒汉式),动态初始化需要支持文件驱动和数据库驱动\n * \n * @param name \n */\n public getTable(name: string): Table {\n return this.tables.has(name) ? this.tables.get(name) : undefined;\n }\n\n /**\n * 获取指定 names 的 table 配置\n *\n * @param names \n */\n public getTables(names: string[] = []): Array<Table> {\n if (names.length === 0) {\n return [...this.tables.values()];\n }\n return names.map(name => this.getTable(name));\n }\n\n /**\n * 建立表关系\n * \n * 表关系相关字段是在 Model.init 之后进行的\n */\n public associate() {\n for (const name of this.associating) {\n const Model: any = this.getModel(name);\n Model.associate && Model.associate(this.sequelize.models);\n }\n }\n\n /**\n * 插件扩展\n * \n * TODO: 细节待定\n *\n * @param plugin \n * @param options \n */\n public async plugin(plugin: any, options = {}) {\n await plugin(this, options);\n }\n\n /**\n * 表字段更新\n * \n * @param options \n */\n public async sync(options: SyncOptions = {}) {\n const { tables = [], ...restOptions } = options;\n let items: Array<any>;\n\n if (tables instanceof Map) {\n items = Array.from(tables.values());\n } else {\n items = tables;\n }\n\n /**\n * sequelize.sync 只能处理全部 model 的字段更新\n * Model.sync 只能处理当前 Model 的字段更新,不处理关系表\n * database.sync 可以指定 tables 进行字段更新,也可以自动处理关系表的字段更新\n */\n if (items.length > 0) {\n // 指定 tables 时,新建 sequelize 实例来单独处理这些 tables 相关 models 的 sync\n const sequelize = new Sequelize(this.options);\n const names = new Set<string>();\n for (const key in items) {\n let table = items[key];\n if (typeof table === 'string') {\n table = this.getTable(table);\n }\n if (table instanceof Table) {\n for (const name of table.getRelatedTableNames()) {\n names.add(name);\n }\n }\n }\n for (const name of names) {\n // @ts-ignore\n const model = this.getModel(name);\n if (model) {\n sequelize.modelManager.addModel(model);\n }\n }\n await sequelize.sync(restOptions);\n await sequelize.close();\n } else {\n await this.sequelize.sync(restOptions);\n }\n }\n\n /**\n * 关闭数据库连接\n */\n public async close() {\n this.removeAllListeners();\n return this.sequelize.close();\n }\n\n /**\n * 添加 hook\n * \n * @param hookType \n * @param fn \n */\n public addHook(hookType: HookType | string, fn: Function) {\n const hooks = this.hooks[hookType] || [];\n hooks.push(fn);\n this.hooks[hookType] = hooks;\n }\n\n /**\n * 运行 hook\n *\n * @param hookType \n * @param args \n */\n public async runHooks(hookType: HookType | string, ...args) {\n const hooks = this.hooks[hookType] || [];\n for (const hook of hooks) {\n if (typeof hook === 'function') {\n await hook(...args);\n }\n }\n }\n\n public getFieldByPath(fieldPath: string) {\n const [tableName, fieldName] = fieldPath.split('.');\n return this.getTable(tableName).getField(fieldName);\n }\n}\n"]}
1
+ {"version":3,"sources":["database.ts"],"names":[],"mappings":"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","file":"database.js","sourcesContent":["import {\n Options,\n Sequelize,\n SyncOptions as SequelizeSyncOptions,\n} from 'sequelize';\nimport glob from 'glob';\nimport Table, { MergeOptions, TableOptions } from './table';\nimport { Model, ModelCtor } from './model';\nimport { requireModule } from './utils';\nimport _ from 'lodash';\nimport { EventEmitter } from 'events';\n\nexport interface SyncOptions extends SequelizeSyncOptions {\n\n /**\n * 指定需要更新字段的 tables\n */\n tables?: string[] | Table[] | Map<string, Table>;\n}\n\nexport interface ImportOptions {\n\n /**\n * 指定配置所在路径\n */\n directory: string;\n\n /**\n * 文件后缀,默认值 ['js', 'ts', 'json']\n */\n extensions?: string[];\n}\n\nexport interface DatabaseOptions extends Options {\n}\n\n// export type HookType = 'beforeTableInit' | 'afterTableInit' | 'beforeAddField' | 'afterAddField';\n\nexport class Extend {\n tableOptions: TableOptions;\n mergeOptions: MergeOptions\n constructor(tableOptions: TableOptions, mergeOptions?: MergeOptions) {\n this.tableOptions = tableOptions;\n this.mergeOptions = mergeOptions;\n }\n}\n\nexport function extend(tableOptions: TableOptions, mergeOptions: MergeOptions = {}) {\n return new Extend(tableOptions, mergeOptions);\n}\n\ntype HookType =\n 'beforeValidate' |\n 'afterValidate' |\n 'beforeCreate' |\n 'afterCreate' |\n 'beforeDestroy' |\n 'afterDestroy' |\n 'beforeRestore' |\n 'afterRestore' |\n 'beforeUpdate' |\n 'afterUpdate' |\n 'beforeSave' |\n 'afterSave' |\n 'beforeBulkCreate' |\n 'afterBulkCreate' |\n 'beforeBulkDestroy' |\n 'afterBulkDestroy' |\n 'beforeBulkRestore' |\n 'afterBulkRestore' |\n 'beforeBulkUpdate' |\n 'afterBulkUpdate' |\n 'beforeSync' |\n 'afterSync' |\n 'beforeBulkSync' |\n 'afterBulkSync' |\n 'beforeDefine' |\n 'afterDefine' |\n 'beforeInit' |\n 'afterInit' |\n 'beforeConnect' |\n 'afterConnect' |\n 'beforeDisconnect' |\n 'afterDisconnect';\n\n export default class Database extends EventEmitter {\n\n public readonly sequelize: Sequelize;\n\n /**\n * 哪些 Model 需要建立表关系\n */\n public readonly associating = new Set<string>();\n\n /**\n * 中间表\n */\n public readonly throughTables = new Map<string, Array<string>>();\n\n protected tables = new Map<string, Table>();\n\n protected options: DatabaseOptions;\n\n protected hooks = {};\n\n protected extTableOptions = new Map<string, any>();\n\n protected hookTypes = new Map(Object.entries({\n beforeValidate: 1,\n afterValidate: 1,\n beforeCreate: 1,\n afterCreate: 1,\n beforeDestroy: 1,\n afterDestroy: 1,\n beforeRestore: 1,\n afterRestore: 1,\n beforeUpdate: 1,\n afterUpdate: 1,\n beforeSave: 1,\n afterSave: 1,\n\n beforeBulkCreate: 2,\n afterBulkCreate: 2,\n\n beforeBulkDestroy: 3,\n afterBulkDestroy: 3,\n beforeBulkRestore: 3,\n afterBulkRestore: 3,\n beforeBulkUpdate: 3,\n afterBulkUpdate: 3,\n\n beforeSync: 4,\n afterSync: 4,\n beforeBulkSync: 4,\n afterBulkSync: 4,\n\n beforeDefine: 0,\n afterDefine: 0,\n beforeInit: 0,\n afterInit: 0,\n beforeConnect: 0,\n afterConnect: 0,\n beforeDisconnect: 0,\n afterDisconnect: 0,\n }));\n\n constructor(options?: DatabaseOptions) {\n super();\n this.options = options;\n this.sequelize = new Sequelize(options);\n }\n\n private _getHookType(event: any) {\n if (typeof event === 'string') {\n event = event.split('.');\n }\n if (!Array.isArray(event)) {\n return;\n }\n const hookType = [...event].pop();\n if (!this.hookTypes.has(hookType)) {\n return;\n }\n return hookType;\n }\n\n on(event: HookType | Omit<string, HookType> | symbol, listener: (...args: any[]) => void) {\n const hookType = this._getHookType(event);\n if (hookType) {\n const state = this.hookTypes.get(hookType);\n\n this.sequelize.addHook(hookType, async (...args: any[]) => {\n let modelName: string;\n switch (state) {\n case 1:\n modelName = args?.[0]?.constructor?.name;\n break;\n case 2:\n modelName = args?.[1]?.model?.name;\n break;\n case 3:\n modelName = args?.[0]?.model?.name;\n break;\n }\n // console.log({ modelName, args });\n if (modelName) {\n await this.emitAsync(`${modelName}.${hookType}`, ...args);\n }\n await this.emitAsync(hookType, ...args);\n });\n this.hookTypes.delete(hookType);\n }\n return super.on(event as any, listener);\n }\n\n async emitAsync(event: string | symbol, ...args: any[]): Promise<boolean> {\n // @ts-ignore\n const events = this._events;\n let callbacks = events?.[event];\n if (!callbacks) {\n return false;\n }\n // helper function to reuse as much code as possible\n const run = (cb) => {\n switch (args.length) {\n // fast cases\n case 0:\n cb = cb.call(this);\n break;\n case 1:\n cb = cb.call(this, args[0]);\n break;\n case 2:\n cb = cb.call(this, args[0], args[1]);\n break;\n case 3:\n cb = cb.call(this, args[0], args[1], args[2]);\n break;\n // slower\n default:\n cb = cb.apply(this, args);\n }\n\n if (\n cb && (\n cb instanceof Promise ||\n typeof cb.then === 'function'\n )\n ) {\n return cb;\n }\n\n return Promise.resolve(true);\n };\n\n if (typeof callbacks === 'function') {\n await run(callbacks);\n } else if (typeof callbacks === 'object') {\n callbacks = callbacks.slice().filter(Boolean);\n await callbacks.reduce((prev, next) => {\n return prev.then((res) => {\n return run(next).then((result) => Promise.resolve(res.concat(result)));\n });\n }, Promise.resolve([]));\n }\n\n return true;\n }\n\n /**\n * 载入指定目录下 tables 配置(配置的文件驱动)\n * \n * TODO: 配置的文件驱动现在会全部初始化,大数据时可能存在性能瓶颈,后续可以加入动态加载\n * \n * @param {object} [options]\n * @param {string} [options.directory] 指定配置所在路径\n * @param {array} [options.extensions = ['js', 'ts', 'json']] 文件后缀\n */\n public import(options: ImportOptions): Map<string, Table> {\n const { extensions = ['js', 'ts', 'json'], directory } = options;\n const patten = `${directory}/*.{${extensions.join(',')}}`;\n const files = glob.sync(patten, {\n ignore: [\n '**/*.d.ts'\n ]\n });\n const tables = new Map<string, Table>();\n files.forEach((file: string) => {\n const result = requireModule(file);\n if (result instanceof Extend) {\n // 如果还没初始化,extend 的先暂存起来,后续处理\n if (!this.tables.has(result.tableOptions.name)) {\n this.extTableOptions.set(result.tableOptions.name, result);\n } else {\n const table = this.extend(result.tableOptions, result.mergeOptions);\n tables.set(table.getName(), table);\n }\n } else {\n let table = this.extend(typeof result === 'function' ? result(this) : result);\n // 如果有未处理的 extend 取回来合并\n if (this.extTableOptions.has(table.getName())) {\n const result = this.extTableOptions.get(table.getName());\n table = this.extend(result.tableOptions, result.mergeOptions);\n this.extTableOptions.delete(table.getName());\n }\n tables.set(table.getName(), table);\n }\n });\n return tables;\n }\n\n /**\n * 配置表\n *\n * @param options \n */\n public table(options: TableOptions): Table {\n const { name } = options;\n const table = new Table(options, { database: this });\n this.tables.set(name, table);\n // 在 source 或 target 之后定义 through,需要更新 source 和 target 的 model\n if (this.throughTables.has(name)) {\n const [sourceTable, targetTable] = this.getTables(this.throughTables.get(name));\n sourceTable && sourceTable.modelInit(true);\n targetTable && targetTable.modelInit(true);\n // this.throughTables.delete(name);\n }\n return table;\n }\n\n /**\n * 扩展配置(实验性 API)\n * \n * @param options \n */\n public extend(options: TableOptions, mergeOptions?: MergeOptions): Table {\n const { name } = options;\n let table: Table;\n if (this.tables.has(name)) {\n table = this.tables.get(name);\n table.extend(options, mergeOptions);\n } else {\n table = this.table(options);\n this.tables.set(name, table);\n }\n return table;\n }\n\n /**\n * 是否已配置\n * \n * @param name \n */\n public isDefined(name: string): boolean {\n return this.sequelize.isDefined(name);\n }\n\n /**\n * 获取 Model\n * \n * TODO: 动态初始化并加载配置(懒汉式)\n * 动态初始化需要支持文件驱动和数据库驱动\n *\n * @param name \n */\n public getModel(name: string): ModelCtor<Model> {\n return this.isDefined(name) ? this.sequelize.model(name) as any : undefined;\n }\n\n /**\n * 获取指定 names 的 Models\n *\n * @param names \n */\n public getModels(names: string[] = []): Array<ModelCtor<Model>> {\n if (names.length === 0) {\n return this.sequelize.models as any;\n }\n return names.map(name => this.getModel(name));\n }\n\n /**\n * 获取 table 配置\n * \n * TODO:\n * 未单独配置多对多中间表时,取不到中间表的 table,但是可以取到 Model\n * 动态初始化并加载配置(懒汉式),动态初始化需要支持文件驱动和数据库驱动\n * \n * @param name \n */\n public getTable(name: string): Table {\n return this.tables.has(name) ? this.tables.get(name) : undefined;\n }\n\n /**\n * 获取指定 names 的 table 配置\n *\n * @param names \n */\n public getTables(names: string[] = []): Array<Table> {\n if (names.length === 0) {\n return [...this.tables.values()];\n }\n return names.map(name => this.getTable(name));\n }\n\n /**\n * 建立表关系\n * \n * 表关系相关字段是在 Model.init 之后进行的\n */\n public associate() {\n for (const name of this.associating) {\n const Model: any = this.getModel(name);\n Model.associate && Model.associate(this.sequelize.models);\n }\n }\n\n /**\n * 插件扩展\n * \n * TODO: 细节待定\n *\n * @param plugin \n * @param options \n */\n public async plugin(plugin: any, options = {}) {\n await plugin(this, options);\n }\n\n /**\n * 表字段更新\n * \n * @param options \n */\n public async sync(options: SyncOptions = {}) {\n const { tables = [], ...restOptions } = options;\n let items: Array<any>;\n\n if (tables instanceof Map) {\n items = Array.from(tables.values());\n } else {\n items = tables;\n }\n\n /**\n * sequelize.sync 只能处理全部 model 的字段更新\n * Model.sync 只能处理当前 Model 的字段更新,不处理关系表\n * database.sync 可以指定 tables 进行字段更新,也可以自动处理关系表的字段更新\n */\n if (items.length > 0) {\n // 指定 tables 时,新建 sequelize 实例来单独处理这些 tables 相关 models 的 sync\n const sequelize = new Sequelize(this.options);\n const names = new Set<string>();\n for (const key in items) {\n let table = items[key];\n if (typeof table === 'string') {\n table = this.getTable(table);\n }\n if (table instanceof Table) {\n for (const name of table.getRelatedTableNames()) {\n names.add(name);\n }\n }\n }\n for (const name of names) {\n // @ts-ignore\n const model = this.getModel(name);\n if (model) {\n sequelize.modelManager.addModel(model);\n }\n }\n await sequelize.sync(restOptions);\n await sequelize.close();\n } else {\n await this.sequelize.sync(restOptions);\n }\n }\n\n /**\n * 关闭数据库连接\n */\n public async close() {\n this.removeAllListeners();\n return this.sequelize.close();\n }\n\n /**\n * 添加 hook\n * \n * @param hookType \n * @param fn \n */\n public addHook(hookType: HookType | string, fn: Function) {\n const hooks = this.hooks[hookType] || [];\n hooks.push(fn);\n this.hooks[hookType] = hooks;\n }\n\n /**\n * 运行 hook\n *\n * @param hookType \n * @param args \n */\n public async runHooks(hookType: HookType | string, ...args) {\n const hooks = this.hooks[hookType] || [];\n for (const hook of hooks) {\n if (typeof hook === 'function') {\n await hook(...args);\n }\n }\n }\n\n public getFieldByPath(fieldPath: string) {\n const [tableName, fieldName] = fieldPath.split('.');\n return this.getTable(tableName).getField(fieldName);\n }\n}\n"]}
@@ -35,23 +35,23 @@ export declare class INTEGER extends NUMBER {
35
35
  getAttributeOptions(): {
36
36
  type: any;
37
37
  dataType?: DataType;
38
- index?: boolean | import("sequelize/types").IndexesOptions;
38
+ index?: boolean | import("sequelize").IndexesOptions;
39
39
  name: string;
40
- values?: readonly string[];
41
- set?: (this: import("sequelize/types").Model<any, any>, val: unknown) => void;
42
40
  unique?: string | boolean | {
43
41
  name: string;
44
42
  msg: string;
45
43
  };
46
- get?: (this: import("sequelize/types").Model<any, any>) => unknown;
47
- validate?: import("sequelize/types").ModelValidateOptions;
48
44
  primaryKey?: boolean;
49
45
  autoIncrement?: boolean;
50
46
  autoIncrementIdentity?: boolean;
51
47
  comment?: string;
52
- references?: string | import("sequelize/types").ModelAttributeColumnReferencesOptions;
48
+ references?: string | import("sequelize").ModelAttributeColumnReferencesOptions;
53
49
  onUpdate?: string;
54
50
  onDelete?: string;
51
+ validate?: import("sequelize").ModelValidateOptions;
52
+ values?: readonly string[];
53
+ get?: (this: import("sequelize").Model<any, any>) => unknown;
54
+ set?: (this: import("sequelize").Model<any, any>, val: unknown) => void;
55
55
  allowNull?: boolean;
56
56
  field?: string;
57
57
  defaultValue?: unknown;
@@ -62,23 +62,23 @@ export declare class FLOAT extends NUMBER {
62
62
  getAttributeOptions(): {
63
63
  type: any;
64
64
  dataType?: DataType;
65
- index?: boolean | import("sequelize/types").IndexesOptions;
65
+ index?: boolean | import("sequelize").IndexesOptions;
66
66
  name: string;
67
- values?: readonly string[];
68
- set?: (this: import("sequelize/types").Model<any, any>, val: unknown) => void;
69
67
  unique?: string | boolean | {
70
68
  name: string;
71
69
  msg: string;
72
70
  };
73
- get?: (this: import("sequelize/types").Model<any, any>) => unknown;
74
- validate?: import("sequelize/types").ModelValidateOptions;
75
71
  primaryKey?: boolean;
76
72
  autoIncrement?: boolean;
77
73
  autoIncrementIdentity?: boolean;
78
74
  comment?: string;
79
- references?: string | import("sequelize/types").ModelAttributeColumnReferencesOptions;
75
+ references?: string | import("sequelize").ModelAttributeColumnReferencesOptions;
80
76
  onUpdate?: string;
81
77
  onDelete?: string;
78
+ validate?: import("sequelize").ModelValidateOptions;
79
+ values?: readonly string[];
80
+ get?: (this: import("sequelize").Model<any, any>) => unknown;
81
+ set?: (this: import("sequelize").Model<any, any>, val: unknown) => void;
82
82
  allowNull?: boolean;
83
83
  field?: string;
84
84
  defaultValue?: unknown;
@@ -89,23 +89,23 @@ export declare class DOUBLE extends NUMBER {
89
89
  getAttributeOptions(): {
90
90
  type: any;
91
91
  dataType?: DataType;
92
- index?: boolean | import("sequelize/types").IndexesOptions;
92
+ index?: boolean | import("sequelize").IndexesOptions;
93
93
  name: string;
94
- values?: readonly string[];
95
- set?: (this: import("sequelize/types").Model<any, any>, val: unknown) => void;
96
94
  unique?: string | boolean | {
97
95
  name: string;
98
96
  msg: string;
99
97
  };
100
- get?: (this: import("sequelize/types").Model<any, any>) => unknown;
101
- validate?: import("sequelize/types").ModelValidateOptions;
102
98
  primaryKey?: boolean;
103
99
  autoIncrement?: boolean;
104
100
  autoIncrementIdentity?: boolean;
105
101
  comment?: string;
106
- references?: string | import("sequelize/types").ModelAttributeColumnReferencesOptions;
102
+ references?: string | import("sequelize").ModelAttributeColumnReferencesOptions;
107
103
  onUpdate?: string;
108
104
  onDelete?: string;
105
+ validate?: import("sequelize").ModelValidateOptions;
106
+ values?: readonly string[];
107
+ get?: (this: import("sequelize").Model<any, any>) => unknown;
108
+ set?: (this: import("sequelize").Model<any, any>, val: unknown) => void;
109
109
  allowNull?: boolean;
110
110
  field?: string;
111
111
  defaultValue?: unknown;
@@ -116,23 +116,23 @@ export declare class DECIMAL extends NUMBER {
116
116
  getAttributeOptions(): {
117
117
  type: any;
118
118
  dataType?: DataType;
119
- index?: boolean | import("sequelize/types").IndexesOptions;
119
+ index?: boolean | import("sequelize").IndexesOptions;
120
120
  name: string;
121
- values?: readonly string[];
122
- set?: (this: import("sequelize/types").Model<any, any>, val: unknown) => void;
123
121
  unique?: string | boolean | {
124
122
  name: string;
125
123
  msg: string;
126
124
  };
127
- get?: (this: import("sequelize/types").Model<any, any>) => unknown;
128
- validate?: import("sequelize/types").ModelValidateOptions;
129
125
  primaryKey?: boolean;
130
126
  autoIncrement?: boolean;
131
127
  autoIncrementIdentity?: boolean;
132
128
  comment?: string;
133
- references?: string | import("sequelize/types").ModelAttributeColumnReferencesOptions;
129
+ references?: string | import("sequelize").ModelAttributeColumnReferencesOptions;
134
130
  onUpdate?: string;
135
131
  onDelete?: string;
132
+ validate?: import("sequelize").ModelValidateOptions;
133
+ values?: readonly string[];
134
+ get?: (this: import("sequelize").Model<any, any>) => unknown;
135
+ set?: (this: import("sequelize").Model<any, any>, val: unknown) => void;
136
136
  allowNull?: boolean;
137
137
  field?: string;
138
138
  defaultValue?: unknown;
@@ -143,23 +143,23 @@ export declare class REAL extends NUMBER {
143
143
  getAttributeOptions(): {
144
144
  type: any;
145
145
  dataType?: DataType;
146
- index?: boolean | import("sequelize/types").IndexesOptions;
146
+ index?: boolean | import("sequelize").IndexesOptions;
147
147
  name: string;
148
- values?: readonly string[];
149
- set?: (this: import("sequelize/types").Model<any, any>, val: unknown) => void;
150
148
  unique?: string | boolean | {
151
149
  name: string;
152
150
  msg: string;
153
151
  };
154
- get?: (this: import("sequelize/types").Model<any, any>) => unknown;
155
- validate?: import("sequelize/types").ModelValidateOptions;
156
152
  primaryKey?: boolean;
157
153
  autoIncrement?: boolean;
158
154
  autoIncrementIdentity?: boolean;
159
155
  comment?: string;
160
- references?: string | import("sequelize/types").ModelAttributeColumnReferencesOptions;
156
+ references?: string | import("sequelize").ModelAttributeColumnReferencesOptions;
161
157
  onUpdate?: string;
162
158
  onDelete?: string;
159
+ validate?: import("sequelize").ModelValidateOptions;
160
+ values?: readonly string[];
161
+ get?: (this: import("sequelize").Model<any, any>) => unknown;
162
+ set?: (this: import("sequelize").Model<any, any>, val: unknown) => void;
163
163
  allowNull?: boolean;
164
164
  field?: string;
165
165
  defaultValue?: unknown;
@@ -170,23 +170,23 @@ export declare class STRING extends Column {
170
170
  getAttributeOptions(): {
171
171
  type: any;
172
172
  dataType?: DataType;
173
- index?: boolean | import("sequelize/types").IndexesOptions;
173
+ index?: boolean | import("sequelize").IndexesOptions;
174
174
  name: string;
175
- values?: readonly string[];
176
- set?: (this: import("sequelize/types").Model<any, any>, val: unknown) => void;
177
175
  unique?: string | boolean | {
178
176
  name: string;
179
177
  msg: string;
180
178
  };
181
- get?: (this: import("sequelize/types").Model<any, any>) => unknown;
182
- validate?: import("sequelize/types").ModelValidateOptions;
183
179
  primaryKey?: boolean;
184
180
  autoIncrement?: boolean;
185
181
  autoIncrementIdentity?: boolean;
186
182
  comment?: string;
187
- references?: string | import("sequelize/types").ModelAttributeColumnReferencesOptions;
183
+ references?: string | import("sequelize").ModelAttributeColumnReferencesOptions;
188
184
  onUpdate?: string;
189
185
  onDelete?: string;
186
+ validate?: import("sequelize").ModelValidateOptions;
187
+ values?: readonly string[];
188
+ get?: (this: import("sequelize").Model<any, any>) => unknown;
189
+ set?: (this: import("sequelize").Model<any, any>, val: unknown) => void;
190
190
  allowNull?: boolean;
191
191
  field?: string;
192
192
  defaultValue?: unknown;
@@ -198,23 +198,23 @@ export declare class TEXT extends Column {
198
198
  getAttributeOptions(): {
199
199
  type: any;
200
200
  dataType?: DataType;
201
- index?: boolean | import("sequelize/types").IndexesOptions;
201
+ index?: boolean | import("sequelize").IndexesOptions;
202
202
  name: string;
203
- values?: readonly string[];
204
- set?: (this: import("sequelize/types").Model<any, any>, val: unknown) => void;
205
203
  unique?: string | boolean | {
206
204
  name: string;
207
205
  msg: string;
208
206
  };
209
- get?: (this: import("sequelize/types").Model<any, any>) => unknown;
210
- validate?: import("sequelize/types").ModelValidateOptions;
211
207
  primaryKey?: boolean;
212
208
  autoIncrement?: boolean;
213
209
  autoIncrementIdentity?: boolean;
214
210
  comment?: string;
215
- references?: string | import("sequelize/types").ModelAttributeColumnReferencesOptions;
211
+ references?: string | import("sequelize").ModelAttributeColumnReferencesOptions;
216
212
  onUpdate?: string;
217
213
  onDelete?: string;
214
+ validate?: import("sequelize").ModelValidateOptions;
215
+ values?: readonly string[];
216
+ get?: (this: import("sequelize").Model<any, any>) => unknown;
217
+ set?: (this: import("sequelize").Model<any, any>, val: unknown) => void;
218
218
  allowNull?: boolean;
219
219
  field?: string;
220
220
  defaultValue?: unknown;
@@ -227,23 +227,23 @@ export declare class DATE extends Column {
227
227
  getAttributeOptions(): {
228
228
  type: any;
229
229
  dataType?: DataType;
230
- index?: boolean | import("sequelize/types").IndexesOptions;
230
+ index?: boolean | import("sequelize").IndexesOptions;
231
231
  name: string;
232
- values?: readonly string[];
233
- set?: (this: import("sequelize/types").Model<any, any>, val: unknown) => void;
234
232
  unique?: string | boolean | {
235
233
  name: string;
236
234
  msg: string;
237
235
  };
238
- get?: (this: import("sequelize/types").Model<any, any>) => unknown;
239
- validate?: import("sequelize/types").ModelValidateOptions;
240
236
  primaryKey?: boolean;
241
237
  autoIncrement?: boolean;
242
238
  autoIncrementIdentity?: boolean;
243
239
  comment?: string;
244
- references?: string | import("sequelize/types").ModelAttributeColumnReferencesOptions;
240
+ references?: string | import("sequelize").ModelAttributeColumnReferencesOptions;
245
241
  onUpdate?: string;
246
242
  onDelete?: string;
243
+ validate?: import("sequelize").ModelValidateOptions;
244
+ values?: readonly string[];
245
+ get?: (this: import("sequelize").Model<any, any>) => unknown;
246
+ set?: (this: import("sequelize").Model<any, any>, val: unknown) => void;
247
247
  allowNull?: boolean;
248
248
  field?: string;
249
249
  defaultValue?: unknown;
@@ -273,23 +273,23 @@ export declare class ARRAY extends Column {
273
273
  getAttributeOptions(): {
274
274
  type: any;
275
275
  dataType?: DataType;
276
- index?: boolean | import("sequelize/types").IndexesOptions;
276
+ index?: boolean | import("sequelize").IndexesOptions;
277
277
  name: string;
278
- values?: readonly string[];
279
- set?: (this: import("sequelize/types").Model<any, any>, val: unknown) => void;
280
278
  unique?: string | boolean | {
281
279
  name: string;
282
280
  msg: string;
283
281
  };
284
- get?: (this: import("sequelize/types").Model<any, any>) => unknown;
285
- validate?: import("sequelize/types").ModelValidateOptions;
286
282
  primaryKey?: boolean;
287
283
  autoIncrement?: boolean;
288
284
  autoIncrementIdentity?: boolean;
289
285
  comment?: string;
290
- references?: string | import("sequelize/types").ModelAttributeColumnReferencesOptions;
286
+ references?: string | import("sequelize").ModelAttributeColumnReferencesOptions;
291
287
  onUpdate?: string;
292
288
  onDelete?: string;
289
+ validate?: import("sequelize").ModelValidateOptions;
290
+ values?: readonly string[];
291
+ get?: (this: import("sequelize").Model<any, any>) => unknown;
292
+ set?: (this: import("sequelize").Model<any, any>, val: unknown) => void;
293
293
  allowNull?: boolean;
294
294
  field?: string;
295
295
  defaultValue?: unknown;
@@ -349,7 +349,7 @@ export declare abstract class Relation extends Field {
349
349
  targetTableInit(): void;
350
350
  getAssociationType(): "hasOne" | "hasMany" | "belongsTo" | "belongsToMany";
351
351
  getTarget(): any;
352
- getTargetModel(): import("sequelize/types").ModelCtor<import("sequelize/types").Model<any, any>>;
352
+ getTargetModel(): import("sequelize").ModelCtor<import("sequelize").Model<any, any>>;
353
353
  getAccessors(): any;
354
354
  getAssociationOptions(): any;
355
355
  getAssociationArguments(): {
@@ -118,8 +118,7 @@ exports.Field = Field;
118
118
  class Column extends Field {
119
119
  getDataType() {
120
120
  const type = this.options.type;
121
-
122
- const dataType = _1.getDataTypeKey(type);
121
+ const dataType = (0, _1.getDataTypeKey)(type);
123
122
 
124
123
  if (sequelize_1.DataTypes[dataType]) {
125
124
  return sequelize_1.DataTypes[dataType];
@@ -155,9 +154,7 @@ exports.NUMBER = NUMBER;
155
154
  class INTEGER extends NUMBER {
156
155
  getDataType() {
157
156
  const type = this.options.type;
158
-
159
- const dataType = _1.getDataTypeKey(type);
160
-
157
+ const dataType = (0, _1.getDataTypeKey)(type);
161
158
  return {
162
159
  INT: sequelize_1.DataTypes.INTEGER,
163
160
  INTEGER: sequelize_1.DataTypes.INTEGER,
@@ -363,7 +360,7 @@ class REFERENCE extends VIRTUAL {
363
360
  }),
364
361
 
365
362
  get() {
366
- return lodash_1.get(this[source], dataIndex);
363
+ return (0, lodash_1.get)(this[source], dataIndex);
367
364
  }
368
365
 
369
366
  });
@@ -416,11 +413,11 @@ class FORMULA extends VIRTUAL {
416
413
  }
417
414
 
418
415
  try {
419
- const compiled = lodash_1.template(formula, {
416
+ const compiled = (0, lodash_1.template)(formula, {
420
417
  interpolate: /{{([\s\S]+?)}}/g
421
418
  });
422
419
  const value = compiled(data);
423
- return format === 'number' ? lodash_1.toNumber(value) : value;
420
+ return format === 'number' ? (0, lodash_1.toNumber)(value) : value;
424
421
  } catch (error) {
425
422
  console.log(error);
426
423
  return;
@@ -543,7 +540,7 @@ class UID extends Column {
543
540
  prefix = _options$prefix === void 0 ? '' : _options$prefix;
544
541
  database.on(`${sourceTable.getName()}.beforeCreate`, model => {
545
542
  if (!model.get(name)) {
546
- model.set(name, `${prefix}${utils_1.uid()}`);
543
+ model.set(name, `${prefix}${(0, utils_1.uid)()}`);
547
544
  }
548
545
  });
549
546
  }
@@ -932,7 +929,7 @@ class SORT extends NUMBER {
932
929
  _this$options6$scope = _this$options6.scope,
933
930
  scope = _this$options6$scope === void 0 ? [] : _this$options6$scope;
934
931
 
935
- if (utils_1.isNumber(model.get(name))) {
932
+ if ((0, utils_1.isNumber)(model.get(name))) {
936
933
  return;
937
934
  }
938
935
 
@@ -977,7 +974,7 @@ class SORT extends NUMBER {
977
974
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
978
975
  combo = _step2.value;
979
976
 
980
- if (utils_1.whereCompare(combo, where)) {
977
+ if ((0, utils_1.whereCompare)(combo, where)) {
981
978
  extremum = groups.get(combo) + (next === 'max' ? 1 : -1);
982
979
  break;
983
980
  }
@@ -1118,7 +1115,7 @@ class Radio extends BOOLEAN {
1118
1115
  for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
1119
1116
  combo = _step3.value;
1120
1117
 
1121
- if (utils_1.whereCompare(combo, where)) {
1118
+ if ((0, utils_1.whereCompare)(combo, where)) {
1122
1119
  group = groups.get(combo);
1123
1120
  break;
1124
1121
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["fields/field-types.ts"],"names":[],"mappings":"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","file":"field-types.js","sourcesContent":["import {\n Op,\n Utils,\n DataType,\n DataTypes,\n Sequelize,\n HasOneOptions,\n HasManyOptions,\n BelongsToOptions,\n BelongsToManyOptions,\n ThroughOptions,\n} from 'sequelize';\nimport { template, get, toNumber } from 'lodash';\nimport bcrypt from 'bcrypt';\n\nimport * as Options from './option-types';\nimport { getDataTypeKey } from '.';\nimport Table from '../table';\nimport Database from '../database';\nimport Model, { ModelCtor } from '../model';\nimport { whereCompare, isNumber, uid } from '../utils';\n\nexport interface IField {\n\n}\n\nexport interface IFields {\n [key: string]: IField;\n}\n\nexport interface FieldContext {\n sourceTable: Table;\n database: Database,\n}\n\nexport class Field implements IField {\n\n public readonly options: any;\n\n protected context: FieldContext;\n\n constructor(options: any, context: FieldContext) {\n const { type } = options;\n this.options = {\n ...options,\n // type: getDataTypeKey(type)\n };\n this.context = context;\n }\n\n public isMultipleColumns() {\n return false;\n }\n\n public getType() {\n return this.options.type;\n }\n\n public getOptions() {\n return this.options;\n }\n}\n\nexport class Column extends Field {\n\n public getDataType() {\n const { type } = this.options;\n const dataType = getDataTypeKey(type);\n if (DataTypes[dataType]) {\n return DataTypes[dataType];\n }\n return DataTypes[(<typeof Column>this.constructor).name.toUpperCase()];\n }\n\n public getDataTypeInstance(options: any = {}): any {\n const dataType = this.getDataType();\n Object.keys(options).forEach(key => options[key] === undefined && delete options[key]);\n return Object.keys(options).length > 0 ? dataType(options) : dataType;\n }\n\n public getAttributeOptions() {\n return {\n ...this.options,\n type: this.getDataTypeInstance(),\n }\n }\n}\n\nexport class BOOLEAN extends Column {\n}\n\nexport class NUMBER extends Column {\n}\n\nexport class INTEGER extends NUMBER {\n\n public readonly options: Options.IntegerOptions;\n\n public getDataType(): Function {\n const { type } = this.options;\n\n const dataType = getDataTypeKey(type);\n\n return {\n INT: DataTypes.INTEGER,\n INTEGER: DataTypes.INTEGER,\n TINYINT: DataTypes.TINYINT,\n TINYINTEGER: DataTypes.TINYINT,\n SMALLINT: DataTypes.SMALLINT,\n SMALLINTEGER: DataTypes.SMALLINT,\n MEDIUMINT: DataTypes.MEDIUMINT,\n MEDIUMINTEGER: DataTypes.MEDIUMINT,\n BIGINT: DataTypes.BIGINT,\n BIGINTEGER: DataTypes.BIGINT,\n }[dataType] || DataTypes.INTEGER;\n }\n\n public getAttributeOptions() {\n const { length, zerofill, unsigned, ...restOptions } = this.options;\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ length, zerofill, unsigned }),\n }\n }\n}\n\nexport class FLOAT extends NUMBER {\n\n public readonly options: Options.FloatOptions;\n\n public getAttributeOptions() {\n const { length, decimals, ...restOptions } = this.options;\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ length, decimals }),\n }\n }\n}\n\nexport class DOUBLE extends NUMBER {\n public readonly options: Options.DoubleOptions;\n\n public getAttributeOptions() {\n const { length, decimals, ...restOptions } = this.options;\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ length, decimals }),\n }\n }\n}\n\nexport class DECIMAL extends NUMBER {\n\n public readonly options: Options.DecimalOptions;\n\n public getAttributeOptions() {\n const { precision, scale, ...restOptions } = this.options;\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ precision, scale }),\n }\n }\n}\n\nexport class REAL extends NUMBER {\n\n public readonly options: Options.RealOptions;\n\n public getAttributeOptions() {\n const { length, decimals, ...restOptions } = this.options;\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ length, decimals }),\n }\n }\n}\n\nexport class STRING extends Column {\n\n public readonly options: Options.StringOptions;\n\n public getAttributeOptions() {\n const { length, binary, ...restOptions } = this.options;\n\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ length, binary }),\n }\n }\n}\n\nexport class TEXT extends Column {\n\n public readonly options: Options.TextOptions;\n\n public getDataTypeInstance(options: any = {}): any {\n const { database } = this.context;\n const dataType = this.getDataType();\n Object.keys(options).forEach(key => options[key] === undefined && delete options[key]);\n if (database.sequelize.getDialect() === 'postgres') {\n return Object.keys(options).length > 0 ? dataType() : dataType;\n }\n return Object.keys(options).length > 0 ? dataType(options) : dataType;\n }\n\n public getAttributeOptions() {\n const { length, ...restOptions } = this.options;\n\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ length }),\n }\n }\n}\n\nexport class TIME extends Column {\n}\n\nexport class DATE extends Column {\n\n public readonly options: Options.DateOptions;\n\n public getAttributeOptions() {\n const { length, ...restOptions } = this.options;\n\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ length }),\n }\n }\n}\n\nexport class DATEONLY extends Column {\n}\n\nexport class VIRTUAL extends Column {\n}\n\nexport class REFERENCE extends VIRTUAL {\n\n public getDataType() {\n return DataTypes.VIRTUAL;\n }\n\n public getAttributeOptions() {\n const { source, dataIndex, ...restOptions } = this.options;\n\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ source, dataIndex }),\n get() {\n return get(this[source], dataIndex);\n },\n }\n }\n}\n\nexport class FORMULA extends VIRTUAL {\n\n public getDataType() {\n return DataTypes.VIRTUAL;\n }\n\n public getAttributeOptions() {\n const { sourceTable } = this.context;\n const { formula, format = 'string', ...restOptions } = this.options;\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ formula }),\n get() {\n const fields = sourceTable.getFields();\n const data: any = {};\n for (const [name, field] of fields) {\n if (['formula', 'virtual'].indexOf((field.getType() as string).toLowerCase()) === -1) {\n data[name] = this.getDataValue(name);\n }\n }\n try {\n const compiled = template(formula, {\n interpolate: /{{([\\s\\S]+?)}}/g,\n });\n const value = compiled(data);\n return format === 'number' ? toNumber(value) : value;\n } catch (error) {\n console.log(error);\n return;\n }\n }\n }\n }\n}\n\nexport class PASSWORD extends STRING {\n\n public getDataType() {\n return DataTypes.STRING;\n }\n\n constructor(options: Options.StringOptions, context: FieldContext) {\n super(options, context);\n const { database, sourceTable } = context;\n const name = sourceTable.getName();\n database.on(`${name}.beforeCreate`, PASSWORD.hash.bind(this));\n database.on(`${name}.beforeUpdate`, PASSWORD.hash.bind(this));\n }\n\n public static async hash(this: PASSWORD, model) {\n const { name } = this.options;\n if (!model.changed(name as any)) {\n return;\n }\n const value = model.get(name) as string;\n if (value) {\n if (value.startsWith('$2b$10$') && value.length === 60) {\n return;\n }\n const hash = await bcrypt.hash(value, 10);\n model.set(name, hash);\n } else {\n model.set(name, null);\n }\n }\n\n public static async verify(value: string, hash: string) {\n return await bcrypt.compare(value, hash);\n }\n}\n\nexport class ARRAY extends Column {\n\n public readonly options: Options.ArrayOptions;\n\n public getDataType() {\n return DataTypes.JSONB;\n }\n\n public getAttributeOptions() {\n const { items, ...restOptions } = this.options;\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ items }),\n }\n }\n}\n\nexport class JSON extends Column {\n public getDataType() {\n return DataTypes.JSON;\n }\n}\n\nexport class JSONB extends Column {\n public getDataType() {\n if (this.context.database.sequelize.getDialect() === 'postgres') {\n return DataTypes.JSONB;\n }\n return DataTypes.JSON;\n }\n}\n\nexport class UUID extends Column {\n public getDataType() {\n return DataTypes.UUID;\n }\n}\n\nexport class UID extends Column {\n\n constructor(options: Options.StringOptions, context: FieldContext) {\n super(options, context);\n const { sourceTable, database } = context;\n const { name, prefix = '' } = options;\n database.on(`${sourceTable.getName()}.beforeCreate`, (model) => {\n if (!model.get(name)) {\n model.set(name, `${prefix}${uid()}`);\n }\n });\n }\n\n public getDataType() {\n return DataTypes.STRING;\n }\n}\n\nexport class UUIDV4 extends Column {\n public getDataType() {\n return DataTypes.UUIDV4;\n }\n}\n\nexport interface HasOneAccessors {\n get: string;\n set: string;\n create: string;\n}\n\nexport interface HasManyAccessors {\n get: string;\n set: string;\n addMultiple: string;\n add: string;\n create: string;\n remove: string;\n removeMultiple: string;\n hasSingle: string;\n hasAll: string;\n count: string;\n}\n\nexport interface BelongsToAccessors {\n get: string;\n set: string;\n create: string;\n}\n\nexport interface BelongsToManyAccessors {\n get: string;\n set: string;\n addMultiple: string;\n add: string;\n create: string;\n remove: string;\n removeMultiple: string;\n hasSingle: string;\n hasAll: string;\n count: string;\n}\n\nexport abstract class Relation extends Field {\n\n public targetTableInit() {\n const { target, fields = [] } = this.options;\n const children = fields.concat(this.options.children || []);\n if (target && children.length) {\n this.context.database.table({\n name: target,\n fields: children,\n });\n }\n }\n\n public getAssociationType() {\n if (this instanceof HASONE) {\n return 'hasOne';\n }\n if (this instanceof HASMANY) {\n return 'hasMany';\n }\n if (this instanceof BELONGSTO) {\n return 'belongsTo';\n }\n if (this instanceof BELONGSTOMANY) {\n return 'belongsToMany';\n }\n }\n\n public getTarget() {\n const { target, name } = this.options;\n if (target) {\n return target;\n }\n if (this instanceof HASMANY) {\n return name;\n }\n if (this instanceof BELONGSTOMANY) {\n return name;\n }\n return Utils.pluralize(name);\n }\n\n public getTargetModel() {\n const { name } = this.options;\n const { sourceTable } = this.context;\n // @ts-ignore\n return sourceTable.getModel().associations[name].target;\n }\n\n public getAccessors() {\n const { name } = this.options;\n const { sourceTable } = this.context;\n // @ts-ignore\n return sourceTable.getModel().associations[name].accessors;\n }\n\n public getAssociationOptions(): any {\n const { name, ...restOptions } = this.options;\n return {\n as: name,\n ...restOptions,\n };\n }\n\n public getAssociationArguments() {\n return {\n target: this.getTarget(),\n type: this.getAssociationType(),\n options: this.getAssociationOptions(),\n };\n }\n}\n\nclass HasOneOrMany extends Relation {\n constructor(options: Options.HasOneOptions | Options.HasManyOptions, context: FieldContext) {\n const { sourceTable } = context;\n let { foreignKey, sourceKey } = options;\n\n const SourceModel = sourceTable.getModel();\n\n if (!sourceKey) {\n sourceKey = SourceModel.primaryKeyAttribute;\n }\n\n if (!SourceModel.rawAttributes[sourceKey]) {\n sourceTable.addField({\n type: 'integer',\n name: sourceKey,\n unique: true,\n });\n }\n\n if (!foreignKey) {\n foreignKey = Utils.underscoredIf(\n Utils.camelize([\n SourceModel.options.name.singular, sourceKey\n ].join('_')),\n SourceModel.options.underscored\n );\n }\n\n super({ sourceKey, foreignKey, ...options }, context);\n }\n}\n\nexport class HASONE extends HasOneOrMany {\n\n public readonly options: Options.HasOneOptions;\n\n constructor(options: Options.HasOneOptions, context: FieldContext) {\n let { name, target } = options;\n\n if (!target) {\n target = Utils.pluralize(name);\n }\n\n super({ target, ...options }, context);\n\n this.targetTableInit();\n }\n\n public getAccessors(): HasOneAccessors {\n return super.getAccessors();\n }\n\n public getAssociationOptions(): HasOneOptions {\n const { name, ...restOptions } = this.options;\n return {\n as: name,\n ...restOptions,\n }\n }\n}\n\nexport class HASMANY extends HasOneOrMany {\n\n public readonly options: Options.HasManyOptions;\n\n constructor(options: Options.HasManyOptions, context: FieldContext) {\n let { name, target } = options;\n\n if (!target) {\n target = name;\n }\n\n super({ target, ...options }, context);\n this.targetTableInit();\n }\n\n public getAssociationOptions(): HasManyOptions {\n const { name, ...restOptions } = this.options;\n return {\n as: name,\n ...restOptions,\n };\n }\n}\n\nexport class BELONGSTO extends Relation {\n\n public readonly options: Options.BelongsToOptions;\n\n constructor(options: Options.BelongsToOptions, context: FieldContext) {\n let { name, target } = options;\n\n if (!target) {\n target = Utils.pluralize(name);\n }\n\n super({ target, ...options }, context);\n\n this.targetTableInit();\n this.updateOptionsAfterTargetModelBeDefined();\n }\n\n public getAccessors(): BelongsToAccessors {\n return super.getAccessors();\n }\n\n public updateOptionsAfterTargetModelBeDefined() {\n let { name, target, targetKey, foreignKey } = this.options;\n const { database } = this.context;\n\n const TargetModel = database.getModel(target);\n\n if (!TargetModel) {\n return;\n }\n\n if (!targetKey) {\n targetKey = TargetModel.primaryKeyAttribute;\n this.options.targetKey = targetKey;\n }\n\n if (!foreignKey) {\n foreignKey = Utils.underscoredIf(\n Utils.camelize([\n name, targetKey\n ].join('_')),\n TargetModel.options.underscored\n );\n this.options.foreignKey = foreignKey;\n }\n }\n\n public getAssociationOptions(): BelongsToOptions {\n const { name, ...restOptions } = this.options;\n return {\n as: name,\n ...restOptions,\n }\n }\n}\n\nexport class BELONGSTOMANY extends Relation {\n\n public readonly options: Options.BelongsToManyOptions;\n\n constructor(options: Options.BelongsToManyOptions, context: FieldContext) {\n let { name, target, through, sourceKey, foreignKey, targetKey, otherKey } = options;\n const { database, sourceTable } = context;\n const SourceModel = sourceTable.getModel();\n\n if (!target) {\n target = name;\n }\n\n if (!through) {\n through = Utils.underscoredIf(\n Utils.camelize(\n [SourceModel.name, target]\n .map(name => name.toLowerCase())\n .sort()\n .join('_')\n ),\n SourceModel.options.underscored\n );\n }\n\n if (!sourceKey) {\n sourceKey = SourceModel.primaryKeyAttribute;\n }\n\n if (!foreignKey) {\n foreignKey = Utils.underscoredIf(\n Utils.camelize([\n SourceModel.options.name.singular, sourceKey\n ].join('_')),\n SourceModel.options.underscored\n );\n }\n\n super({\n target,\n through,\n sourceKey,\n foreignKey,\n ...options,\n }, context);\n\n this.targetTableInit();\n this.updateOptionsAfterTargetModelBeDefined();\n\n // through table 未特殊定义时,默认根据 through 信息配置 through table\n // database.tables 里不会有 through table,但 database.sequelize.models 有\n database.throughTables.set(this.getThroughName(), [sourceTable.getName(), target]);\n }\n\n public getAccessors(): BelongsToManyAccessors {\n return super.getAccessors();\n }\n\n public updateOptionsAfterTargetModelBeDefined() {\n const { database } = this.context;\n let { target, targetKey, otherKey } = this.options;\n\n const TargetModel = database.getModel(target);\n\n if (!TargetModel) {\n return;\n }\n\n if (!targetKey) {\n targetKey = TargetModel.primaryKeyAttribute;\n this.options.targetKey = targetKey;\n }\n\n if (!otherKey) {\n otherKey = Utils.underscoredIf(\n Utils.camelize([\n TargetModel.options.name.singular, targetKey\n ].join('_')),\n TargetModel.options.underscored\n );\n this.options.otherKey = otherKey;\n }\n }\n\n public getThroughName(): string {\n // TODO name 必须是字符串\n return this.options.through as string;\n }\n\n public getThroughModel(): ModelCtor<Model> {\n const { through, target } = this.options;\n const { database, sourceTable } = this.context;\n\n const throughName = this.getThroughName();\n\n if (database.sequelize.isDefined(throughName)) {\n return database.getModel(throughName);\n }\n\n // 如果不存在 Through Model,需要初始化一个,不能用 Sequelize.Model\n class ThroughModel extends Model { }\n\n // TODO:需要对接 through 的其他参数\n ThroughModel.init({}, {\n modelName: throughName,\n tableName: throughName,\n sequelize: database.sequelize,\n indexes: [],\n underscored: true,\n });\n\n return ThroughModel;\n }\n\n public getAssociationOptions(): BelongsToManyOptions {\n const { name, ...restOptions } = this.options;\n return {\n as: name,\n through: this.getThroughModel(),\n ...restOptions,\n }\n }\n}\n\nexport class SORT extends NUMBER {\n\n public readonly options: Options.SortOptions;\n\n static async beforeCreateHook(this: SORT, model, options) {\n const { name, scope = [] } = this.options;\n // 如果有值,跳过\n if (isNumber(model.get(name))) {\n return;\n }\n const extremum: number = await this.getNextValue({\n ...options,\n where: model.getValuesByFieldNames(scope)\n });\n model.set(name, extremum);\n }\n\n static async beforeBulkCreateHook(this: SORT, models, options) {\n const { transaction } = options;\n const { name, scope = [], next = 'max' } = this.options;\n // 如果未配置范围限定,则可以进行性能优化处理(常用情况)。\n if (!scope.length) {\n const extremum: number = await this.getNextValue({ where: {}, transaction });\n models.forEach((model, i: number) => {\n model.setDataValue(name, extremum + i * (next === 'max' ? 1 : -1));\n });\n return;\n }\n\n // 用于存放 where 条件与计算极值\n const groups = new Map<{ [key: string]: any }, number>();\n await models.reduce((promise, model) => promise.then(async () => {\n const where = model.getValuesByFieldNames(scope);\n\n let extremum: number;\n // 以 map 作为 key\n let combo;\n // 查找与 where 值相等的组合\n for (combo of groups.keys()) {\n if (whereCompare(combo, where)) {\n // 如果找到的话则以之前储存的值作为基础极值\n extremum = groups.get(combo) + (next === 'max' ? 1 : -1);\n break;\n }\n }\n // 如未找到组合\n if (typeof extremum === 'undefined') {\n // 则使用 where 条件查询极值\n extremum = await this.getNextValue({ where, transaction });\n // 且使用 where 条件创建组合\n combo = where;\n }\n const nextValue = extremum;\n // 设置数据行的排序值\n model.setDataValue(name, nextValue);\n // 保存新的排序值为对应 where 组合的极值,以供下次计算\n groups.set(combo, nextValue);\n }), Promise.resolve());\n }\n\n constructor(options: Options.SortOptions, context: FieldContext) {\n super(options, context);\n // const Model = context.sourceTable.getModel();\n // TODO(feature): 可考虑策略模式,以在需要时对外提供接口\n const { database, sourceTable } = context;\n const name = sourceTable.getName();\n database.on(`${name}.beforeCreate`, SORT.beforeCreateHook.bind(this));\n database.on(`${name}.beforeBulkCreate`, SORT.beforeBulkCreateHook.bind(this));\n // Model.addHook('beforeCreate', SORT.beforeCreateHook.bind(this));\n // Model.addHook('beforeBulkCreate', SORT.beforeBulkCreateHook.bind(this));\n }\n\n public getDataType(): Function {\n return DataTypes.INTEGER;\n }\n\n public async getNextValue(this: SORT, { where, transaction, next: n = 'max' }) {\n const table = this.context.sourceTable;\n const Model = table.getModel();\n const { name, next = n } = this.options;\n const extremum: number = await Model[next](name, { where, transaction }) || 0;\n return extremum + (next === 'max' ? 1 : -1);\n }\n}\n\nexport class Radio extends BOOLEAN {\n\n public readonly options: Options.RadioOptions;\n\n static async beforeCreateHook(this: Radio, model, options) {\n const { name, defaultValue = false, scope = [] } = this.options;\n const { transaction } = options;\n const value = model.get(name) || defaultValue;\n model.set(name, value);\n if (value) {\n const where = model.getValuesByFieldNames(scope);\n await this.setOthers({ where, transaction });\n }\n }\n\n static async beforeUpdateHook(this: Radio, model, options) {\n const { name, scope = [] } = this.options;\n const { transaction, association } = options;\n if (model.changed(name) && model.get(name) && !association) {\n const where = model.getValuesByFieldNames(scope);\n const { primaryKeyAttribute } = model.constructor;\n where[primaryKeyAttribute] = { [Op.ne]: model.get(primaryKeyAttribute) }\n await this.setOthers({ where, transaction });\n }\n }\n\n static async beforeBulkCreateHook(this: Radio, models, options) {\n const { scope = [] } = this.options;\n const { transaction } = options;\n\n // 如果未配置范围限定,则可以进行性能优化处理(常用情况)。\n if (!scope.length) {\n await this.makeGroup(models, { transaction });\n return;\n }\n\n const groups = new Map<{ [key: string]: any }, any[]>();\n // 按 scope 先分组\n models.forEach(model => {\n const where = model.getValuesByFieldNames(scope);\n // 以 map 作为 key\n let combo;\n let group;\n // 查找与 where 值相等的组合\n for (combo of groups.keys()) {\n if (whereCompare(combo, where)) {\n group = groups.get(combo);\n break;\n }\n }\n if (!group) {\n group = [];\n groups.set(where, group);\n }\n group.push(model);\n });\n\n for (const [where, group] of groups) {\n await this.makeGroup(group, { where, transaction });\n }\n }\n\n constructor({ type, ...options }: Options.RadioOptions, context: FieldContext) {\n super({ ...options, type: 'radio' }, context);\n // const Model = context.sourceTable.getModel();\n // TODO(feature): 可考虑策略模式,以在需要时对外提供接口\n // Model.addHook('beforeCreate', Radio.beforeCreateHook.bind(this));\n // Model.addHook('beforeUpdate', Radio.beforeUpdateHook.bind(this));\n // // Model.addHook('beforeUpsert', beforeSaveHook);\n // Model.addHook('beforeBulkCreate', Radio.beforeBulkCreateHook.bind(this));\n // TODO(optimize): bulkUpdate 的 hooks 参数不一样,没有对象列表,考虑到很少用,暂时不实现\n // Model.addHook('beforeBulkUpdate', beforeBulkCreateHook);\n const { database, sourceTable } = context;\n const name = sourceTable.getName();\n database.on(`${name}.beforeCreate`, Radio.beforeCreateHook.bind(this));\n database.on(`${name}.beforeUpdate`, Radio.beforeUpdateHook.bind(this));\n database.on(`${name}.beforeBulkCreate`, Radio.beforeBulkCreateHook.bind(this));\n }\n\n public getDataType() {\n return DataTypes.BOOLEAN;\n }\n\n public async setOthers(this: Radio, { where = {}, transaction }) {\n const { name } = this.options;\n const table = this.context.sourceTable;\n const Model = table.getModel();\n // 防止 beforeBulkUpdate hook 死循环,因外层 bulkUpdate 并不禁用,正常更新无影响。\n await Model.update({ [name]: false }, {\n where: {\n ...where,\n [name]: true\n },\n transaction,\n hooks: false\n });\n }\n\n async makeGroup(this: Radio, models, { where = {}, transaction }) {\n const { name, defaultValue = false } = this.options;\n let lastTrue;\n let lastNull;\n models.forEach(model => {\n const value = model.get(name);\n if (value) {\n lastTrue = model;\n } else if (value == null) {\n lastNull = model;\n }\n model.set(name, false);\n });\n if (lastTrue) {\n lastTrue.set(name, true);\n } else if (defaultValue && lastNull) {\n lastNull.set(name, true);\n }\n\n await this.setOthers({ where, transaction });\n }\n}\n"]}
1
+ {"version":3,"sources":["fields/field-types.ts"],"names":[],"mappings":"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","file":"field-types.js","sourcesContent":["import {\n Op,\n Utils,\n DataType,\n DataTypes,\n Sequelize,\n HasOneOptions,\n HasManyOptions,\n BelongsToOptions,\n BelongsToManyOptions,\n ThroughOptions,\n} from 'sequelize';\nimport { template, get, toNumber } from 'lodash';\nimport bcrypt from 'bcrypt';\n\nimport * as Options from './option-types';\nimport { getDataTypeKey } from '.';\nimport Table from '../table';\nimport Database from '../database';\nimport Model, { ModelCtor } from '../model';\nimport { whereCompare, isNumber, uid } from '../utils';\n\nexport interface IField {\n\n}\n\nexport interface IFields {\n [key: string]: IField;\n}\n\nexport interface FieldContext {\n sourceTable: Table;\n database: Database,\n}\n\nexport class Field implements IField {\n\n public readonly options: any;\n\n protected context: FieldContext;\n\n constructor(options: any, context: FieldContext) {\n const { type } = options;\n this.options = {\n ...options,\n // type: getDataTypeKey(type)\n };\n this.context = context;\n }\n\n public isMultipleColumns() {\n return false;\n }\n\n public getType() {\n return this.options.type;\n }\n\n public getOptions() {\n return this.options;\n }\n}\n\nexport class Column extends Field {\n\n public getDataType() {\n const { type } = this.options;\n const dataType = getDataTypeKey(type);\n if (DataTypes[dataType]) {\n return DataTypes[dataType];\n }\n return DataTypes[(<typeof Column>this.constructor).name.toUpperCase()];\n }\n\n public getDataTypeInstance(options: any = {}): any {\n const dataType = this.getDataType();\n Object.keys(options).forEach(key => options[key] === undefined && delete options[key]);\n return Object.keys(options).length > 0 ? dataType(options) : dataType;\n }\n\n public getAttributeOptions() {\n return {\n ...this.options,\n type: this.getDataTypeInstance(),\n }\n }\n}\n\nexport class BOOLEAN extends Column {\n}\n\nexport class NUMBER extends Column {\n}\n\nexport class INTEGER extends NUMBER {\n\n public readonly options: Options.IntegerOptions;\n\n public getDataType(): Function {\n const { type } = this.options;\n\n const dataType = getDataTypeKey(type);\n\n return {\n INT: DataTypes.INTEGER,\n INTEGER: DataTypes.INTEGER,\n TINYINT: DataTypes.TINYINT,\n TINYINTEGER: DataTypes.TINYINT,\n SMALLINT: DataTypes.SMALLINT,\n SMALLINTEGER: DataTypes.SMALLINT,\n MEDIUMINT: DataTypes.MEDIUMINT,\n MEDIUMINTEGER: DataTypes.MEDIUMINT,\n BIGINT: DataTypes.BIGINT,\n BIGINTEGER: DataTypes.BIGINT,\n }[dataType] || DataTypes.INTEGER;\n }\n\n public getAttributeOptions() {\n const { length, zerofill, unsigned, ...restOptions } = this.options;\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ length, zerofill, unsigned }),\n }\n }\n}\n\nexport class FLOAT extends NUMBER {\n\n public readonly options: Options.FloatOptions;\n\n public getAttributeOptions() {\n const { length, decimals, ...restOptions } = this.options;\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ length, decimals }),\n }\n }\n}\n\nexport class DOUBLE extends NUMBER {\n public readonly options: Options.DoubleOptions;\n\n public getAttributeOptions() {\n const { length, decimals, ...restOptions } = this.options;\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ length, decimals }),\n }\n }\n}\n\nexport class DECIMAL extends NUMBER {\n\n public readonly options: Options.DecimalOptions;\n\n public getAttributeOptions() {\n const { precision, scale, ...restOptions } = this.options;\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ precision, scale }),\n }\n }\n}\n\nexport class REAL extends NUMBER {\n\n public readonly options: Options.RealOptions;\n\n public getAttributeOptions() {\n const { length, decimals, ...restOptions } = this.options;\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ length, decimals }),\n }\n }\n}\n\nexport class STRING extends Column {\n\n public readonly options: Options.StringOptions;\n\n public getAttributeOptions() {\n const { length, binary, ...restOptions } = this.options;\n\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ length, binary }),\n }\n }\n}\n\nexport class TEXT extends Column {\n\n public readonly options: Options.TextOptions;\n\n public getDataTypeInstance(options: any = {}): any {\n const { database } = this.context;\n const dataType = this.getDataType();\n Object.keys(options).forEach(key => options[key] === undefined && delete options[key]);\n if (database.sequelize.getDialect() === 'postgres') {\n return Object.keys(options).length > 0 ? dataType() : dataType;\n }\n return Object.keys(options).length > 0 ? dataType(options) : dataType;\n }\n\n public getAttributeOptions() {\n const { length, ...restOptions } = this.options;\n\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ length }),\n }\n }\n}\n\nexport class TIME extends Column {\n}\n\nexport class DATE extends Column {\n\n public readonly options: Options.DateOptions;\n\n public getAttributeOptions() {\n const { length, ...restOptions } = this.options;\n\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ length }),\n }\n }\n}\n\nexport class DATEONLY extends Column {\n}\n\nexport class VIRTUAL extends Column {\n}\n\nexport class REFERENCE extends VIRTUAL {\n\n public getDataType() {\n return DataTypes.VIRTUAL;\n }\n\n public getAttributeOptions() {\n const { source, dataIndex, ...restOptions } = this.options;\n\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ source, dataIndex }),\n get() {\n return get(this[source], dataIndex);\n },\n }\n }\n}\n\nexport class FORMULA extends VIRTUAL {\n\n public getDataType() {\n return DataTypes.VIRTUAL;\n }\n\n public getAttributeOptions() {\n const { sourceTable } = this.context;\n const { formula, format = 'string', ...restOptions } = this.options;\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ formula }),\n get() {\n const fields = sourceTable.getFields();\n const data: any = {};\n for (const [name, field] of fields) {\n if (['formula', 'virtual'].indexOf((field.getType() as string).toLowerCase()) === -1) {\n data[name] = this.getDataValue(name);\n }\n }\n try {\n const compiled = template(formula, {\n interpolate: /{{([\\s\\S]+?)}}/g,\n });\n const value = compiled(data);\n return format === 'number' ? toNumber(value) : value;\n } catch (error) {\n console.log(error);\n return;\n }\n }\n }\n }\n}\n\nexport class PASSWORD extends STRING {\n\n public getDataType() {\n return DataTypes.STRING;\n }\n\n constructor(options: Options.StringOptions, context: FieldContext) {\n super(options, context);\n const { database, sourceTable } = context;\n const name = sourceTable.getName();\n database.on(`${name}.beforeCreate`, PASSWORD.hash.bind(this));\n database.on(`${name}.beforeUpdate`, PASSWORD.hash.bind(this));\n }\n\n public static async hash(this: PASSWORD, model) {\n const { name } = this.options;\n if (!model.changed(name as any)) {\n return;\n }\n const value = model.get(name) as string;\n if (value) {\n if (value.startsWith('$2b$10$') && value.length === 60) {\n return;\n }\n const hash = await bcrypt.hash(value, 10);\n model.set(name, hash);\n } else {\n model.set(name, null);\n }\n }\n\n public static async verify(value: string, hash: string) {\n return await bcrypt.compare(value, hash);\n }\n}\n\nexport class ARRAY extends Column {\n\n public readonly options: Options.ArrayOptions;\n\n public getDataType() {\n return DataTypes.JSONB;\n }\n\n public getAttributeOptions() {\n const { items, ...restOptions } = this.options;\n return {\n ...restOptions,\n type: this.getDataTypeInstance({ items }),\n }\n }\n}\n\nexport class JSON extends Column {\n public getDataType() {\n return DataTypes.JSON;\n }\n}\n\nexport class JSONB extends Column {\n public getDataType() {\n if (this.context.database.sequelize.getDialect() === 'postgres') {\n return DataTypes.JSONB;\n }\n return DataTypes.JSON;\n }\n}\n\nexport class UUID extends Column {\n public getDataType() {\n return DataTypes.UUID;\n }\n}\n\nexport class UID extends Column {\n\n constructor(options: Options.StringOptions, context: FieldContext) {\n super(options, context);\n const { sourceTable, database } = context;\n const { name, prefix = '' } = options;\n database.on(`${sourceTable.getName()}.beforeCreate`, (model) => {\n if (!model.get(name)) {\n model.set(name, `${prefix}${uid()}`);\n }\n });\n }\n\n public getDataType() {\n return DataTypes.STRING;\n }\n}\n\nexport class UUIDV4 extends Column {\n public getDataType() {\n return DataTypes.UUIDV4;\n }\n}\n\nexport interface HasOneAccessors {\n get: string;\n set: string;\n create: string;\n}\n\nexport interface HasManyAccessors {\n get: string;\n set: string;\n addMultiple: string;\n add: string;\n create: string;\n remove: string;\n removeMultiple: string;\n hasSingle: string;\n hasAll: string;\n count: string;\n}\n\nexport interface BelongsToAccessors {\n get: string;\n set: string;\n create: string;\n}\n\nexport interface BelongsToManyAccessors {\n get: string;\n set: string;\n addMultiple: string;\n add: string;\n create: string;\n remove: string;\n removeMultiple: string;\n hasSingle: string;\n hasAll: string;\n count: string;\n}\n\nexport abstract class Relation extends Field {\n\n public targetTableInit() {\n const { target, fields = [] } = this.options;\n const children = fields.concat(this.options.children || []);\n if (target && children.length) {\n this.context.database.table({\n name: target,\n fields: children,\n });\n }\n }\n\n public getAssociationType() {\n if (this instanceof HASONE) {\n return 'hasOne';\n }\n if (this instanceof HASMANY) {\n return 'hasMany';\n }\n if (this instanceof BELONGSTO) {\n return 'belongsTo';\n }\n if (this instanceof BELONGSTOMANY) {\n return 'belongsToMany';\n }\n }\n\n public getTarget() {\n const { target, name } = this.options;\n if (target) {\n return target;\n }\n if (this instanceof HASMANY) {\n return name;\n }\n if (this instanceof BELONGSTOMANY) {\n return name;\n }\n return Utils.pluralize(name);\n }\n\n public getTargetModel() {\n const { name } = this.options;\n const { sourceTable } = this.context;\n // @ts-ignore\n return sourceTable.getModel().associations[name].target;\n }\n\n public getAccessors() {\n const { name } = this.options;\n const { sourceTable } = this.context;\n // @ts-ignore\n return sourceTable.getModel().associations[name].accessors;\n }\n\n public getAssociationOptions(): any {\n const { name, ...restOptions } = this.options;\n return {\n as: name,\n ...restOptions,\n };\n }\n\n public getAssociationArguments() {\n return {\n target: this.getTarget(),\n type: this.getAssociationType(),\n options: this.getAssociationOptions(),\n };\n }\n}\n\nclass HasOneOrMany extends Relation {\n constructor(options: Options.HasOneOptions | Options.HasManyOptions, context: FieldContext) {\n const { sourceTable } = context;\n let { foreignKey, sourceKey } = options;\n\n const SourceModel = sourceTable.getModel();\n\n if (!sourceKey) {\n sourceKey = SourceModel.primaryKeyAttribute;\n }\n\n if (!SourceModel.rawAttributes[sourceKey]) {\n sourceTable.addField({\n type: 'integer',\n name: sourceKey,\n unique: true,\n });\n }\n\n if (!foreignKey) {\n foreignKey = Utils.underscoredIf(\n Utils.camelize([\n SourceModel.options.name.singular, sourceKey\n ].join('_')),\n SourceModel.options.underscored\n );\n }\n\n super({ sourceKey, foreignKey, ...options }, context);\n }\n}\n\nexport class HASONE extends HasOneOrMany {\n\n public readonly options: Options.HasOneOptions;\n\n constructor(options: Options.HasOneOptions, context: FieldContext) {\n let { name, target } = options;\n\n if (!target) {\n target = Utils.pluralize(name);\n }\n\n super({ target, ...options }, context);\n\n this.targetTableInit();\n }\n\n public getAccessors(): HasOneAccessors {\n return super.getAccessors();\n }\n\n public getAssociationOptions(): HasOneOptions {\n const { name, ...restOptions } = this.options;\n return {\n as: name,\n ...restOptions,\n }\n }\n}\n\nexport class HASMANY extends HasOneOrMany {\n\n public readonly options: Options.HasManyOptions;\n\n constructor(options: Options.HasManyOptions, context: FieldContext) {\n let { name, target } = options;\n\n if (!target) {\n target = name;\n }\n\n super({ target, ...options }, context);\n this.targetTableInit();\n }\n\n public getAssociationOptions(): HasManyOptions {\n const { name, ...restOptions } = this.options;\n return {\n as: name,\n ...restOptions,\n };\n }\n}\n\nexport class BELONGSTO extends Relation {\n\n public readonly options: Options.BelongsToOptions;\n\n constructor(options: Options.BelongsToOptions, context: FieldContext) {\n let { name, target } = options;\n\n if (!target) {\n target = Utils.pluralize(name);\n }\n\n super({ target, ...options }, context);\n\n this.targetTableInit();\n this.updateOptionsAfterTargetModelBeDefined();\n }\n\n public getAccessors(): BelongsToAccessors {\n return super.getAccessors();\n }\n\n public updateOptionsAfterTargetModelBeDefined() {\n let { name, target, targetKey, foreignKey } = this.options;\n const { database } = this.context;\n\n const TargetModel = database.getModel(target);\n\n if (!TargetModel) {\n return;\n }\n\n if (!targetKey) {\n targetKey = TargetModel.primaryKeyAttribute;\n this.options.targetKey = targetKey;\n }\n\n if (!foreignKey) {\n foreignKey = Utils.underscoredIf(\n Utils.camelize([\n name, targetKey\n ].join('_')),\n TargetModel.options.underscored\n );\n this.options.foreignKey = foreignKey;\n }\n }\n\n public getAssociationOptions(): BelongsToOptions {\n const { name, ...restOptions } = this.options;\n return {\n as: name,\n ...restOptions,\n }\n }\n}\n\nexport class BELONGSTOMANY extends Relation {\n\n public readonly options: Options.BelongsToManyOptions;\n\n constructor(options: Options.BelongsToManyOptions, context: FieldContext) {\n let { name, target, through, sourceKey, foreignKey, targetKey, otherKey } = options;\n const { database, sourceTable } = context;\n const SourceModel = sourceTable.getModel();\n\n if (!target) {\n target = name;\n }\n\n if (!through) {\n through = Utils.underscoredIf(\n Utils.camelize(\n [SourceModel.name, target]\n .map(name => name.toLowerCase())\n .sort()\n .join('_')\n ),\n SourceModel.options.underscored\n );\n }\n\n if (!sourceKey) {\n sourceKey = SourceModel.primaryKeyAttribute;\n }\n\n if (!foreignKey) {\n foreignKey = Utils.underscoredIf(\n Utils.camelize([\n SourceModel.options.name.singular, sourceKey\n ].join('_')),\n SourceModel.options.underscored\n );\n }\n\n super({\n target,\n through,\n sourceKey,\n foreignKey,\n ...options,\n }, context);\n\n this.targetTableInit();\n this.updateOptionsAfterTargetModelBeDefined();\n\n // through table 未特殊定义时,默认根据 through 信息配置 through table\n // database.tables 里不会有 through table,但 database.sequelize.models 有\n database.throughTables.set(this.getThroughName(), [sourceTable.getName(), target]);\n }\n\n public getAccessors(): BelongsToManyAccessors {\n return super.getAccessors();\n }\n\n public updateOptionsAfterTargetModelBeDefined() {\n const { database } = this.context;\n let { target, targetKey, otherKey } = this.options;\n\n const TargetModel = database.getModel(target);\n\n if (!TargetModel) {\n return;\n }\n\n if (!targetKey) {\n targetKey = TargetModel.primaryKeyAttribute;\n this.options.targetKey = targetKey;\n }\n\n if (!otherKey) {\n otherKey = Utils.underscoredIf(\n Utils.camelize([\n TargetModel.options.name.singular, targetKey\n ].join('_')),\n TargetModel.options.underscored\n );\n this.options.otherKey = otherKey;\n }\n }\n\n public getThroughName(): string {\n // TODO name 必须是字符串\n return this.options.through as string;\n }\n\n public getThroughModel(): ModelCtor<Model> {\n const { through, target } = this.options;\n const { database, sourceTable } = this.context;\n\n const throughName = this.getThroughName();\n\n if (database.sequelize.isDefined(throughName)) {\n return database.getModel(throughName);\n }\n\n // 如果不存在 Through Model,需要初始化一个,不能用 Sequelize.Model\n class ThroughModel extends Model { }\n\n // TODO:需要对接 through 的其他参数\n ThroughModel.init({}, {\n modelName: throughName,\n tableName: throughName,\n sequelize: database.sequelize,\n indexes: [],\n underscored: true,\n });\n\n return ThroughModel;\n }\n\n public getAssociationOptions(): BelongsToManyOptions {\n const { name, ...restOptions } = this.options;\n return {\n as: name,\n through: this.getThroughModel(),\n ...restOptions,\n }\n }\n}\n\nexport class SORT extends NUMBER {\n\n public readonly options: Options.SortOptions;\n\n static async beforeCreateHook(this: SORT, model, options) {\n const { name, scope = [] } = this.options;\n // 如果有值,跳过\n if (isNumber(model.get(name))) {\n return;\n }\n const extremum: number = await this.getNextValue({\n ...options,\n where: model.getValuesByFieldNames(scope)\n });\n model.set(name, extremum);\n }\n\n static async beforeBulkCreateHook(this: SORT, models, options) {\n const { transaction } = options;\n const { name, scope = [], next = 'max' } = this.options;\n // 如果未配置范围限定,则可以进行性能优化处理(常用情况)。\n if (!scope.length) {\n const extremum: number = await this.getNextValue({ where: {}, transaction });\n models.forEach((model, i: number) => {\n model.setDataValue(name, extremum + i * (next === 'max' ? 1 : -1));\n });\n return;\n }\n\n // 用于存放 where 条件与计算极值\n const groups = new Map<{ [key: string]: any }, number>();\n await models.reduce((promise, model) => promise.then(async () => {\n const where = model.getValuesByFieldNames(scope);\n\n let extremum: number;\n // 以 map 作为 key\n let combo;\n // 查找与 where 值相等的组合\n for (combo of groups.keys()) {\n if (whereCompare(combo, where)) {\n // 如果找到的话则以之前储存的值作为基础极值\n extremum = groups.get(combo) + (next === 'max' ? 1 : -1);\n break;\n }\n }\n // 如未找到组合\n if (typeof extremum === 'undefined') {\n // 则使用 where 条件查询极值\n extremum = await this.getNextValue({ where, transaction });\n // 且使用 where 条件创建组合\n combo = where;\n }\n const nextValue = extremum;\n // 设置数据行的排序值\n model.setDataValue(name, nextValue);\n // 保存新的排序值为对应 where 组合的极值,以供下次计算\n groups.set(combo, nextValue);\n }), Promise.resolve());\n }\n\n constructor(options: Options.SortOptions, context: FieldContext) {\n super(options, context);\n // const Model = context.sourceTable.getModel();\n // TODO(feature): 可考虑策略模式,以在需要时对外提供接口\n const { database, sourceTable } = context;\n const name = sourceTable.getName();\n database.on(`${name}.beforeCreate`, SORT.beforeCreateHook.bind(this));\n database.on(`${name}.beforeBulkCreate`, SORT.beforeBulkCreateHook.bind(this));\n // Model.addHook('beforeCreate', SORT.beforeCreateHook.bind(this));\n // Model.addHook('beforeBulkCreate', SORT.beforeBulkCreateHook.bind(this));\n }\n\n public getDataType(): Function {\n return DataTypes.INTEGER;\n }\n\n public async getNextValue(this: SORT, { where, transaction, next: n = 'max' }) {\n const table = this.context.sourceTable;\n const Model = table.getModel();\n const { name, next = n } = this.options;\n const extremum: number = await Model[next](name, { where, transaction }) || 0;\n return extremum + (next === 'max' ? 1 : -1);\n }\n}\n\nexport class Radio extends BOOLEAN {\n\n public readonly options: Options.RadioOptions;\n\n static async beforeCreateHook(this: Radio, model, options) {\n const { name, defaultValue = false, scope = [] } = this.options;\n const { transaction } = options;\n const value = model.get(name) || defaultValue;\n model.set(name, value);\n if (value) {\n const where = model.getValuesByFieldNames(scope);\n await this.setOthers({ where, transaction });\n }\n }\n\n static async beforeUpdateHook(this: Radio, model, options) {\n const { name, scope = [] } = this.options;\n const { transaction, association } = options;\n if (model.changed(name) && model.get(name) && !association) {\n const where = model.getValuesByFieldNames(scope);\n const { primaryKeyAttribute } = model.constructor;\n where[primaryKeyAttribute] = { [Op.ne]: model.get(primaryKeyAttribute) }\n await this.setOthers({ where, transaction });\n }\n }\n\n static async beforeBulkCreateHook(this: Radio, models, options) {\n const { scope = [] } = this.options;\n const { transaction } = options;\n\n // 如果未配置范围限定,则可以进行性能优化处理(常用情况)。\n if (!scope.length) {\n await this.makeGroup(models, { transaction });\n return;\n }\n\n const groups = new Map<{ [key: string]: any }, any[]>();\n // 按 scope 先分组\n models.forEach(model => {\n const where = model.getValuesByFieldNames(scope);\n // 以 map 作为 key\n let combo;\n let group;\n // 查找与 where 值相等的组合\n for (combo of groups.keys()) {\n if (whereCompare(combo, where)) {\n group = groups.get(combo);\n break;\n }\n }\n if (!group) {\n group = [];\n groups.set(where, group);\n }\n group.push(model);\n });\n\n for (const [where, group] of groups) {\n await this.makeGroup(group, { where, transaction });\n }\n }\n\n constructor({ type, ...options }: Options.RadioOptions, context: FieldContext) {\n super({ ...options, type: 'radio' }, context);\n // const Model = context.sourceTable.getModel();\n // TODO(feature): 可考虑策略模式,以在需要时对外提供接口\n // Model.addHook('beforeCreate', Radio.beforeCreateHook.bind(this));\n // Model.addHook('beforeUpdate', Radio.beforeUpdateHook.bind(this));\n // // Model.addHook('beforeUpsert', beforeSaveHook);\n // Model.addHook('beforeBulkCreate', Radio.beforeBulkCreateHook.bind(this));\n // TODO(optimize): bulkUpdate 的 hooks 参数不一样,没有对象列表,考虑到很少用,暂时不实现\n // Model.addHook('beforeBulkUpdate', beforeBulkCreateHook);\n const { database, sourceTable } = context;\n const name = sourceTable.getName();\n database.on(`${name}.beforeCreate`, Radio.beforeCreateHook.bind(this));\n database.on(`${name}.beforeUpdate`, Radio.beforeUpdateHook.bind(this));\n database.on(`${name}.beforeBulkCreate`, Radio.beforeBulkCreateHook.bind(this));\n }\n\n public getDataType() {\n return DataTypes.BOOLEAN;\n }\n\n public async setOthers(this: Radio, { where = {}, transaction }) {\n const { name } = this.options;\n const table = this.context.sourceTable;\n const Model = table.getModel();\n // 防止 beforeBulkUpdate hook 死循环,因外层 bulkUpdate 并不禁用,正常更新无影响。\n await Model.update({ [name]: false }, {\n where: {\n ...where,\n [name]: true\n },\n transaction,\n hooks: false\n });\n }\n\n async makeGroup(this: Radio, models, { where = {}, transaction }) {\n const { name, defaultValue = false } = this.options;\n let lastTrue;\n let lastNull;\n models.forEach(model => {\n const value = model.get(name);\n if (value) {\n lastTrue = model;\n } else if (value == null) {\n lastNull = model;\n }\n model.set(name, false);\n });\n if (lastTrue) {\n lastTrue.set(name, true);\n } else if (defaultValue && lastNull) {\n lastNull.set(name, true);\n }\n\n await this.setOthers({ where, transaction });\n }\n}\n"]}
package/lib/model.js CHANGED
@@ -146,7 +146,7 @@ class Model extends sequelize_1.Model {
146
146
  context = options.context,
147
147
  page = options.page,
148
148
  perPage = options.perPage;
149
- const data = utils_1.toInclude({
149
+ const data = (0, utils_1.toInclude)({
150
150
  fields,
151
151
  filter,
152
152
  sort
@@ -289,7 +289,7 @@ class Model extends sequelize_1.Model {
289
289
  }
290
290
 
291
291
  if (typeof item === 'number' || typeof item === 'string') {
292
- let targetKeyType = fields_1.getDataTypeKey(Target.rawAttributes[targetKey].type).toLocaleLowerCase();
292
+ let targetKeyType = (0, fields_1.getDataTypeKey)(Target.rawAttributes[targetKey].type).toLocaleLowerCase();
293
293
 
294
294
  if (targetKeyType === 'integer') {
295
295
  targetKeyType = 'number';
package/lib/model.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["model.ts"],"names":[],"mappings":"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","file":"model.js","sourcesContent":["import {\n Model as SequelizeModel,\n Op,\n Sequelize,\n ProjectionAlias,\n Utils,\n SaveOptions,\n} from 'sequelize';\nimport Database from './database';\nimport {\n getDataTypeKey,\n HASONE,\n HASMANY,\n BELONGSTO,\n BELONGSTOMANY,\n} from './fields';\nimport { toInclude } from './utils';\n\nexport interface ApiJsonOptions {\n /**\n * 字段\n *\n * 数组式:\n * ['col', 'association.col1', 'association_count'],\n *\n * 白名单:\n * {\n * only: ['col1'],\n * appends: ['association_count'],\n * }\n *\n * 黑名单:\n * {\n * except: ['col1'],\n * appends: ['association_count'],\n * }\n */\n fields?:\n | string[]\n | {\n only?: string[];\n appends?: string[];\n }\n | {\n except?: string[];\n appends?: string[];\n };\n\n /**\n * 过滤\n *\n * 常规用法:\n * {\n * col1: {\n * $eq: 'val1'\n * },\n * }\n *\n * scope 的用法(如果 scope 与 col 同名,只会执行 scope):\n * {\n * scope1: value\n * }\n *\n * json 数据 & 关系数据,可以用点号:\n * {\n * 'association.col1': {\n * $eq: 'val1'\n * },\n * }\n *\n * meta 为 json 字段时\n * {\n * 'meta.key': {\n * $eq: 'val1'\n * },\n * }\n *\n * json 数据 & 关系数据的查询也可以不用点号:\n * {\n * association: {\n * col1: {\n * $eq: 'val1'\n * },\n * },\n * }\n */\n filter?: any;\n\n /**\n * 排序\n *\n * TODO\n *\n * ['col1', '-col2', 'association.col1', '-association.col2']\n */\n sort?: any;\n\n /**\n * 页码\n */\n page?: number;\n perPage?: number;\n\n context?: any;\n\n [key: string]: any;\n}\n\nexport interface WithCountAttributeOptions {\n /**\n * 关系名\n */\n association: string;\n\n /**\n * SourceModel 别名\n *\n * 在 include 里使用时,需要指定,一般与 include 的 association 同名\n *\n * include: {\n * association: 'user', // Post.belongsTo(User)\n * attributes: [\n * User.withCountAttribute({\n * association: 'posts',\n * sourceAlias: 'user', // 内嵌时,需要指定 source 别名\n * })\n * ]\n * }\n */\n sourceAlias?: string;\n\n where?: any;\n\n /**\n * 别名,默认为 association_count\n */\n alias?: string;\n\n [key: string]: any;\n}\n\nexport const DEFAULT_OFFSET = 0;\nexport const DEFAULT_LIMIT = 100;\nexport const MAX_LIMIT = 500;\n\nexport interface UpdateAssociationOptions extends SaveOptions {\n context?: any;\n}\n\n/**\n * Model 相关\n *\n * TODO: 自定义 model 时的提示问题\n */\n// @ts-ignore\nexport abstract class Model extends SequelizeModel {\n /**\n * 防止 ts 报错提示\n */\n [key: string]: any;\n\n /**\n * 当前 Model 的 database\n *\n * 与 Model.sequelize 对应,database 也用了 public static readonly\n */\n public static database: Database;\n\n /**\n * 供 model 实例访问的 database\n */\n get database(): Database {\n // @ts-ignore\n return this.constructor.database;\n }\n\n /**\n * sub query 关联数据的数量\n *\n * TODO: 关联字段暂不支持主键以外的字段\n *\n * @param options\n */\n static withCountAttribute(\n options?: string | WithCountAttributeOptions,\n ): string | ProjectionAlias {\n if (typeof options === 'string') {\n options = { association: options };\n }\n\n const {\n sourceAlias,\n association,\n where = {},\n alias,\n ...restOptions\n } = options;\n const associator = this.associations[association];\n const table = this.database.getTable(this.name);\n const field = table.getField(association);\n const { targetKey, otherKey, foreignKey, sourceKey } = field.options as any;\n\n if (associator.associationType === 'HasMany') {\n where[foreignKey as string] = {\n [Op.eq]: Sequelize.col(`${sourceAlias || this.name}.${sourceKey}`),\n };\n } else if (associator.associationType === 'BelongsToMany') {\n where[targetKey] = {\n [Op.in]: Sequelize.literal(\n `(${(associator as any).through.model.selectQuery({\n attributes: [otherKey],\n where: {\n [foreignKey]: {\n [Op.eq]: Sequelize.col(\n `${sourceAlias || this.name}.${sourceKey}`,\n ),\n },\n // @ts-ignore\n ...(associator.through.scope || {}),\n },\n })})`,\n ),\n };\n }\n\n let countLiteral = 'count(*)';\n\n if (this.database.sequelize.getDialect() === 'postgres') {\n countLiteral = 'cast(count(*) as integer)';\n }\n\n const attribute = [\n Sequelize.literal(\n // @ts-ignore\n `(${associator.target.selectQuery({\n ...restOptions,\n attributes: [[Sequelize.literal(countLiteral), 'count']],\n where: {\n // @ts-ignore\n ...where,\n ...((associator as any).scope || {}),\n },\n })})`,\n ),\n alias ||\n Utils.underscoredIf(`${association}Count`, this.options.underscored),\n ].filter(Boolean);\n\n return (attribute as unknown) as ProjectionAlias;\n }\n\n /**\n * 当前 Model 的 SQL\n *\n * @param options\n */\n static selectQuery(options = {}): string {\n // @ts-ignore\n return this.queryGenerator\n .selectQuery(this.getTableName(), options, this)\n .replace(/;$/, '');\n }\n\n static parseApiJson(options: ApiJsonOptions) {\n const { fields, filter, sort, context, page, perPage } = options;\n const data = toInclude(\n { fields, filter, sort },\n {\n model: this,\n associations: this.associations,\n dialect: this.sequelize.getDialect(),\n ctx: context,\n database: this.database,\n },\n );\n if (page || perPage) {\n data.limit =\n perPage === -1\n ? MAX_LIMIT\n : Math.min(perPage || DEFAULT_LIMIT, MAX_LIMIT);\n data.offset = data.limit * (page > 0 ? page - 1 : DEFAULT_OFFSET);\n }\n if (data.attributes && data.attributes.length === 0) {\n delete data.attributes;\n }\n return data;\n }\n\n getValuesByFieldNames(scope = []) {\n const table = this.database.getTable(this.constructor.name);\n const Model = table.getModel();\n const associations = table.getAssociations();\n const where = {};\n scope.forEach((col) => {\n const association = associations.get(col);\n const dataKey =\n association && association instanceof BELONGSTO\n ? association.options.foreignKey\n : col;\n if (!Model.rawAttributes[dataKey]) {\n return;\n }\n const value = this.getDataValue(dataKey);\n if (typeof value !== 'undefined') {\n where[dataKey] = value;\n }\n });\n return where;\n }\n\n async updateSingleAssociation(\n key: string,\n data: any,\n options: UpdateAssociationOptions = {},\n ) {\n const {\n fields,\n transaction = await this.sequelize.transaction(),\n ...opts\n } = options;\n Object.assign(opts, { transaction });\n\n const table = this.database.getTable(this.constructor.name);\n const association = table.getAssociations().get(key);\n const accessors = association.getAccessors();\n\n if (data == null) {\n await this[accessors.set](null, opts);\n return;\n }\n\n if (\n typeof data === 'number' ||\n typeof data === 'string' ||\n data instanceof SequelizeModel\n ) {\n await this[accessors.set](data, opts);\n } else if (typeof data === 'object') {\n const Target = association.getTargetModel();\n const targetAttribute =\n association instanceof BELONGSTO\n ? association.options.targetKey\n : association.options.sourceKey;\n if (data[targetAttribute]) {\n if (Object.keys(data).length > 0) {\n const target = await Target.findOne({\n where: {\n [targetAttribute]: data[targetAttribute],\n },\n transaction,\n });\n if (target) {\n await this[accessors.set](data[targetAttribute], opts);\n await target.update(data, opts);\n // @ts-ignore\n await target.updateAssociations(data, opts);\n } else {\n const t = await this[accessors.create](data, opts);\n await t.updateAssociations(data, opts);\n }\n }\n } else {\n const t = await this[accessors.create](data, opts);\n await t.updateAssociations(data, opts);\n }\n }\n if (!options.transaction) {\n await transaction.commit();\n }\n }\n\n async updateMultipleAssociation(\n associationName: string,\n data: any,\n options: UpdateAssociationOptions = {},\n ) {\n const items = Array.isArray(data) ? data : data == null ? [] : [data];\n\n const {\n fields,\n transaction = await this.sequelize.transaction(),\n ...opts\n } = options;\n Object.assign(opts, { transaction });\n\n const table = this.database.getTable(this.constructor.name);\n const association = table.getAssociations().get(associationName);\n const accessors = association.getAccessors();\n\n if (!items.length) {\n await this[accessors.set](null, opts);\n return;\n }\n\n const Target = association.getTargetModel();\n // 当前表关联 target 表的外键(大部分情况与 target 表主键相同,但可以设置为不同的,要考虑)\n const { targetKey = Target.primaryKeyAttribute } = association.options;\n // target 表的主键\n const targetPk = Target.primaryKeyAttribute;\n const targetKeyIsPk = targetKey === targetPk;\n // 准备设置的关联主键\n const toSetPks = new Set();\n const toSetUks = new Set();\n // 筛选后准备设置的关联主键\n const toSetItems = new Set();\n // 准备添加的关联对象\n const toUpsertObjects = [];\n\n // 遍历所有值成员准备数据\n items.forEach((item) => {\n if (item instanceof SequelizeModel) {\n if (targetKeyIsPk) {\n toSetPks.add(item.getDataValue(targetPk));\n } else {\n toSetUks.add(item.getDataValue(targetKey));\n }\n return;\n }\n if (typeof item === 'number' || typeof item === 'string') {\n let targetKeyType = getDataTypeKey(\n Target.rawAttributes[targetKey].type,\n ).toLocaleLowerCase();\n if (targetKeyType === 'integer') {\n targetKeyType = 'number';\n }\n // 如果传值类型与之前在 Model 上定义的 targetKey 不同,则报错。\n // 不应兼容定义的 targetKey 不是 primaryKey 却传了 primaryKey 的值的情况。\n if (typeof item !== targetKeyType) {\n throw new Error(\n `target key type [${typeof item}] does not match to [${targetKeyType}]`,\n );\n }\n if (targetKeyIsPk) {\n toSetPks.add(item);\n } else {\n toSetUks.add(item);\n }\n return;\n }\n if (typeof item === 'object') {\n toUpsertObjects.push(item);\n }\n });\n\n /* 仅传关联键处理开始 */\n // 查找已存在的数据\n const byPkExistItems = toSetPks.size\n ? await Target.findAll({\n ...opts,\n // @ts-ignore\n where: {\n [targetPk]: {\n [Op.in]: Array.from(toSetPks),\n },\n },\n attributes: [targetPk],\n })\n : [];\n byPkExistItems.forEach((item) => {\n toSetItems.add(item);\n });\n\n const byUkExistItems = toSetUks.size\n ? await Target.findAll({\n ...opts,\n // @ts-ignore\n where: {\n [targetKey]: {\n [Op.in]: Array.from(toSetUks),\n },\n },\n attributes: [targetPk, targetKey],\n })\n : [];\n byUkExistItems.forEach((item) => {\n toSetItems.add(item);\n });\n /* 仅传关联键处理结束 */\n\n const belongsToManyList = [];\n /* 值为对象处理开始 */\n for (const item of toUpsertObjects) {\n let target;\n if (typeof item[targetKey] === 'undefined') {\n target = await this[accessors.create](item, opts);\n } else {\n target = await Target.findOne({\n ...opts,\n where: { [targetKey]: item[targetKey] },\n });\n if (!target) {\n target = await this[accessors.create](item, opts);\n } else {\n await target.update(item, opts);\n }\n }\n // TODO(optimize): 此处添加的对象其实已经创建了关联,\n // 但考虑到单条 create 的 hook 要求带上关联键,且后面的 set,\n // 所以仍然交给 set 再调用关联一次。\n toSetItems.add(target);\n\n if (association instanceof BELONGSTOMANY) {\n belongsToManyList.push({\n item,\n target,\n });\n }\n\n await target.updateAssociations(item, opts);\n }\n /* 值为对象处理结束 */\n\n // 添加所有计算后的关联\n await this[accessors.set](Array.from(toSetItems), opts);\n\n // 后处理 belongsToMany 的更新内容\n if (belongsToManyList.length) {\n const ThroughModel = (association as BELONGSTOMANY).getThroughModel();\n const throughName = (association as BELONGSTOMANY).getThroughName();\n\n for (const { item, target } of belongsToManyList) {\n const throughValues = item[throughName];\n if (throughValues && typeof throughValues === 'object') {\n const { foreignKey, sourceKey, otherKey } = association.options;\n const through = await ThroughModel.findOne({\n where: {\n [foreignKey]: this.get(sourceKey),\n [otherKey]: target.get(targetKey),\n },\n transaction,\n });\n await through.update(throughValues, opts);\n // TODO:有 BUG,未知\n // await through.updateAssociations(throughValues, opts);\n }\n }\n }\n\n if (!options.transaction) {\n await transaction.commit();\n }\n }\n\n async updateAssociation(\n key: string,\n data: any,\n options: UpdateAssociationOptions = {},\n ) {\n const table = this.database.getTable(this.constructor.name);\n const association = table.getAssociations().get(key);\n switch (true) {\n case association instanceof BELONGSTO:\n case association instanceof HASONE:\n return this.updateSingleAssociation(key, data, options);\n case association instanceof HASMANY:\n case association instanceof BELONGSTOMANY:\n return this.updateMultipleAssociation(key, data, options);\n }\n }\n\n /**\n * 关联数据的更新\n *\n * @param data\n */\n async updateAssociations(data: any, options: UpdateAssociationOptions = {}) {\n const { transaction = await this.sequelize.transaction() } = options;\n // @ts-ignore 判断 Model.associations 更准确\n for (const key of Object.keys(this.constructor.associations)) {\n // 如果 key 不存在才跳过\n if (!Object.keys(data).includes(key)) {\n continue;\n }\n await this.updateAssociation(key, data[key], {\n ...options,\n transaction,\n });\n }\n\n await this.database.emitAsync('afterUpdateAssociations', this, {\n ...options,\n transaction,\n });\n\n if (!options.transaction) {\n await transaction.commit();\n }\n }\n}\n\n/**\n * ModelCtor 需要为当前 Model 的\n */\nexport type ModelCtor<M extends Model> = typeof Model & { new (): M } & {\n [key: string]: any;\n};\n\nexport default Model;\n"]}
1
+ {"version":3,"sources":["model.ts"],"names":[],"mappings":"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","file":"model.js","sourcesContent":["import {\n Model as SequelizeModel,\n Op,\n Sequelize,\n ProjectionAlias,\n Utils,\n SaveOptions,\n} from 'sequelize';\nimport Database from './database';\nimport {\n getDataTypeKey,\n HASONE,\n HASMANY,\n BELONGSTO,\n BELONGSTOMANY,\n} from './fields';\nimport { toInclude } from './utils';\n\nexport interface ApiJsonOptions {\n /**\n * 字段\n *\n * 数组式:\n * ['col', 'association.col1', 'association_count'],\n *\n * 白名单:\n * {\n * only: ['col1'],\n * appends: ['association_count'],\n * }\n *\n * 黑名单:\n * {\n * except: ['col1'],\n * appends: ['association_count'],\n * }\n */\n fields?:\n | string[]\n | {\n only?: string[];\n appends?: string[];\n }\n | {\n except?: string[];\n appends?: string[];\n };\n\n /**\n * 过滤\n *\n * 常规用法:\n * {\n * col1: {\n * $eq: 'val1'\n * },\n * }\n *\n * scope 的用法(如果 scope 与 col 同名,只会执行 scope):\n * {\n * scope1: value\n * }\n *\n * json 数据 & 关系数据,可以用点号:\n * {\n * 'association.col1': {\n * $eq: 'val1'\n * },\n * }\n *\n * meta 为 json 字段时\n * {\n * 'meta.key': {\n * $eq: 'val1'\n * },\n * }\n *\n * json 数据 & 关系数据的查询也可以不用点号:\n * {\n * association: {\n * col1: {\n * $eq: 'val1'\n * },\n * },\n * }\n */\n filter?: any;\n\n /**\n * 排序\n *\n * TODO\n *\n * ['col1', '-col2', 'association.col1', '-association.col2']\n */\n sort?: any;\n\n /**\n * 页码\n */\n page?: number;\n perPage?: number;\n\n context?: any;\n\n [key: string]: any;\n}\n\nexport interface WithCountAttributeOptions {\n /**\n * 关系名\n */\n association: string;\n\n /**\n * SourceModel 别名\n *\n * 在 include 里使用时,需要指定,一般与 include 的 association 同名\n *\n * include: {\n * association: 'user', // Post.belongsTo(User)\n * attributes: [\n * User.withCountAttribute({\n * association: 'posts',\n * sourceAlias: 'user', // 内嵌时,需要指定 source 别名\n * })\n * ]\n * }\n */\n sourceAlias?: string;\n\n where?: any;\n\n /**\n * 别名,默认为 association_count\n */\n alias?: string;\n\n [key: string]: any;\n}\n\nexport const DEFAULT_OFFSET = 0;\nexport const DEFAULT_LIMIT = 100;\nexport const MAX_LIMIT = 500;\n\nexport interface UpdateAssociationOptions extends SaveOptions {\n context?: any;\n}\n\n/**\n * Model 相关\n *\n * TODO: 自定义 model 时的提示问题\n */\n// @ts-ignore\nexport abstract class Model extends SequelizeModel {\n /**\n * 防止 ts 报错提示\n */\n [key: string]: any;\n\n /**\n * 当前 Model 的 database\n *\n * 与 Model.sequelize 对应,database 也用了 public static readonly\n */\n public static database: Database;\n\n /**\n * 供 model 实例访问的 database\n */\n get database(): Database {\n // @ts-ignore\n return this.constructor.database;\n }\n\n /**\n * sub query 关联数据的数量\n *\n * TODO: 关联字段暂不支持主键以外的字段\n *\n * @param options\n */\n static withCountAttribute(\n options?: string | WithCountAttributeOptions,\n ): string | ProjectionAlias {\n if (typeof options === 'string') {\n options = { association: options };\n }\n\n const {\n sourceAlias,\n association,\n where = {},\n alias,\n ...restOptions\n } = options;\n const associator = this.associations[association];\n const table = this.database.getTable(this.name);\n const field = table.getField(association);\n const { targetKey, otherKey, foreignKey, sourceKey } = field.options as any;\n\n if (associator.associationType === 'HasMany') {\n where[foreignKey as string] = {\n [Op.eq]: Sequelize.col(`${sourceAlias || this.name}.${sourceKey}`),\n };\n } else if (associator.associationType === 'BelongsToMany') {\n where[targetKey] = {\n [Op.in]: Sequelize.literal(\n `(${(associator as any).through.model.selectQuery({\n attributes: [otherKey],\n where: {\n [foreignKey]: {\n [Op.eq]: Sequelize.col(\n `${sourceAlias || this.name}.${sourceKey}`,\n ),\n },\n // @ts-ignore\n ...(associator.through.scope || {}),\n },\n })})`,\n ),\n };\n }\n\n let countLiteral = 'count(*)';\n\n if (this.database.sequelize.getDialect() === 'postgres') {\n countLiteral = 'cast(count(*) as integer)';\n }\n\n const attribute = [\n Sequelize.literal(\n // @ts-ignore\n `(${associator.target.selectQuery({\n ...restOptions,\n attributes: [[Sequelize.literal(countLiteral), 'count']],\n where: {\n // @ts-ignore\n ...where,\n ...((associator as any).scope || {}),\n },\n })})`,\n ),\n alias ||\n Utils.underscoredIf(`${association}Count`, this.options.underscored),\n ].filter(Boolean);\n\n return (attribute as unknown) as ProjectionAlias;\n }\n\n /**\n * 当前 Model 的 SQL\n *\n * @param options\n */\n static selectQuery(options = {}): string {\n // @ts-ignore\n return this.queryGenerator\n .selectQuery(this.getTableName(), options, this)\n .replace(/;$/, '');\n }\n\n static parseApiJson(options: ApiJsonOptions) {\n const { fields, filter, sort, context, page, perPage } = options;\n const data = toInclude(\n { fields, filter, sort },\n {\n model: this,\n associations: this.associations,\n dialect: this.sequelize.getDialect(),\n ctx: context,\n database: this.database,\n },\n );\n if (page || perPage) {\n data.limit =\n perPage === -1\n ? MAX_LIMIT\n : Math.min(perPage || DEFAULT_LIMIT, MAX_LIMIT);\n data.offset = data.limit * (page > 0 ? page - 1 : DEFAULT_OFFSET);\n }\n if (data.attributes && data.attributes.length === 0) {\n delete data.attributes;\n }\n return data;\n }\n\n getValuesByFieldNames(scope = []) {\n const table = this.database.getTable(this.constructor.name);\n const Model = table.getModel();\n const associations = table.getAssociations();\n const where = {};\n scope.forEach((col) => {\n const association = associations.get(col);\n const dataKey =\n association && association instanceof BELONGSTO\n ? association.options.foreignKey\n : col;\n if (!Model.rawAttributes[dataKey]) {\n return;\n }\n const value = this.getDataValue(dataKey);\n if (typeof value !== 'undefined') {\n where[dataKey] = value;\n }\n });\n return where;\n }\n\n async updateSingleAssociation(\n key: string,\n data: any,\n options: UpdateAssociationOptions = {},\n ) {\n const {\n fields,\n transaction = await this.sequelize.transaction(),\n ...opts\n } = options;\n Object.assign(opts, { transaction });\n\n const table = this.database.getTable(this.constructor.name);\n const association = table.getAssociations().get(key);\n const accessors = association.getAccessors();\n\n if (data == null) {\n await this[accessors.set](null, opts);\n return;\n }\n\n if (\n typeof data === 'number' ||\n typeof data === 'string' ||\n data instanceof SequelizeModel\n ) {\n await this[accessors.set](data, opts);\n } else if (typeof data === 'object') {\n const Target = association.getTargetModel();\n const targetAttribute =\n association instanceof BELONGSTO\n ? association.options.targetKey\n : association.options.sourceKey;\n if (data[targetAttribute]) {\n if (Object.keys(data).length > 0) {\n const target = await Target.findOne({\n where: {\n [targetAttribute]: data[targetAttribute],\n },\n transaction,\n });\n if (target) {\n await this[accessors.set](data[targetAttribute], opts);\n await target.update(data, opts);\n // @ts-ignore\n await target.updateAssociations(data, opts);\n } else {\n const t = await this[accessors.create](data, opts);\n await t.updateAssociations(data, opts);\n }\n }\n } else {\n const t = await this[accessors.create](data, opts);\n await t.updateAssociations(data, opts);\n }\n }\n if (!options.transaction) {\n await transaction.commit();\n }\n }\n\n async updateMultipleAssociation(\n associationName: string,\n data: any,\n options: UpdateAssociationOptions = {},\n ) {\n const items = Array.isArray(data) ? data : data == null ? [] : [data];\n\n const {\n fields,\n transaction = await this.sequelize.transaction(),\n ...opts\n } = options;\n Object.assign(opts, { transaction });\n\n const table = this.database.getTable(this.constructor.name);\n const association = table.getAssociations().get(associationName);\n const accessors = association.getAccessors();\n\n if (!items.length) {\n await this[accessors.set](null, opts);\n return;\n }\n\n const Target = association.getTargetModel();\n // 当前表关联 target 表的外键(大部分情况与 target 表主键相同,但可以设置为不同的,要考虑)\n const { targetKey = Target.primaryKeyAttribute } = association.options;\n // target 表的主键\n const targetPk = Target.primaryKeyAttribute;\n const targetKeyIsPk = targetKey === targetPk;\n // 准备设置的关联主键\n const toSetPks = new Set();\n const toSetUks = new Set();\n // 筛选后准备设置的关联主键\n const toSetItems = new Set();\n // 准备添加的关联对象\n const toUpsertObjects = [];\n\n // 遍历所有值成员准备数据\n items.forEach((item) => {\n if (item instanceof SequelizeModel) {\n if (targetKeyIsPk) {\n toSetPks.add(item.getDataValue(targetPk));\n } else {\n toSetUks.add(item.getDataValue(targetKey));\n }\n return;\n }\n if (typeof item === 'number' || typeof item === 'string') {\n let targetKeyType = getDataTypeKey(\n Target.rawAttributes[targetKey].type,\n ).toLocaleLowerCase();\n if (targetKeyType === 'integer') {\n targetKeyType = 'number';\n }\n // 如果传值类型与之前在 Model 上定义的 targetKey 不同,则报错。\n // 不应兼容定义的 targetKey 不是 primaryKey 却传了 primaryKey 的值的情况。\n if (typeof item !== targetKeyType) {\n throw new Error(\n `target key type [${typeof item}] does not match to [${targetKeyType}]`,\n );\n }\n if (targetKeyIsPk) {\n toSetPks.add(item);\n } else {\n toSetUks.add(item);\n }\n return;\n }\n if (typeof item === 'object') {\n toUpsertObjects.push(item);\n }\n });\n\n /* 仅传关联键处理开始 */\n // 查找已存在的数据\n const byPkExistItems = toSetPks.size\n ? await Target.findAll({\n ...opts,\n // @ts-ignore\n where: {\n [targetPk]: {\n [Op.in]: Array.from(toSetPks),\n },\n },\n attributes: [targetPk],\n })\n : [];\n byPkExistItems.forEach((item) => {\n toSetItems.add(item);\n });\n\n const byUkExistItems = toSetUks.size\n ? await Target.findAll({\n ...opts,\n // @ts-ignore\n where: {\n [targetKey]: {\n [Op.in]: Array.from(toSetUks),\n },\n },\n attributes: [targetPk, targetKey],\n })\n : [];\n byUkExistItems.forEach((item) => {\n toSetItems.add(item);\n });\n /* 仅传关联键处理结束 */\n\n const belongsToManyList = [];\n /* 值为对象处理开始 */\n for (const item of toUpsertObjects) {\n let target;\n if (typeof item[targetKey] === 'undefined') {\n target = await this[accessors.create](item, opts);\n } else {\n target = await Target.findOne({\n ...opts,\n where: { [targetKey]: item[targetKey] },\n });\n if (!target) {\n target = await this[accessors.create](item, opts);\n } else {\n await target.update(item, opts);\n }\n }\n // TODO(optimize): 此处添加的对象其实已经创建了关联,\n // 但考虑到单条 create 的 hook 要求带上关联键,且后面的 set,\n // 所以仍然交给 set 再调用关联一次。\n toSetItems.add(target);\n\n if (association instanceof BELONGSTOMANY) {\n belongsToManyList.push({\n item,\n target,\n });\n }\n\n await target.updateAssociations(item, opts);\n }\n /* 值为对象处理结束 */\n\n // 添加所有计算后的关联\n await this[accessors.set](Array.from(toSetItems), opts);\n\n // 后处理 belongsToMany 的更新内容\n if (belongsToManyList.length) {\n const ThroughModel = (association as BELONGSTOMANY).getThroughModel();\n const throughName = (association as BELONGSTOMANY).getThroughName();\n\n for (const { item, target } of belongsToManyList) {\n const throughValues = item[throughName];\n if (throughValues && typeof throughValues === 'object') {\n const { foreignKey, sourceKey, otherKey } = association.options;\n const through = await ThroughModel.findOne({\n where: {\n [foreignKey]: this.get(sourceKey),\n [otherKey]: target.get(targetKey),\n },\n transaction,\n });\n await through.update(throughValues, opts);\n // TODO:有 BUG,未知\n // await through.updateAssociations(throughValues, opts);\n }\n }\n }\n\n if (!options.transaction) {\n await transaction.commit();\n }\n }\n\n async updateAssociation(\n key: string,\n data: any,\n options: UpdateAssociationOptions = {},\n ) {\n const table = this.database.getTable(this.constructor.name);\n const association = table.getAssociations().get(key);\n switch (true) {\n case association instanceof BELONGSTO:\n case association instanceof HASONE:\n return this.updateSingleAssociation(key, data, options);\n case association instanceof HASMANY:\n case association instanceof BELONGSTOMANY:\n return this.updateMultipleAssociation(key, data, options);\n }\n }\n\n /**\n * 关联数据的更新\n *\n * @param data\n */\n async updateAssociations(data: any, options: UpdateAssociationOptions = {}) {\n const { transaction = await this.sequelize.transaction() } = options;\n // @ts-ignore 判断 Model.associations 更准确\n for (const key of Object.keys(this.constructor.associations)) {\n // 如果 key 不存在才跳过\n if (!Object.keys(data).includes(key)) {\n continue;\n }\n await this.updateAssociation(key, data[key], {\n ...options,\n transaction,\n });\n }\n\n await this.database.emitAsync('afterUpdateAssociations', this, {\n ...options,\n transaction,\n });\n\n if (!options.transaction) {\n await transaction.commit();\n }\n }\n}\n\n/**\n * ModelCtor 需要为当前 Model 的\n */\nexport type ModelCtor<M extends Model> = typeof Model & { new (): M } & {\n [key: string]: any;\n};\n\nexport default Model;\n"]}
package/lib/op.js CHANGED
@@ -35,11 +35,11 @@ function toArray(value) {
35
35
  }
36
36
 
37
37
  function stringToDate(value) {
38
- return moment_1.default(value).toDate();
38
+ return (0, moment_1.default)(value).toDate();
39
39
  }
40
40
 
41
41
  function getNextDay(value) {
42
- return moment_1.default(value).add(1, 'd').toDate();
42
+ return (0, moment_1.default)(value).add(1, 'd').toDate();
43
43
  }
44
44
 
45
45
  const op = new Map();
package/lib/op.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["op.ts"],"names":[],"mappings":"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","file":"op.js","sourcesContent":["import { Op, Utils, Sequelize } from 'sequelize';\nimport moment, { MomentInput } from 'moment';\n\nfunction toArray(value: any): any[] {\n if (value == null) {\n return [];\n }\n return Array.isArray(value) ? value : [value];\n}\n\nfunction stringToDate(value: string): Date {\n return moment(value).toDate();\n}\n\nfunction getNextDay(value: MomentInput): Date {\n return moment(value).add(1, 'd').toDate();\n}\n\nconst op = new Map<string, typeof Op | Function>();\n\n// Sequelize 内置\nfor (const key in Op) {\n op.set(key, Op[key]);\n const val = Utils.underscoredIf(key, true);\n op.set(val, Op[key]);\n op.set(val.replace(/_/g, ''), Op[key]);\n}\n\n// 通用\n\n// 是否为空:数据库意义的 null\nop.set('$null', (value, { fieldPath, database }) => {\n // const field = database.getFieldByPath(fieldPath);\n // console.log({field});\n return { [Op.is]: null };\n});\nop.set('$notNull', () => ({ [Op.not]: null }));\n\nop.set('$isTruly', () => ({\n [Op.eq]: true,\n}));\nop.set('$isFalsy', () => ({\n [Op.or]: [\n {\n [Op.eq]: false,\n },\n {\n [Op.is]: null,\n },\n ],\n}));\n\n// 字符串\n\n// 包含:指对应字段的值包含某个子串\nop.set('$includes', (value: string, { dialect }) => ({\n [dialect === 'postgres' ? Op.iLike : Op.like]: `%${value}%`,\n}));\n// 不包含:指对应字段的值不包含某个子串(慎用:性能问题)\nop.set('$notIncludes', (value: string, { dialect }) => ({\n [dialect === 'postgres' ? Op.notILike : Op.notLike]: `%${value}%`,\n}));\n// 以之起始\nop.set('$startsWith', (value: string, { dialect }) => ({\n [dialect === 'postgres' ? Op.iLike : Op.like]: `${value}%`,\n}));\n// 不以之起始\nop.set('$notStartsWith', (value: string, { dialect }) => ({\n [dialect === 'postgres' ? Op.notILike : Op.notLike]: `${value}%`,\n}));\n// 以之结束\nop.set('$endsWith', (value: string, { dialect }) => ({\n [dialect === 'postgres' ? Op.iLike : Op.like]: `%${value}`,\n}));\n// 不以之结束\nop.set('$notEndsWith', (value: string, { dialect }) => ({\n [dialect === 'postgres' ? Op.notILike : Op.notLike]: `%${value}`,\n}));\n\n// 仅日期\n\n// 在某日\nop.set('$dateOn', (value: string) => ({\n [Op.and]: [{ [Op.gte]: stringToDate(value) }, { [Op.lt]: getNextDay(value) }],\n}));\n// 不在某日\nop.set('$dateNotOn', (value: string) => ({\n [Op.or]: [{ [Op.lt]: stringToDate(value) }, { [Op.gte]: getNextDay(value) }],\n}));\n// 某日前\nop.set('$dateBefore', (value: string) => ({ [Op.lt]: stringToDate(value) }));\n// 某日后\nop.set('$dateAfter', (value: string) => ({ [Op.gte]: getNextDay(value) }));\n// 不早于(含当天)\nop.set('$dateNotBefore', (value: string) => ({\n [Op.gte]: stringToDate(value),\n}));\n// 不晚于(含当天)\nop.set('$dateNotAfter', (value: string) => ({ [Op.lt]: getNextDay(value) }));\n// 在期间\nop.set('$dateBetween', ([from, to]: string[]) => ({\n [Op.and]: [{ [Op.gte]: stringToDate(from) }, { [Op.lt]: getNextDay(to) }],\n}));\n// 不在期间\nop.set('$dateNotBetween', ([from, to]: string[]) => ({\n [Op.or]: [{ [Op.lt]: stringToDate(from) }, { [Op.gte]: getNextDay(to) }],\n}));\n\n// 多选(JSON)类型\n\n// 包含组中任意值(命名来源:`Array.prototype.some`)\nop.set('$anyOf', (values: any[], options) => {\n if (!values) {\n return Sequelize.literal('');\n }\n values = Array.isArray(values) ? values : [values];\n if (values.length === 0) {\n return Sequelize.literal('');\n }\n const { field, fieldPath } = options;\n const column = fieldPath\n .split('.')\n .map((name) => `\"${name}\"`)\n .join('.');\n const sql = values\n .map((value) => `(${column})::jsonb @> '${JSON.stringify(value)}'`)\n .join(' OR ');\n return Sequelize.literal(sql);\n});\n// 包含组中所有值\nop.set('$allOf', (values: any) => ({ [Op.contains]: toArray(values) }));\n// TODO(bug): 不包含组中任意值\nop.set('$noneOf', (values: any[], options) => {\n if (!values) {\n return Sequelize.literal('');\n }\n values = Array.isArray(values) ? values : [values];\n if (values.length === 0) {\n return Sequelize.literal('');\n }\n const { field, fieldPath } = options;\n const column = fieldPath\n .split('.')\n .map((name) => `\"${name}\"`)\n .join('.');\n const sql = values\n .map((value) => `(${column})::jsonb @> '${JSON.stringify(value)}'`)\n .join(' OR ');\n return Sequelize.literal(`not (${sql})`);\n});\n// 与组中值匹配\nop.set('$match', (values: any[], options) => {\n const array = toArray(values);\n if (values.length === 0) {\n return Sequelize.literal('');\n }\n const { field, fieldPath } = options;\n const column = fieldPath\n .split('.')\n .map((name) => `\"${name}\"`)\n .join('.');\n const sql = `(${column})::jsonb @> '${JSON.stringify(\n array,\n )}' AND (${column})::jsonb <@ '${JSON.stringify(array)}'`;\n return Sequelize.literal(sql);\n});\nop.set('$notMatch', (values: any[], options) => {\n const array = toArray(values);\n if (values.length === 0) {\n return Sequelize.literal('');\n }\n const { field, fieldPath } = options;\n const column = fieldPath\n .split('.')\n .map((name) => `\"${name}\"`)\n .join('.');\n const sql = `(${column})::jsonb @> '${JSON.stringify(\n array,\n )}' AND (${column})::jsonb <@ '${JSON.stringify(array)}'`;\n return Sequelize.literal(`not (${sql})`);\n // return Sequelize.literal(`(not (${sql})) AND ${column} IS NULL`);\n});\n\nexport default class Operator {\n public static get(key: string) {\n return op.get(key);\n }\n\n public static has(key: string) {\n return op.has(key);\n }\n\n public static register(key: string, fn: Function) {\n op.set(key, fn);\n }\n}\n"]}
1
+ {"version":3,"sources":["op.ts"],"names":[],"mappings":"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","file":"op.js","sourcesContent":["import { Op, Utils, Sequelize } from 'sequelize';\nimport moment, { MomentInput } from 'moment';\n\nfunction toArray(value: any): any[] {\n if (value == null) {\n return [];\n }\n return Array.isArray(value) ? value : [value];\n}\n\nfunction stringToDate(value: string): Date {\n return moment(value).toDate();\n}\n\nfunction getNextDay(value: MomentInput): Date {\n return moment(value).add(1, 'd').toDate();\n}\n\nconst op = new Map<string, typeof Op | Function>();\n\n// Sequelize 内置\nfor (const key in Op) {\n op.set(key, Op[key]);\n const val = Utils.underscoredIf(key, true);\n op.set(val, Op[key]);\n op.set(val.replace(/_/g, ''), Op[key]);\n}\n\n// 通用\n\n// 是否为空:数据库意义的 null\nop.set('$null', (value, { fieldPath, database }) => {\n // const field = database.getFieldByPath(fieldPath);\n // console.log({field});\n return { [Op.is]: null };\n});\nop.set('$notNull', () => ({ [Op.not]: null }));\n\nop.set('$isTruly', () => ({\n [Op.eq]: true,\n}));\nop.set('$isFalsy', () => ({\n [Op.or]: [\n {\n [Op.eq]: false,\n },\n {\n [Op.is]: null,\n },\n ],\n}));\n\n// 字符串\n\n// 包含:指对应字段的值包含某个子串\nop.set('$includes', (value: string, { dialect }) => ({\n [dialect === 'postgres' ? Op.iLike : Op.like]: `%${value}%`,\n}));\n// 不包含:指对应字段的值不包含某个子串(慎用:性能问题)\nop.set('$notIncludes', (value: string, { dialect }) => ({\n [dialect === 'postgres' ? Op.notILike : Op.notLike]: `%${value}%`,\n}));\n// 以之起始\nop.set('$startsWith', (value: string, { dialect }) => ({\n [dialect === 'postgres' ? Op.iLike : Op.like]: `${value}%`,\n}));\n// 不以之起始\nop.set('$notStartsWith', (value: string, { dialect }) => ({\n [dialect === 'postgres' ? Op.notILike : Op.notLike]: `${value}%`,\n}));\n// 以之结束\nop.set('$endsWith', (value: string, { dialect }) => ({\n [dialect === 'postgres' ? Op.iLike : Op.like]: `%${value}`,\n}));\n// 不以之结束\nop.set('$notEndsWith', (value: string, { dialect }) => ({\n [dialect === 'postgres' ? Op.notILike : Op.notLike]: `%${value}`,\n}));\n\n// 仅日期\n\n// 在某日\nop.set('$dateOn', (value: string) => ({\n [Op.and]: [{ [Op.gte]: stringToDate(value) }, { [Op.lt]: getNextDay(value) }],\n}));\n// 不在某日\nop.set('$dateNotOn', (value: string) => ({\n [Op.or]: [{ [Op.lt]: stringToDate(value) }, { [Op.gte]: getNextDay(value) }],\n}));\n// 某日前\nop.set('$dateBefore', (value: string) => ({ [Op.lt]: stringToDate(value) }));\n// 某日后\nop.set('$dateAfter', (value: string) => ({ [Op.gte]: getNextDay(value) }));\n// 不早于(含当天)\nop.set('$dateNotBefore', (value: string) => ({\n [Op.gte]: stringToDate(value),\n}));\n// 不晚于(含当天)\nop.set('$dateNotAfter', (value: string) => ({ [Op.lt]: getNextDay(value) }));\n// 在期间\nop.set('$dateBetween', ([from, to]: string[]) => ({\n [Op.and]: [{ [Op.gte]: stringToDate(from) }, { [Op.lt]: getNextDay(to) }],\n}));\n// 不在期间\nop.set('$dateNotBetween', ([from, to]: string[]) => ({\n [Op.or]: [{ [Op.lt]: stringToDate(from) }, { [Op.gte]: getNextDay(to) }],\n}));\n\n// 多选(JSON)类型\n\n// 包含组中任意值(命名来源:`Array.prototype.some`)\nop.set('$anyOf', (values: any[], options) => {\n if (!values) {\n return Sequelize.literal('');\n }\n values = Array.isArray(values) ? values : [values];\n if (values.length === 0) {\n return Sequelize.literal('');\n }\n const { field, fieldPath } = options;\n const column = fieldPath\n .split('.')\n .map((name) => `\"${name}\"`)\n .join('.');\n const sql = values\n .map((value) => `(${column})::jsonb @> '${JSON.stringify(value)}'`)\n .join(' OR ');\n return Sequelize.literal(sql);\n});\n// 包含组中所有值\nop.set('$allOf', (values: any) => ({ [Op.contains]: toArray(values) }));\n// TODO(bug): 不包含组中任意值\nop.set('$noneOf', (values: any[], options) => {\n if (!values) {\n return Sequelize.literal('');\n }\n values = Array.isArray(values) ? values : [values];\n if (values.length === 0) {\n return Sequelize.literal('');\n }\n const { field, fieldPath } = options;\n const column = fieldPath\n .split('.')\n .map((name) => `\"${name}\"`)\n .join('.');\n const sql = values\n .map((value) => `(${column})::jsonb @> '${JSON.stringify(value)}'`)\n .join(' OR ');\n return Sequelize.literal(`not (${sql})`);\n});\n// 与组中值匹配\nop.set('$match', (values: any[], options) => {\n const array = toArray(values);\n if (values.length === 0) {\n return Sequelize.literal('');\n }\n const { field, fieldPath } = options;\n const column = fieldPath\n .split('.')\n .map((name) => `\"${name}\"`)\n .join('.');\n const sql = `(${column})::jsonb @> '${JSON.stringify(\n array,\n )}' AND (${column})::jsonb <@ '${JSON.stringify(array)}'`;\n return Sequelize.literal(sql);\n});\nop.set('$notMatch', (values: any[], options) => {\n const array = toArray(values);\n if (values.length === 0) {\n return Sequelize.literal('');\n }\n const { field, fieldPath } = options;\n const column = fieldPath\n .split('.')\n .map((name) => `\"${name}\"`)\n .join('.');\n const sql = `(${column})::jsonb @> '${JSON.stringify(\n array,\n )}' AND (${column})::jsonb <@ '${JSON.stringify(array)}'`;\n return Sequelize.literal(`not (${sql})`);\n // return Sequelize.literal(`(not (${sql})) AND ${column} IS NULL`);\n});\n\nexport default class Operator {\n public static get(key: string) {\n return op.get(key);\n }\n\n public static has(key: string) {\n return op.has(key);\n }\n\n public static register(key: string, fn: Function) {\n op.set(key, fn);\n }\n}\n"]}
package/lib/table.js CHANGED
@@ -334,7 +334,7 @@ class Table {
334
334
  this.database.emit('beforeAddField', options, this);
335
335
  const name = options.name,
336
336
  index = options.index;
337
- const field = fields_1.buildField(options, {
337
+ const field = (0, fields_1.buildField)(options, {
338
338
  sourceTable: this,
339
339
  database: this.database
340
340
  });
@@ -412,7 +412,7 @@ class Table {
412
412
 
413
413
  const _mergeOptions$arrayMe = mergeOptions.arrayMerge,
414
414
  arrayMerge = _mergeOptions$arrayMe === void 0 ? (target, source) => source : _mergeOptions$arrayMe;
415
- this.options = deepmerge_1.default(this.options, restOptions, Object.assign({
415
+ this.options = (0, deepmerge_1.default)(this.options, restOptions, Object.assign({
416
416
  arrayMerge
417
417
  }, mergeOptions));
418
418
 
package/lib/table.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["table.ts"],"names":[],"mappings":"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","file":"table.js","sourcesContent":["import {\n InitOptions,\n ModelAttributes,\n ModelOptions,\n ModelIndexesOptions,\n Utils,\n SyncOptions,\n} from 'sequelize';\nimport {\n buildField,\n FieldOptions,\n Relation,\n BELONGSTO,\n BELONGSTOMANY,\n SORT,\n} from './fields';\nimport Database from './database';\nimport { Model, ModelCtor } from './model';\nimport _ from 'lodash';\nimport merge from 'deepmerge';\n\nexport interface MergeOptions extends merge.Options {}\n\nconst registeredModels = new Map<string, any>();\n\nexport function registerModel(key: string, model: any) {\n registeredModels.set(key, model);\n}\n\nexport function registerModels(models) {\n for (const key in models) {\n if (models.hasOwnProperty(key)) {\n registerModel(key, models[key]);\n }\n }\n}\n\n// TODO: 判断如果 key 是 model 直接返回\nexport function getRegisteredModel(key) {\n if (typeof key === 'string') {\n return registeredModels.get(key);\n }\n return key;\n}\n\nexport interface TableOptions\n extends Omit<ModelOptions<Model>, 'name' | 'modelName'> {\n /**\n * 唯一标识,与 ModelOptions 的 name 有区别\n *\n * 注意:name 可用于初始化 tableName、modelName,但是 tableName 和 modelName 可能有所不同\n * name 主要用于获取指定的 tables 和 models\n * 如果没有特殊指定 tableName 时,name、tableName、modelName 都是一个值\n *\n * TODO: name, tableName, modelName,freezeTableName,underscored,单复数等等情况还比较混乱\n */\n name: string;\n\n /**\n * 自定义 model\n */\n model?: ModelCtor<Model> | string;\n\n /**\n * 字段配置\n */\n fields?: Array<FieldOptions>;\n\n /**\n * 其他的一些情况\n */\n [key: string]: any;\n}\n\n/**\n * 上下文,Tabel 配置需要的其他变量\n */\nexport interface TableContext {\n database: Database;\n}\n\n/**\n * 是否重新初始化 Model。配置更新时,需要重新初始化 model。\n *\n * - reinitialize = false 只执行 Model.init\n * - reinitialize = true 重新初始化 Model 并执行 Model.init 和 Model.associate\n * - reinitialize = modelOnly 只初始化 Model 并执行 Model.init\n */\nexport type Reinitialize = boolean | 'modelOnly';\n\n/**\n * 表配置\n *\n * 用于处理相关 Model 的配置\n */\nexport class Table {\n protected database: Database;\n\n protected options: TableOptions;\n\n protected fields = new Map<string, any>();\n\n protected modelAttributes: ModelAttributes;\n\n protected modelOptions: InitOptions;\n\n /**\n * 全部关系字段的配置\n */\n protected associations = new Map<string, Relation>();\n\n /**\n * 待建立关系的 association\n */\n protected associating = new Map<string, Relation>();\n\n /**\n * 索引\n */\n protected indexes = new Map<string, any>();\n\n protected Model: ModelCtor<Model>;\n\n protected defaultModel: ModelCtor<Model>;\n\n /**\n * 是否是中间表\n */\n public isThroughTable: boolean = false;\n\n public relationTables = new Set<string>();\n\n get sortable(): boolean {\n return Array.from(this.fields.values()).some(\n (field) => field instanceof SORT,\n );\n }\n\n constructor(options: TableOptions, context: TableContext) {\n const { database } = context;\n database.runHooks('beforeTableInit', options);\n database.emit('beforeTableInit', options);\n const { model, fields = [], indexes = [], sortable } = options;\n this.options = options;\n this.database = database;\n // 初始化的时候获取\n this.defaultModel = getRegisteredModel(model);\n this.modelAttributes = {};\n // 在 set fields 之前 model init 的原因是因为关系字段可能需要用到 model 的相关配置\n // @ts-ignore\n this.addIndexes(indexes, 'modelOnly');\n // this.modelInit('modelOnly');\n this.setFields(fields);\n this.initSortable();\n database.emit('afterTableInit', this);\n database.runHooks('afterTableInit', this);\n }\n\n public initSortable() {\n const { sortable } = this.options;\n if (!sortable) {\n return;\n }\n if (typeof sortable === 'string') {\n this.addField({\n type: 'sort',\n name: sortable,\n });\n } else if (typeof sortable === 'object') {\n this.addField({\n ...sortable,\n type: 'sort',\n });\n }\n }\n\n public modelInit(reinitialize: Reinitialize = false) {\n if (reinitialize || !this.Model) {\n let DefaultModel = this.defaultModel;\n this.Model = DefaultModel\n ? class extends DefaultModel {}\n : class extends Model {};\n this.Model.database = this.database;\n // 关系的建立是在 model.init 之后,在配置中表字段(Column)和关系(Relation)都在 fields,\n // 所以需要单独提炼出 associations 字段,并在 Model.init 之后执行 Model.associate\n // @ts-ignore\n this.Model.associate = (models: { [key: string]: ModelCtor<Model> }) => {\n for (const [key, association] of this.associating) {\n const { type, target } = association.getAssociationArguments();\n if (this.database.isDefined(target)) {\n const TargetModel = this.database.getModel(target);\n // 如果关系表在之后才定义,未设置 targetKey 时,targetKey 默认值需要在 target model 初始化之后才能取到\n if (\n association instanceof BELONGSTO ||\n association instanceof BELONGSTOMANY\n ) {\n association.updateOptionsAfterTargetModelBeDefined();\n }\n this.Model[type](TargetModel, association.getAssociationOptions());\n // 建立关系之后,需要删除待处理的 associating,避免重复和提高效率\n this.associating.delete(key);\n }\n }\n };\n }\n\n this.Model.init(this.getModelAttributes(), this.getModelOptions());\n\n if (reinitialize === true) {\n this.associating = new Map(this.associations);\n // 需要额外处理 associating 的情况\n // 建立表关系需要遍历多个 Model,所以在这里需要标记哪些已定义的 Model 需要建立表关系\n if (this.associating.size > 0) {\n this.database.associating.add(this.options.name);\n } else {\n this.database.associating.delete(this.options.name);\n }\n this.database.associate();\n }\n }\n\n public getName(): string {\n return this.options.name;\n }\n\n public getTableName(): string {\n return this.options.name;\n }\n\n /**\n *\n * @param key 获取数据表配置,也可以指定 key\n */\n public getOptions(key?: any): TableOptions {\n return key ? _.get(this.options, key) : this.options;\n }\n\n public getModel(): ModelCtor<Model> {\n return this.database.getModel(this.getName());\n }\n\n public getModelAttributes(): ModelAttributes {\n return this.modelAttributes;\n }\n\n public getModelOptions(): InitOptions {\n const { name, underscored = true, ...restOptions } = this.options;\n const hooks =\n _.get(this.getModel(), 'options.hooks') || this.options.hooks || {};\n return {\n underscored,\n modelName: name,\n tableName: name,\n sequelize: this.database.sequelize,\n createdAt: Utils.underscoredIf('createdAt', underscored),\n updatedAt: Utils.underscoredIf('updatedAt', underscored),\n indexes: Array.from(this.indexes.values()),\n // freezeTableName: true,\n ..._.omit(restOptions, ['model', 'fields', 'indexes']),\n hooks,\n };\n }\n\n /**\n * 获取相关 table names,一般用于 sync\n */\n public getRelatedTableNames(): Set<string> {\n const names = new Set<string>();\n this.options.name && names.add(this.options.name);\n for (const association of this.associations.values()) {\n const target = association.getTarget();\n target && names.add(target);\n if (association instanceof BELONGSTOMANY) {\n const throughName = association.getThroughName();\n throughName && names.add(throughName);\n }\n }\n return names;\n }\n\n public getAssociations() {\n return this.associations;\n }\n\n public getFields() {\n return this.fields;\n }\n\n public setFields(fields: Array<FieldOptions>) {\n this.fields.clear();\n this.associating.clear();\n this.associations.clear();\n\n for (const filed of fields) {\n this.addField(filed, false);\n }\n\n this.modelInit(true);\n }\n\n public hasField(name: string) {\n return this.fields.has(name);\n }\n\n public getField(name: string) {\n return this.fields.get(name);\n }\n\n /**\n * 添加字段\n *\n * @param options\n * @param reinitialize\n */\n public addField(options: FieldOptions, reinitialize: Reinitialize = true) {\n this.database.runHooks('beforeAddField', options, this);\n this.database.emit('beforeAddField', options, this);\n const { name, index } = options;\n const field = buildField(options, {\n sourceTable: this,\n database: this.database,\n });\n // 添加字段后 table.options 中的 fields 并不会更新,这导致 table.getOptions() 拿不到最新的字段配置\n // 所以在同时更新 table.options.fields 数组\n if (!this.options.fields) {\n this.options.fields = [];\n }\n const existIndex = this.options.fields.findIndex(\n (field) => field.name === name,\n );\n if (existIndex !== -1) {\n this.options.fields.splice(existIndex, 1, options);\n } else {\n this.options.fields.push(options);\n }\n\n this.fields.set(name, field);\n\n if (field instanceof Relation) {\n // 关系字段先放到 associating 里待处理,等相关 target model 初始化之后,再通过 associate 建立关系\n this.associating.set(name, field);\n this.associations.set(name, field);\n } else {\n if (index === true) {\n this.addIndex(name, false);\n } else if (typeof index === 'object') {\n this.addIndex(\n {\n fields: [name],\n ...index,\n },\n false,\n );\n }\n this.modelAttributes[name] = field.getAttributeOptions();\n }\n this.modelInit(reinitialize);\n this.database.emit('afterAddField', field, this);\n this.database.runHooks('afterAddField', field, this);\n return field;\n }\n\n /**\n * 添加索引\n *\n * @param indexOptions\n * @param reinitialize\n */\n public addIndex(\n indexOptions: string | ModelIndexesOptions,\n reinitialize: Reinitialize = true,\n ) {\n const options =\n typeof indexOptions === 'string'\n ? {\n fields: [indexOptions],\n }\n : indexOptions;\n // @ts-ignore\n const index = Utils.nameIndex(options, this.options.name);\n console.log(this.options, { index, options });\n this.indexes.set(index.name, {\n type: '',\n parser: null,\n ...index,\n });\n this.modelInit(reinitialize);\n }\n\n /**\n * 批量添加索引\n *\n * @param indexes\n * @param reinitialize\n */\n public addIndexes(\n indexes: Array<string | ModelIndexesOptions>,\n reinitialize: Reinitialize = true,\n ) {\n for (const index in indexes) {\n this.addIndex(indexes[index], false);\n }\n this.modelInit(reinitialize);\n }\n\n /**\n * 扩展(实验性 API)\n *\n * @param options\n */\n public extend(options: TableOptions, mergeOptions: MergeOptions = {}) {\n const { fields = [], indexes = [], model, ...restOptions } = options;\n if (model) {\n this.defaultModel = getRegisteredModel(model);\n }\n const { arrayMerge = (target: any[], source: any[]) => source } =\n mergeOptions;\n this.options = merge(this.options, restOptions, {\n arrayMerge,\n ...mergeOptions,\n });\n for (const key in fields) {\n this.addField(fields[key], false);\n }\n this.initSortable();\n // @ts-ignore\n this.addIndexes(indexes, false);\n this.modelInit(true);\n }\n\n /**\n * 相关表字段更新\n *\n * @param options\n */\n public async sync(options: SyncOptions = {}) {\n const tables = [];\n for (const name of this.getRelatedTableNames()) {\n tables.push(name);\n }\n return this.database.sync({\n ...options,\n tables,\n });\n }\n}\n\nexport default Table;\n"]}
1
+ {"version":3,"sources":["table.ts"],"names":[],"mappings":"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","file":"table.js","sourcesContent":["import {\n InitOptions,\n ModelAttributes,\n ModelOptions,\n ModelIndexesOptions,\n Utils,\n SyncOptions,\n} from 'sequelize';\nimport {\n buildField,\n FieldOptions,\n Relation,\n BELONGSTO,\n BELONGSTOMANY,\n SORT,\n} from './fields';\nimport Database from './database';\nimport { Model, ModelCtor } from './model';\nimport _ from 'lodash';\nimport merge from 'deepmerge';\n\nexport interface MergeOptions extends merge.Options {}\n\nconst registeredModels = new Map<string, any>();\n\nexport function registerModel(key: string, model: any) {\n registeredModels.set(key, model);\n}\n\nexport function registerModels(models) {\n for (const key in models) {\n if (models.hasOwnProperty(key)) {\n registerModel(key, models[key]);\n }\n }\n}\n\n// TODO: 判断如果 key 是 model 直接返回\nexport function getRegisteredModel(key) {\n if (typeof key === 'string') {\n return registeredModels.get(key);\n }\n return key;\n}\n\nexport interface TableOptions\n extends Omit<ModelOptions<Model>, 'name' | 'modelName'> {\n /**\n * 唯一标识,与 ModelOptions 的 name 有区别\n *\n * 注意:name 可用于初始化 tableName、modelName,但是 tableName 和 modelName 可能有所不同\n * name 主要用于获取指定的 tables 和 models\n * 如果没有特殊指定 tableName 时,name、tableName、modelName 都是一个值\n *\n * TODO: name, tableName, modelName,freezeTableName,underscored,单复数等等情况还比较混乱\n */\n name: string;\n\n /**\n * 自定义 model\n */\n model?: ModelCtor<Model> | string;\n\n /**\n * 字段配置\n */\n fields?: Array<FieldOptions>;\n\n /**\n * 其他的一些情况\n */\n [key: string]: any;\n}\n\n/**\n * 上下文,Tabel 配置需要的其他变量\n */\nexport interface TableContext {\n database: Database;\n}\n\n/**\n * 是否重新初始化 Model。配置更新时,需要重新初始化 model。\n *\n * - reinitialize = false 只执行 Model.init\n * - reinitialize = true 重新初始化 Model 并执行 Model.init 和 Model.associate\n * - reinitialize = modelOnly 只初始化 Model 并执行 Model.init\n */\nexport type Reinitialize = boolean | 'modelOnly';\n\n/**\n * 表配置\n *\n * 用于处理相关 Model 的配置\n */\nexport class Table {\n protected database: Database;\n\n protected options: TableOptions;\n\n protected fields = new Map<string, any>();\n\n protected modelAttributes: ModelAttributes;\n\n protected modelOptions: InitOptions;\n\n /**\n * 全部关系字段的配置\n */\n protected associations = new Map<string, Relation>();\n\n /**\n * 待建立关系的 association\n */\n protected associating = new Map<string, Relation>();\n\n /**\n * 索引\n */\n protected indexes = new Map<string, any>();\n\n protected Model: ModelCtor<Model>;\n\n protected defaultModel: ModelCtor<Model>;\n\n /**\n * 是否是中间表\n */\n public isThroughTable: boolean = false;\n\n public relationTables = new Set<string>();\n\n get sortable(): boolean {\n return Array.from(this.fields.values()).some(\n (field) => field instanceof SORT,\n );\n }\n\n constructor(options: TableOptions, context: TableContext) {\n const { database } = context;\n database.runHooks('beforeTableInit', options);\n database.emit('beforeTableInit', options);\n const { model, fields = [], indexes = [], sortable } = options;\n this.options = options;\n this.database = database;\n // 初始化的时候获取\n this.defaultModel = getRegisteredModel(model);\n this.modelAttributes = {};\n // 在 set fields 之前 model init 的原因是因为关系字段可能需要用到 model 的相关配置\n // @ts-ignore\n this.addIndexes(indexes, 'modelOnly');\n // this.modelInit('modelOnly');\n this.setFields(fields);\n this.initSortable();\n database.emit('afterTableInit', this);\n database.runHooks('afterTableInit', this);\n }\n\n public initSortable() {\n const { sortable } = this.options;\n if (!sortable) {\n return;\n }\n if (typeof sortable === 'string') {\n this.addField({\n type: 'sort',\n name: sortable,\n });\n } else if (typeof sortable === 'object') {\n this.addField({\n ...sortable,\n type: 'sort',\n });\n }\n }\n\n public modelInit(reinitialize: Reinitialize = false) {\n if (reinitialize || !this.Model) {\n let DefaultModel = this.defaultModel;\n this.Model = DefaultModel\n ? class extends DefaultModel {}\n : class extends Model {};\n this.Model.database = this.database;\n // 关系的建立是在 model.init 之后,在配置中表字段(Column)和关系(Relation)都在 fields,\n // 所以需要单独提炼出 associations 字段,并在 Model.init 之后执行 Model.associate\n // @ts-ignore\n this.Model.associate = (models: { [key: string]: ModelCtor<Model> }) => {\n for (const [key, association] of this.associating) {\n const { type, target } = association.getAssociationArguments();\n if (this.database.isDefined(target)) {\n const TargetModel = this.database.getModel(target);\n // 如果关系表在之后才定义,未设置 targetKey 时,targetKey 默认值需要在 target model 初始化之后才能取到\n if (\n association instanceof BELONGSTO ||\n association instanceof BELONGSTOMANY\n ) {\n association.updateOptionsAfterTargetModelBeDefined();\n }\n this.Model[type](TargetModel, association.getAssociationOptions());\n // 建立关系之后,需要删除待处理的 associating,避免重复和提高效率\n this.associating.delete(key);\n }\n }\n };\n }\n\n this.Model.init(this.getModelAttributes(), this.getModelOptions());\n\n if (reinitialize === true) {\n this.associating = new Map(this.associations);\n // 需要额外处理 associating 的情况\n // 建立表关系需要遍历多个 Model,所以在这里需要标记哪些已定义的 Model 需要建立表关系\n if (this.associating.size > 0) {\n this.database.associating.add(this.options.name);\n } else {\n this.database.associating.delete(this.options.name);\n }\n this.database.associate();\n }\n }\n\n public getName(): string {\n return this.options.name;\n }\n\n public getTableName(): string {\n return this.options.name;\n }\n\n /**\n *\n * @param key 获取数据表配置,也可以指定 key\n */\n public getOptions(key?: any): TableOptions {\n return key ? _.get(this.options, key) : this.options;\n }\n\n public getModel(): ModelCtor<Model> {\n return this.database.getModel(this.getName());\n }\n\n public getModelAttributes(): ModelAttributes {\n return this.modelAttributes;\n }\n\n public getModelOptions(): InitOptions {\n const { name, underscored = true, ...restOptions } = this.options;\n const hooks =\n _.get(this.getModel(), 'options.hooks') || this.options.hooks || {};\n return {\n underscored,\n modelName: name,\n tableName: name,\n sequelize: this.database.sequelize,\n createdAt: Utils.underscoredIf('createdAt', underscored),\n updatedAt: Utils.underscoredIf('updatedAt', underscored),\n indexes: Array.from(this.indexes.values()),\n // freezeTableName: true,\n ..._.omit(restOptions, ['model', 'fields', 'indexes']),\n hooks,\n };\n }\n\n /**\n * 获取相关 table names,一般用于 sync\n */\n public getRelatedTableNames(): Set<string> {\n const names = new Set<string>();\n this.options.name && names.add(this.options.name);\n for (const association of this.associations.values()) {\n const target = association.getTarget();\n target && names.add(target);\n if (association instanceof BELONGSTOMANY) {\n const throughName = association.getThroughName();\n throughName && names.add(throughName);\n }\n }\n return names;\n }\n\n public getAssociations() {\n return this.associations;\n }\n\n public getFields() {\n return this.fields;\n }\n\n public setFields(fields: Array<FieldOptions>) {\n this.fields.clear();\n this.associating.clear();\n this.associations.clear();\n\n for (const filed of fields) {\n this.addField(filed, false);\n }\n\n this.modelInit(true);\n }\n\n public hasField(name: string) {\n return this.fields.has(name);\n }\n\n public getField(name: string) {\n return this.fields.get(name);\n }\n\n /**\n * 添加字段\n *\n * @param options\n * @param reinitialize\n */\n public addField(options: FieldOptions, reinitialize: Reinitialize = true) {\n this.database.runHooks('beforeAddField', options, this);\n this.database.emit('beforeAddField', options, this);\n const { name, index } = options;\n const field = buildField(options, {\n sourceTable: this,\n database: this.database,\n });\n // 添加字段后 table.options 中的 fields 并不会更新,这导致 table.getOptions() 拿不到最新的字段配置\n // 所以在同时更新 table.options.fields 数组\n if (!this.options.fields) {\n this.options.fields = [];\n }\n const existIndex = this.options.fields.findIndex(\n (field) => field.name === name,\n );\n if (existIndex !== -1) {\n this.options.fields.splice(existIndex, 1, options);\n } else {\n this.options.fields.push(options);\n }\n\n this.fields.set(name, field);\n\n if (field instanceof Relation) {\n // 关系字段先放到 associating 里待处理,等相关 target model 初始化之后,再通过 associate 建立关系\n this.associating.set(name, field);\n this.associations.set(name, field);\n } else {\n if (index === true) {\n this.addIndex(name, false);\n } else if (typeof index === 'object') {\n this.addIndex(\n {\n fields: [name],\n ...index,\n },\n false,\n );\n }\n this.modelAttributes[name] = field.getAttributeOptions();\n }\n this.modelInit(reinitialize);\n this.database.emit('afterAddField', field, this);\n this.database.runHooks('afterAddField', field, this);\n return field;\n }\n\n /**\n * 添加索引\n *\n * @param indexOptions\n * @param reinitialize\n */\n public addIndex(\n indexOptions: string | ModelIndexesOptions,\n reinitialize: Reinitialize = true,\n ) {\n const options =\n typeof indexOptions === 'string'\n ? {\n fields: [indexOptions],\n }\n : indexOptions;\n // @ts-ignore\n const index = Utils.nameIndex(options, this.options.name);\n console.log(this.options, { index, options });\n this.indexes.set(index.name, {\n type: '',\n parser: null,\n ...index,\n });\n this.modelInit(reinitialize);\n }\n\n /**\n * 批量添加索引\n *\n * @param indexes\n * @param reinitialize\n */\n public addIndexes(\n indexes: Array<string | ModelIndexesOptions>,\n reinitialize: Reinitialize = true,\n ) {\n for (const index in indexes) {\n this.addIndex(indexes[index], false);\n }\n this.modelInit(reinitialize);\n }\n\n /**\n * 扩展(实验性 API)\n *\n * @param options\n */\n public extend(options: TableOptions, mergeOptions: MergeOptions = {}) {\n const { fields = [], indexes = [], model, ...restOptions } = options;\n if (model) {\n this.defaultModel = getRegisteredModel(model);\n }\n const { arrayMerge = (target: any[], source: any[]) => source } =\n mergeOptions;\n this.options = merge(this.options, restOptions, {\n arrayMerge,\n ...mergeOptions,\n });\n for (const key in fields) {\n this.addField(fields[key], false);\n }\n this.initSortable();\n // @ts-ignore\n this.addIndexes(indexes, false);\n this.modelInit(true);\n }\n\n /**\n * 相关表字段更新\n *\n * @param options\n */\n public async sync(options: SyncOptions = {}) {\n const tables = [];\n for (const name of this.getRelatedTableNames()) {\n tables.push(name);\n }\n return this.database.sync({\n ...options,\n tables,\n });\n }\n}\n\nexport default Table;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nocobase/database",
3
- "version": "0.5.0-alpha.30",
3
+ "version": "0.5.0-alpha.34",
4
4
  "description": "",
5
5
  "main": "./lib/index.js",
6
6
  "types": "./lib/index.d.ts",
@@ -17,5 +17,5 @@
17
17
  "url": "git+https://github.com/nocobase/nocobase.git",
18
18
  "directory": "packages/database"
19
19
  },
20
- "gitHead": "829f969668edbf1ad6f325bf194ebfb6c6ed0fc6"
20
+ "gitHead": "11cded6153bab633fb0b7415c33b4c3c369c2427"
21
21
  }