From 1242ba5aed750ff661fd674b1bac342c71f0822b Mon Sep 17 00:00:00 2001 From: chenos Date: Thu, 14 Jan 2021 10:35:15 +0800 Subject: [PATCH] feat: improve database.sync() --- .../database/src/__tests__/tables.test.ts | 19 +++++++++++++++++ .../database/src/__tests__/tables/demos.ts | 8 +++++++ .../src/__tests__/tables/examples.json | 8 +++++++ .../database/src/__tests__/tables/extends.ts | 12 +++++++++++ .../database/src/__tests__/tables/tests.js | 8 +++++++ .../database/src/__tests__/tables/tests2.ts | 8 +++++++ packages/database/src/database.ts | 21 ++++++++++++++++++- 7 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 packages/database/src/__tests__/tables/demos.ts create mode 100644 packages/database/src/__tests__/tables/examples.json create mode 100644 packages/database/src/__tests__/tables/extends.ts create mode 100644 packages/database/src/__tests__/tables/tests.js create mode 100644 packages/database/src/__tests__/tables/tests2.ts diff --git a/packages/database/src/__tests__/tables.test.ts b/packages/database/src/__tests__/tables.test.ts index eea9c44ca..f89c8dc1c 100644 --- a/packages/database/src/__tests__/tables.test.ts +++ b/packages/database/src/__tests__/tables.test.ts @@ -2,6 +2,7 @@ import { getDatabase } from './'; import Database from '../database'; import Table from '../table'; import Model from '../model'; +import path from 'path'; let db: Database; @@ -243,6 +244,24 @@ describe('tables', () => { }); }); + describe.only('#import()', () => { + it('import tables', () => { + const tables = db.import({ + directory: path.resolve(__dirname, './tables'), + }); + expect([...tables.keys()]).toEqual(['demos', 'examples', 'tests']); + expect(db.getTable('demos').getOptions()).toEqual({ + name: 'demos', actions: [ { name: 'create' }, { name: 'list' } ] + }); + expect(db.getTable('examples').getOptions()).toEqual({ + name: 'examples', actions: [ { name: 'create' } ] + }); + expect(db.getTable('tests').getOptions()).toEqual({ + name: 'tests', actions: [ { name: 'list' } ] + }); + }); + }); + describe('associations', () => { beforeAll(() => { }); diff --git a/packages/database/src/__tests__/tables/demos.ts b/packages/database/src/__tests__/tables/demos.ts new file mode 100644 index 000000000..a50fe55f4 --- /dev/null +++ b/packages/database/src/__tests__/tables/demos.ts @@ -0,0 +1,8 @@ +export default { + name: 'demos', + actions: [ + { + name: 'create', + }, + ], +}; diff --git a/packages/database/src/__tests__/tables/examples.json b/packages/database/src/__tests__/tables/examples.json new file mode 100644 index 000000000..99b3f963b --- /dev/null +++ b/packages/database/src/__tests__/tables/examples.json @@ -0,0 +1,8 @@ +{ + "name": "examples", + "actions": [ + { + "name": "create" + } + ] +} diff --git a/packages/database/src/__tests__/tables/extends.ts b/packages/database/src/__tests__/tables/extends.ts new file mode 100644 index 000000000..605ad36d1 --- /dev/null +++ b/packages/database/src/__tests__/tables/extends.ts @@ -0,0 +1,12 @@ +import { extend } from "../../database"; + +export default extend({ + name: 'demos', + actions: [ + { + name: 'list', + }, + ], +}, { + arrayMerge: (t, s) => t.concat(s), +}); diff --git a/packages/database/src/__tests__/tables/tests.js b/packages/database/src/__tests__/tables/tests.js new file mode 100644 index 000000000..d381c4def --- /dev/null +++ b/packages/database/src/__tests__/tables/tests.js @@ -0,0 +1,8 @@ +module.exports = { + name: 'tests', + actions: [ + { + name: 'create', + }, + ], +}; diff --git a/packages/database/src/__tests__/tables/tests2.ts b/packages/database/src/__tests__/tables/tests2.ts new file mode 100644 index 000000000..0ba0ff632 --- /dev/null +++ b/packages/database/src/__tests__/tables/tests2.ts @@ -0,0 +1,8 @@ +export default { + name: 'tests', + actions: [ + { + name: 'list', + }, + ], +}; diff --git a/packages/database/src/database.ts b/packages/database/src/database.ts index 77ef72e62..ace0c5919 100644 --- a/packages/database/src/database.ts +++ b/packages/database/src/database.ts @@ -35,6 +35,19 @@ export interface DatabaseOptions extends Options { export type HookType = 'beforeTableInit' | 'afterTableInit' | 'beforeAddField' | 'afterAddField'; +export class Extend { + tableOptions: TableOptions; + mergeOptions: MergeOptions + constructor(tableOptions: TableOptions, mergeOptions?: MergeOptions) { + this.tableOptions = tableOptions; + this.mergeOptions = mergeOptions; + } +} + +export function extend(tableOptions: TableOptions, mergeOptions: MergeOptions = {}) { + return new Extend(tableOptions, mergeOptions); +} + export default class Database { public readonly sequelize: Sequelize; @@ -80,7 +93,13 @@ export default class Database { const tables = new Map(); files.forEach((file: string) => { const result = requireModule(file); - this.extend(typeof result === 'function' ? result(this) : result); + if (result instanceof Extend) { + const table = this.extend(result.tableOptions, result.mergeOptions); + tables.set(table.getName(), table); + } else { + const table = this.extend(typeof result === 'function' ? result(this) : result); + tables.set(table.getName(), table); + } }); return tables; }