From fd14937eb2674b4fe648bb94928453a543b59f2b Mon Sep 17 00:00:00 2001 From: kukoo Date: Wed, 16 Aug 2017 00:18:05 +0700 Subject: [PATCH 1/6] new definition --- lib/interfaces/ISequelizeDbNameConfig.ts | 36 ++++++++++++++++++++++++ lib/interfaces/ISequelizeUriConfig.ts | 31 ++++++++++++++++++++ lib/types/SequelizeConfig.ts | 0 3 files changed, 67 insertions(+) create mode 100644 lib/interfaces/ISequelizeDbNameConfig.ts create mode 100644 lib/interfaces/ISequelizeUriConfig.ts create mode 100644 lib/types/SequelizeConfig.ts diff --git a/lib/interfaces/ISequelizeDbNameConfig.ts b/lib/interfaces/ISequelizeDbNameConfig.ts new file mode 100644 index 00000000..263f8881 --- /dev/null +++ b/lib/interfaces/ISequelizeDbNameConfig.ts @@ -0,0 +1,36 @@ +import {Options} from 'sequelize'; + +/** + * This class is for deprecated "name" property. + * For cPlease + */ +export interface ISequelizeDbNameConfig extends Options { + + /** + * Name of database + * @TODO: name is deprecated. Use database instead. + */ + name: string; + + /** + * Username of database + */ + username: string; + + /** + * Password for database user + */ + password: string; + + /** + * Path to models, which should be loaded + */ + modelPaths?: string[]; + + /** + * Makes it possible to use sequelize for validation only + * if set to true. For this configuration it is always false. + * See ISequelizeValidationOnlyConfig interface + */ + validateOnly?: false; +} diff --git a/lib/interfaces/ISequelizeUriConfig.ts b/lib/interfaces/ISequelizeUriConfig.ts new file mode 100644 index 00000000..7fde370e --- /dev/null +++ b/lib/interfaces/ISequelizeUriConfig.ts @@ -0,0 +1,31 @@ +import {Options} from 'sequelize'; + +export interface ISequelizeConfig extends Options { + + /** + * Name of database + */ + name: string; + + /** + * Username of database + */ + username: string; + + /** + * Password for database user + */ + password: string; + + /** + * Path to models, which should be loaded + */ + modelPaths?: string[]; + + /** + * Makes it possible to use sequelize for validation only + * if set to true. For this configuration it is always false. + * See ISequelizeValidationOnlyConfig interface + */ + validateOnly?: false; +} diff --git a/lib/types/SequelizeConfig.ts b/lib/types/SequelizeConfig.ts new file mode 100644 index 00000000..e69de29b From d285136461be6b98ec954866650ea11baed45014 Mon Sep 17 00:00:00 2001 From: kukoo Date: Wed, 16 Aug 2017 00:19:11 +0700 Subject: [PATCH 2/6] add new sequelize definition --- lib/interfaces/ISequelizeConfig.ts | 2 +- lib/interfaces/ISequelizeDbNameConfig.ts | 2 +- lib/interfaces/ISequelizeUriConfig.ts | 16 ++-------- lib/models/BaseSequelize.ts | 33 ++++++++++++++++--- lib/models/Sequelize.d.ts | 6 ++-- lib/models/v4/Sequelize.ts | 40 +++++++++++++----------- lib/types/SequelizeConfig.ts | 5 +++ test/specs/models/sequelize.spec.ts | 20 +++++++++++- test/utils/sequelize.ts | 19 ++++++++++- 9 files changed, 99 insertions(+), 44 deletions(-) diff --git a/lib/interfaces/ISequelizeConfig.ts b/lib/interfaces/ISequelizeConfig.ts index 7fde370e..ca5e7637 100644 --- a/lib/interfaces/ISequelizeConfig.ts +++ b/lib/interfaces/ISequelizeConfig.ts @@ -5,7 +5,7 @@ export interface ISequelizeConfig extends Options { /** * Name of database */ - name: string; + database: string; /** * Username of database diff --git a/lib/interfaces/ISequelizeDbNameConfig.ts b/lib/interfaces/ISequelizeDbNameConfig.ts index 263f8881..57e3898d 100644 --- a/lib/interfaces/ISequelizeDbNameConfig.ts +++ b/lib/interfaces/ISequelizeDbNameConfig.ts @@ -2,7 +2,7 @@ import {Options} from 'sequelize'; /** * This class is for deprecated "name" property. - * For cPlease + * For congruence to Sequelize config, use "database" instead. */ export interface ISequelizeDbNameConfig extends Options { diff --git a/lib/interfaces/ISequelizeUriConfig.ts b/lib/interfaces/ISequelizeUriConfig.ts index 7fde370e..159f0dc3 100644 --- a/lib/interfaces/ISequelizeUriConfig.ts +++ b/lib/interfaces/ISequelizeUriConfig.ts @@ -1,21 +1,11 @@ import {Options} from 'sequelize'; -export interface ISequelizeConfig extends Options { +export interface ISequelizeUriConfig extends Options { /** - * Name of database + * Uri connection string to database */ - name: string; - - /** - * Username of database - */ - username: string; - - /** - * Password for database user - */ - password: string; + uri: string; /** * Path to models, which should be loaded diff --git a/lib/models/BaseSequelize.ts b/lib/models/BaseSequelize.ts index 5e68fdbd..04e45419 100644 --- a/lib/models/BaseSequelize.ts +++ b/lib/models/BaseSequelize.ts @@ -2,6 +2,9 @@ import {Model} from "./Model"; import {DEFAULT_DEFINE_OPTIONS, getModels} from "../services/models"; import {getAssociations, processAssociation} from "../services/association"; import {ISequelizeConfig} from "../interfaces/ISequelizeConfig"; +import {ISequelizeUriConfig} from "../interfaces/ISequelizeUriConfig"; +import {ISequelizeDbNameConfig} from "../interfaces/ISequelizeDbNameConfig"; +import {SequelizeConfig} from "../types/SequelizeConfig"; import {resolveScopes} from "../services/scopes"; import {ISequelizeValidationOnlyConfig} from "../interfaces/ISequelizeValidationOnlyConfig"; import {extend} from "../utils/object"; @@ -19,6 +22,18 @@ export abstract class BaseSequelize { thoughMap: { [through: string]: any } = {}; _: { [modelName: string]: (typeof Model) } = {}; + static isISequelizeConfig(obj: any): obj is ISequelizeConfig { + return obj.hasOwnProperty("database") && obj.hasOwnProperty("username"); + } + + static isISequelizeDbNameConfig(obj: any): obj is ISequelizeDbNameConfig { + return obj.hasOwnProperty("name") && obj.hasOwnProperty("username"); + } + + static isISequelizeUriConfig(obj: any): obj is ISequelizeUriConfig { + return obj.hasOwnProperty("uri"); + } + static extend(target: any): void { extend(target, this); @@ -27,7 +42,7 @@ export abstract class BaseSequelize { /** * Prepares sequelize config passed to original sequelize constructor */ - static prepareConfig(config: ISequelizeConfig | ISequelizeValidationOnlyConfig): ISequelizeConfig { + static prepareConfig(config: SequelizeConfig | ISequelizeValidationOnlyConfig): SequelizeConfig { if (!config.define) { config.define = {}; } @@ -37,13 +52,21 @@ export abstract class BaseSequelize { return this.getValidationOnlyConfig(config); } - return {...config as ISequelizeConfig}; + + if (BaseSequelize.isISequelizeDbNameConfig(config)) { + // Sequelize uses "database" property as a database name. + // @TODO: "name" property is deprecated, use "database" instead + const database = config.name; + return {...config, database} as ISequelizeConfig; + } + + return {...config as SequelizeConfig}; } - static getValidationOnlyConfig(config: ISequelizeConfig | ISequelizeValidationOnlyConfig): ISequelizeConfig { + static getValidationOnlyConfig(config: SequelizeConfig | ISequelizeValidationOnlyConfig): ISequelizeConfig { return { ...config, - name: '_name_', + database: '_name_', username: '_username_', password: '_password_', dialect: 'sqlite', @@ -64,7 +87,7 @@ export abstract class BaseSequelize { models.forEach(model => this._[model.name] = model); } - init(config: ISequelizeConfig): void { + init(config: SequelizeConfig): void { if (config.modelPaths) this.addModels(config.modelPaths); } diff --git a/lib/models/Sequelize.d.ts b/lib/models/Sequelize.d.ts index ecd30318..c72a7c1d 100644 --- a/lib/models/Sequelize.d.ts +++ b/lib/models/Sequelize.d.ts @@ -1,15 +1,15 @@ -/// import 'reflect-metadata'; import * as SequelizeOrigin from 'sequelize'; import {Model} from "./Model"; -import {ISequelizeConfig} from "../interfaces/ISequelizeConfig"; +import {SequelizeConfig} from "../../types/SequelizeConfig"; import {ISequelizeValidationOnlyConfig} from "../interfaces/ISequelizeValidationOnlyConfig"; export declare class Sequelize extends SequelizeOrigin { _: {[modelName: string]: (typeof Model)}; - constructor(config: ISequelizeConfig | ISequelizeValidationOnlyConfig); + constructor(config: SequelizeConfig | ISequelizeValidationOnlyConfig); + constructor(uri: string); addModels(models: Array): void; addModels(modelPaths: string[]): void; diff --git a/lib/models/v4/Sequelize.ts b/lib/models/v4/Sequelize.ts index f1cd89ad..bd7f9703 100644 --- a/lib/models/v4/Sequelize.ts +++ b/lib/models/v4/Sequelize.ts @@ -1,36 +1,37 @@ import 'reflect-metadata'; import * as OriginSequelize from 'sequelize'; import {Model} from "../Model"; -import {ISequelizeConfig} from "../../interfaces/ISequelizeConfig"; +import {SequelizeConfig} from "../../types/SequelizeConfig"; import {getModelName, getAttributes, getOptions} from "../../services/models"; import {BaseSequelize} from "../BaseSequelize"; import {Table} from "../../annotations/Table"; import {ISequelizeAssociation} from "../../interfaces/ISequelizeAssociation"; -let preparedConfig; - export class Sequelize extends OriginSequelize implements BaseSequelize { - thoughMap: {[through: string]: any} = {}; - _: {[modelName: string]: typeof Model} = {}; - init: (config: ISequelizeConfig) => void; - addModels: (models: Array|string[]) => void; + thoughMap: { [through: string]: any } = {}; + _: { [modelName: string]: typeof Model } = {}; + init: (config: SequelizeConfig) => void; + addModels: (models: Array | string[]) => void; associateModels: (models: Array) => void; - constructor(config: ISequelizeConfig) { - // a spread operator would be the more reasonable approach here, - // but this is currently not possible due to a bug by ts - // https://github.com/Microsoft/TypeScript/issues/4130 - // TODO@robin probably make the constructor private and - // TODO use a static factory function instead + constructor(config: SequelizeConfig | string) { + super( - (preparedConfig = BaseSequelize.prepareConfig(config), preparedConfig.name), - preparedConfig.username, - preparedConfig.password, - preparedConfig + (typeof config === "string") ? + config : // URI string + BaseSequelize.isISequelizeUriConfig(config) ? + config.uri : // URI string from ISequelizeUriConfig + BaseSequelize.prepareConfig(config) // Config object (ISequelizeConfig) ); - this.init(config); + if (BaseSequelize.isISequelizeUriConfig(config)) { + this.options = {...this.options, ...config}; + } + + if (typeof config !== "string") { + this.init(config); + } } getThroughModel(through: string): typeof Model { @@ -43,7 +44,8 @@ export class Sequelize extends OriginSequelize implements BaseSequelize { return Through; } - adjustAssociation(model: any, association: ISequelizeAssociation): void {} + adjustAssociation(model: any, association: ISequelizeAssociation): void { + } /** * Creates sequelize models and registers these models diff --git a/lib/types/SequelizeConfig.ts b/lib/types/SequelizeConfig.ts index e69de29b..182633e8 100644 --- a/lib/types/SequelizeConfig.ts +++ b/lib/types/SequelizeConfig.ts @@ -0,0 +1,5 @@ +import {ISequelizeConfig} from "../interfaces/ISequelizeConfig"; +import {ISequelizeUriConfig} from "../interfaces/ISequelizeUriConfig"; +import {ISequelizeDbNameConfig} from "../interfaces/ISequelizeDbNameConfig"; + +export type SequelizeConfig = ISequelizeConfig | ISequelizeUriConfig | ISequelizeDbNameConfig; diff --git a/test/specs/models/sequelize.spec.ts b/test/specs/models/sequelize.spec.ts index 67eaaa0a..049ca3c4 100644 --- a/test/specs/models/sequelize.spec.ts +++ b/test/specs/models/sequelize.spec.ts @@ -1,7 +1,7 @@ /* tslint:disable:max-classes-per-file */ import {expect} from 'chai'; -import {createSequelize} from "../../utils/sequelize"; +import {createSequelize, createSequelizeUriObject, createSequelizeUriString} from "../../utils/sequelize"; import {Game} from "../../models/exports/Game"; import Gamer from "../../models/exports/gamer.model"; import {Sequelize} from "../../../lib/models/Sequelize"; @@ -20,6 +20,24 @@ describe('sequelize', () => { }); + describe('constructor using uri in options object', () => { + + const sequelizeUri = createSequelizeUriString(false); + it('should equal Sequelize class', () => { + expect(sequelizeUri.constructor).to.equal(Sequelize); + }); + + }); + + describe('constructor using uri string', () => { + + const sequelizeUri = createSequelizeUriObject(false); + it('should equal Sequelize class', () => { + expect(sequelizeUri.constructor).to.equal(Sequelize); + }); + + }); + describe('global define options', () => { const DEFINE_OPTIONS = {timestamps: true, underscoredAll: true}; diff --git a/test/utils/sequelize.ts b/test/utils/sequelize.ts index 5fc4dcfb..3c21922b 100644 --- a/test/utils/sequelize.ts +++ b/test/utils/sequelize.ts @@ -2,10 +2,11 @@ import {Sequelize} from "../../lib/models/Sequelize"; import * as OriginSequelize from "sequelize"; import {DefineOptions, Sequelize as SequelizeType} from "sequelize"; + export function createSequelize(useModelsInPath: boolean = true, define: DefineOptions = {}): Sequelize { return new Sequelize({ - name: '__', + database: '__', dialect: 'sqlite', username: 'root', password: '', @@ -16,6 +17,22 @@ export function createSequelize(useModelsInPath: boolean = true, define: DefineO }); } +export function createSequelizeUriObject(useModelsInPath: boolean = true, define: DefineOptions = {}): Sequelize { + + return new Sequelize({ + uri: 'sqlite://root@localhost/__', + dialect: 'sqlite', + define, + storage: ':memory:', + logging: !('SEQ_SILENT' in process.env), + modelPaths: useModelsInPath ? [__dirname + '/../models'] : [] + }); +} +export function createSequelizeUriString(useModelsInPath: boolean = true, define: DefineOptions = {}): Sequelize { + + return new Sequelize("sqlite://root@localhost/__"); +} + export function createSequelizeValidationOnly(useModelsInPath: boolean = true): Sequelize { return new Sequelize({ From c1f42f10fdd4cbc33f5120f6774df1978d9ef429 Mon Sep 17 00:00:00 2001 From: kukoo Date: Thu, 17 Aug 2017 21:02:39 +0700 Subject: [PATCH 3/6] update @types/sequelize to 4.0.69, downgrade @types/bluebird to 3.5.4, update new v3/Sequelize constructor --- lib/models/BaseSequelize.ts | 7 +------ lib/models/v3/Sequelize.ts | 31 ++++++++++++++++--------------- lib/models/v4/Sequelize.ts | 4 ++-- package-lock.json | 36 ++++++++++++++++++------------------ package.json | 3 ++- 5 files changed, 39 insertions(+), 42 deletions(-) diff --git a/lib/models/BaseSequelize.ts b/lib/models/BaseSequelize.ts index 04e45419..6212d24d 100644 --- a/lib/models/BaseSequelize.ts +++ b/lib/models/BaseSequelize.ts @@ -22,10 +22,6 @@ export abstract class BaseSequelize { thoughMap: { [through: string]: any } = {}; _: { [modelName: string]: (typeof Model) } = {}; - static isISequelizeConfig(obj: any): obj is ISequelizeConfig { - return obj.hasOwnProperty("database") && obj.hasOwnProperty("username"); - } - static isISequelizeDbNameConfig(obj: any): obj is ISequelizeDbNameConfig { return obj.hasOwnProperty("name") && obj.hasOwnProperty("username"); } @@ -54,8 +50,7 @@ export abstract class BaseSequelize { } if (BaseSequelize.isISequelizeDbNameConfig(config)) { - // Sequelize uses "database" property as a database name. - // @TODO: "name" property is deprecated, use "database" instead + // @TODO: deprecate "name" property, use "database" instead const database = config.name; return {...config, database} as ISequelizeConfig; } diff --git a/lib/models/v3/Sequelize.ts b/lib/models/v3/Sequelize.ts index 331f58f2..837f3193 100644 --- a/lib/models/v3/Sequelize.ts +++ b/lib/models/v3/Sequelize.ts @@ -1,15 +1,13 @@ import 'reflect-metadata'; import * as SequelizeOrigin from 'sequelize'; import {Model} from "../Model"; -import {ISequelizeConfig} from "../../interfaces/ISequelizeConfig"; +import {SequelizeConfig} from "../../types/SequelizeConfig"; import {getModelName, getAttributes, getOptions} from "../../services/models"; import {PROPERTY_LINK_TO_ORIG} from "../../services/models"; import {BaseSequelize} from "../BaseSequelize"; import {Table} from "../../annotations/Table"; import {ISequelizeAssociation} from "../../interfaces/ISequelizeAssociation"; -let preparedConfig; - export class Sequelize extends SequelizeOrigin implements BaseSequelize { // to fix "$1" called with something that's not an instance of Sequelize.Model @@ -17,24 +15,27 @@ export class Sequelize extends SequelizeOrigin implements BaseSequelize { thoughMap: { [through: string]: any } = {}; _: { [modelName: string]: typeof Model } = {}; - init: (config: ISequelizeConfig) => void; + init: (config: SequelizeConfig) => void; addModels: (models: Array | string[]) => void; associateModels: (models: Array) => void; - constructor(config: ISequelizeConfig) { - // a spread operator would be the more reasonable approach here, - // but this is currently not possible due to a bug by ts - // https://github.com/Microsoft/TypeScript/issues/4130 - // TODO@robin probably make the constructor private and - // TODO use a static factory function instead + constructor(config: SequelizeConfig | string) { + super( - (preparedConfig = BaseSequelize.prepareConfig(config), preparedConfig.name), - preparedConfig.username, - preparedConfig.password, - preparedConfig + (typeof config === "string") ? + config : // URI string + BaseSequelize.isISequelizeUriConfig(config) ? + config.uri : // URI string from ISequelizeUriConfig + BaseSequelize.prepareConfig(config) // Config object (ISequelizeConfig) ); - this.init(config); + if (BaseSequelize.isISequelizeUriConfig(config)) { + this.options = {...this.options, ...config}; + } + + if (typeof config !== "string") { + this.init(config); + } } getThroughModel(through: string): typeof Model { diff --git a/lib/models/v4/Sequelize.ts b/lib/models/v4/Sequelize.ts index bd7f9703..00054ea9 100644 --- a/lib/models/v4/Sequelize.ts +++ b/lib/models/v4/Sequelize.ts @@ -9,8 +9,8 @@ import {ISequelizeAssociation} from "../../interfaces/ISequelizeAssociation"; export class Sequelize extends OriginSequelize implements BaseSequelize { - thoughMap: { [through: string]: any } = {}; - _: { [modelName: string]: typeof Model } = {}; + thoughMap: {[through: string]: any} = {}; + _: {[modelName: string]: typeof Model} = {}; init: (config: SequelizeConfig) => void; addModels: (models: Array | string[]) => void; associateModels: (models: Array) => void; diff --git a/package-lock.json b/package-lock.json index 6017e5b1..d2f82403 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@types/bluebird": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.5.tgz", - "integrity": "sha1-PH6M9mC51g6iXHh/3SWN22q7OE0=" + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.4.tgz", + "integrity": "sha1-8SAWKwT9bVXhA0bX4ulu7UYrAs8=" }, "@types/chai": { "version": "3.4.35", @@ -68,13 +68,13 @@ "integrity": "sha1-tkd8qal+UmXyrGf56nBOrl4Or00=" }, "@types/sequelize": { - "version": "4.0.68", - "resolved": "https://registry.npmjs.org/@types/sequelize/-/sequelize-4.0.68.tgz", - "integrity": "sha512-rarqeMu6s9wbdUxGG16erywZGKrrX4fzgvckpd+88s3EqPKPjTNCyEGzStA8q4mM7avHA/LMxnwBro1+oXKfYw==", + "version": "4.0.69", + "resolved": "https://registry.npmjs.org/@types/sequelize/-/sequelize-4.0.69.tgz", + "integrity": "sha512-uOfvMCj3n25GiYk7GQtxaTCD4NcY69EB5H+TwlHkcaJ1l2Wz8rjYnfJMLpen+Jv4rpMSX5dbmcrPRIiSdYeCMg==", "requires": { - "@types/bluebird": "3.5.5", + "@types/bluebird": "3.5.4", "@types/lodash": "4.14.54", - "@types/validator": "6.2.0" + "@types/validator": "6.2.2" } }, "@types/sinon": { @@ -94,9 +94,9 @@ } }, "@types/validator": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-6.2.0.tgz", - "integrity": "sha1-AgMi/hkp9piJ62daG9tamDlLcfA=" + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-6.2.2.tgz", + "integrity": "sha512-ucoZO5gK7SJnMFrXLiMboPRnG9KwYN3PleaFc4uoEw/Ejrs8+osBs5XRDNjHfa5wFwc1jvFnn+rEe4DsRkwT8g==" }, "ansi-align": { "version": "1.1.0", @@ -837,7 +837,7 @@ "iconv-lite": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", - "integrity": "sha1-I9hlaxaq5nQqwpcy6o8DNqR4nPI=", + "integrity": "sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA==", "dev": true }, "imurmurhash": { @@ -1135,7 +1135,7 @@ "lru-cache": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", "dev": true, "requires": { "pseudomap": "1.0.2", @@ -1166,7 +1166,7 @@ "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "1.1.7" @@ -1269,7 +1269,7 @@ "readable-stream": { "version": "2.2.11", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.11.tgz", - "integrity": "sha1-B5azH412iAB/8Lk6gIjTSqF8D3I=", + "integrity": "sha512-h+8+r3MKEhkiVrwdKL8aWs1oc1VvBu33ueshOvS26RsZQ3Amhx/oO3TKe4lApSV9ueY6as8EAh7mtuFjdlhg9Q==", "dev": true, "requires": { "core-util-is": "1.0.2", @@ -1292,7 +1292,7 @@ "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { "safe-buffer": "5.1.0" @@ -1338,7 +1338,7 @@ "nyc": { "version": "11.0.2", "resolved": "https://registry.npmjs.org/nyc/-/nyc-11.0.2.tgz", - "integrity": "sha1-nlkqaXGGAoJTtmhRbDjwecOcCPM=", + "integrity": "sha512-31rRd6ME9NM17w0oPKqi51a6fzJAqYarnzQXK+iL8XaX+3H6VH0BQut7qHIgrv2mBASRic4oNi2KRgcbFODrsQ==", "dev": true, "requires": { "archy": "1.0.0", @@ -4557,7 +4557,7 @@ "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { "fs.realpath": "1.0.0", diff --git a/package.json b/package.json index 046d72d7..5d859099 100644 --- a/package.json +++ b/package.json @@ -32,10 +32,11 @@ "dependencies": { "@types/node": "6.0.41", "@types/reflect-metadata": "0.0.4", - "@types/sequelize": "4.0.68", + "@types/sequelize": "4.0.69", "es6-shim": "0.35.3" }, "devDependencies": { + "@types/bluebird": "3.5.4", "@types/chai": "3.4.35", "@types/chai-as-promised": "0.0.29", "@types/chai-datetime": "0.0.30", From 6847fbd49f0bf593c8724c49b158cc8ea94b83a8 Mon Sep 17 00:00:00 2001 From: kukoo Date: Thu, 17 Aug 2017 21:23:39 +0700 Subject: [PATCH 4/6] fix whitespace, fix SequelizeConfig import path in Sequelize.d.ts --- lib/models/Sequelize.d.ts | 2 +- lib/models/v4/Sequelize.ts | 3 +-- test/utils/sequelize.ts | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/models/Sequelize.d.ts b/lib/models/Sequelize.d.ts index c72a7c1d..285a7fad 100644 --- a/lib/models/Sequelize.d.ts +++ b/lib/models/Sequelize.d.ts @@ -1,7 +1,7 @@ import 'reflect-metadata'; import * as SequelizeOrigin from 'sequelize'; import {Model} from "./Model"; -import {SequelizeConfig} from "../../types/SequelizeConfig"; +import {SequelizeConfig} from "../types/SequelizeConfig"; import {ISequelizeValidationOnlyConfig} from "../interfaces/ISequelizeValidationOnlyConfig"; export declare class Sequelize extends SequelizeOrigin { diff --git a/lib/models/v4/Sequelize.ts b/lib/models/v4/Sequelize.ts index 00054ea9..cfa6f645 100644 --- a/lib/models/v4/Sequelize.ts +++ b/lib/models/v4/Sequelize.ts @@ -44,8 +44,7 @@ export class Sequelize extends OriginSequelize implements BaseSequelize { return Through; } - adjustAssociation(model: any, association: ISequelizeAssociation): void { - } + adjustAssociation(model: any, association: ISequelizeAssociation): void {} /** * Creates sequelize models and registers these models diff --git a/test/utils/sequelize.ts b/test/utils/sequelize.ts index 3c21922b..ef59e0f9 100644 --- a/test/utils/sequelize.ts +++ b/test/utils/sequelize.ts @@ -2,7 +2,6 @@ import {Sequelize} from "../../lib/models/Sequelize"; import * as OriginSequelize from "sequelize"; import {DefineOptions, Sequelize as SequelizeType} from "sequelize"; - export function createSequelize(useModelsInPath: boolean = true, define: DefineOptions = {}): Sequelize { return new Sequelize({ @@ -28,6 +27,7 @@ export function createSequelizeUriObject(useModelsInPath: boolean = true, define modelPaths: useModelsInPath ? [__dirname + '/../models'] : [] }); } + export function createSequelizeUriString(useModelsInPath: boolean = true, define: DefineOptions = {}): Sequelize { return new Sequelize("sqlite://root@localhost/__"); From cdd95b73daa999ebd95133bf5feb414436c4452b Mon Sep 17 00:00:00 2001 From: kukoo Date: Thu, 17 Aug 2017 23:21:42 +0700 Subject: [PATCH 5/6] improve sequelize instantiation test --- test/specs/models/sequelize.spec.ts | 62 +++++++++++++++++++++++++++-- test/utils/sequelize.ts | 17 -------- 2 files changed, 59 insertions(+), 20 deletions(-) diff --git a/test/specs/models/sequelize.spec.ts b/test/specs/models/sequelize.spec.ts index 049ca3c4..a210a21e 100644 --- a/test/specs/models/sequelize.spec.ts +++ b/test/specs/models/sequelize.spec.ts @@ -1,7 +1,7 @@ /* tslint:disable:max-classes-per-file */ import {expect} from 'chai'; -import {createSequelize, createSequelizeUriObject, createSequelizeUriString} from "../../utils/sequelize"; +import {createSequelize} from "../../utils/sequelize"; import {Game} from "../../models/exports/Game"; import Gamer from "../../models/exports/gamer.model"; import {Sequelize} from "../../../lib/models/Sequelize"; @@ -11,6 +11,14 @@ import {Table} from '../../../lib/annotations/Table'; describe('sequelize', () => { const sequelize = createSequelize(false); + const connectionUri = "sqlite://root@localhost/__"; + + function testOptionsProp(instance: Sequelize): void { + expect(instance).to.have.property('options').that.have.property('dialect').that.eqls('sqlite'); + expect(instance).to.have.property('config').that.have.property('host').that.eqls('localhost'); + expect(instance).to.have.property('config').that.have.property('database').that.eqls('__'); + expect(instance).to.have.property('config').that.have.property('username').that.eqls('root'); + } describe('constructor', () => { @@ -20,22 +28,70 @@ describe('sequelize', () => { }); + describe('constructor: using "name" property as a db name', () => { + + const db = '__'; + const sequelizeDbName = new Sequelize({ + name: db, + dialect: 'sqlite', + username: 'root', + password: '', + storage: ':memory:', + logging: !('SEQ_SILENT' in process.env) + }); + + it('should equal Sequelize class', () => { + expect(sequelizeDbName.constructor).to.equal(Sequelize); + }); + + it('should contain database property, which equal to db.', () => { + expect(sequelizeDbName) + .to.have.property('config') + .that.have.property('database') + .that.eqls(db); + }); + + }); + describe('constructor using uri in options object', () => { - const sequelizeUri = createSequelizeUriString(false); + const sequelizeUri = new Sequelize({ + uri: connectionUri, + storage: ':memory:', + logging: !('SEQ_SILENT' in process.env), + pool: {max: 8, min: 0} + }); + it('should equal Sequelize class', () => { expect(sequelizeUri.constructor).to.equal(Sequelize); }); + it('should contain valid options extracted from connection string', () => { + testOptionsProp(sequelizeUri); + }); + + it('should contain additional Sequelize options', () => { + expect(sequelizeUri) + .to.have.property('options') + .to.have.property('pool') + .that.have.property('max') + .that.eqls(8); + }); + }); describe('constructor using uri string', () => { - const sequelizeUri = createSequelizeUriObject(false); + const sequelizeUri = new Sequelize(connectionUri); + it('should equal Sequelize class', () => { expect(sequelizeUri.constructor).to.equal(Sequelize); }); + it('should contain valid options extracted from connection string', () => { + testOptionsProp(sequelizeUri); + }); + }); describe('global define options', () => { diff --git a/test/utils/sequelize.ts b/test/utils/sequelize.ts index ef59e0f9..c740ad61 100644 --- a/test/utils/sequelize.ts +++ b/test/utils/sequelize.ts @@ -16,23 +16,6 @@ export function createSequelize(useModelsInPath: boolean = true, define: DefineO }); } -export function createSequelizeUriObject(useModelsInPath: boolean = true, define: DefineOptions = {}): Sequelize { - - return new Sequelize({ - uri: 'sqlite://root@localhost/__', - dialect: 'sqlite', - define, - storage: ':memory:', - logging: !('SEQ_SILENT' in process.env), - modelPaths: useModelsInPath ? [__dirname + '/../models'] : [] - }); -} - -export function createSequelizeUriString(useModelsInPath: boolean = true, define: DefineOptions = {}): Sequelize { - - return new Sequelize("sqlite://root@localhost/__"); -} - export function createSequelizeValidationOnly(useModelsInPath: boolean = true): Sequelize { return new Sequelize({ From 1fdda44f590000171ca0a9bed602497ef8cf3a8b Mon Sep 17 00:00:00 2001 From: kukoo Date: Fri, 18 Aug 2017 02:24:50 +0700 Subject: [PATCH 6/6] edit comment: @deprecated 'name' property --- lib/interfaces/ISequelizeDbNameConfig.ts | 4 ++-- lib/models/BaseSequelize.ts | 5 ++--- package.json | 2 +- test/specs/models/sequelize.spec.ts | 2 +- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/lib/interfaces/ISequelizeDbNameConfig.ts b/lib/interfaces/ISequelizeDbNameConfig.ts index 57e3898d..eee2a218 100644 --- a/lib/interfaces/ISequelizeDbNameConfig.ts +++ b/lib/interfaces/ISequelizeDbNameConfig.ts @@ -1,14 +1,14 @@ import {Options} from 'sequelize'; /** - * This class is for deprecated "name" property. + * This class is dedicated for deprecated "name" property. * For congruence to Sequelize config, use "database" instead. */ export interface ISequelizeDbNameConfig extends Options { /** * Name of database - * @TODO: name is deprecated. Use database instead. + * @deprecated: name is deprecated. Use database instead. */ name: string; diff --git a/lib/models/BaseSequelize.ts b/lib/models/BaseSequelize.ts index 6212d24d..ee143df8 100644 --- a/lib/models/BaseSequelize.ts +++ b/lib/models/BaseSequelize.ts @@ -50,9 +50,8 @@ export abstract class BaseSequelize { } if (BaseSequelize.isISequelizeDbNameConfig(config)) { - // @TODO: deprecate "name" property, use "database" instead - const database = config.name; - return {...config, database} as ISequelizeConfig; + // @TODO: remove deprecated "name" property + return {...config, database: config.name} as ISequelizeConfig; } return {...config as SequelizeConfig}; diff --git a/package.json b/package.json index 5d859099..5b7d01ee 100644 --- a/package.json +++ b/package.json @@ -30,13 +30,13 @@ "main": "index.js", "types": "index.d.ts", "dependencies": { + "@types/bluebird": "3.5.4", "@types/node": "6.0.41", "@types/reflect-metadata": "0.0.4", "@types/sequelize": "4.0.69", "es6-shim": "0.35.3" }, "devDependencies": { - "@types/bluebird": "3.5.4", "@types/chai": "3.4.35", "@types/chai-as-promised": "0.0.29", "@types/chai-datetime": "0.0.30", diff --git a/test/specs/models/sequelize.spec.ts b/test/specs/models/sequelize.spec.ts index a210a21e..45d611fa 100644 --- a/test/specs/models/sequelize.spec.ts +++ b/test/specs/models/sequelize.spec.ts @@ -73,7 +73,7 @@ describe('sequelize', () => { it('should contain additional Sequelize options', () => { expect(sequelizeUri) .to.have.property('options') - .to.have.property('pool') + .that.have.property('pool') .that.have.property('max') .that.eqls(8); });