@nocobase/database 0.5.0-alpha.32 → 0.5.0-alpha.36
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 +1 -1
- package/lib/database.js.map +1 -1
- package/lib/fields/field-types.d.ts +55 -55
- package/lib/fields/field-types.js +9 -12
- package/lib/fields/field-types.js.map +1 -1
- package/lib/model.js +2 -2
- package/lib/model.js.map +1 -1
- package/lib/op.js +2 -2
- package/lib/op.js.map +1 -1
- package/lib/table.js +2 -2
- package/lib/table.js.map +1 -1
- package/package.json +2 -2
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)) {
|
package/lib/database.js.map
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
3
|
+
"version": "0.5.0-alpha.36",
|
|
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": "
|
|
20
|
+
"gitHead": "9998cd903bf87bf9a5d8a7616055f0cd1a007a72"
|
|
21
21
|
}
|