Skip to content

Commit 0cfcdd7

Browse files
Merge pull request #79 from kukoo1/feature-uri-connection-string
connect using URI connection string support
2 parents 3fba794 + 1fdda44 commit 0cfcdd7

12 files changed

+216
-60
lines changed

lib/interfaces/ISequelizeConfig.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ export interface ISequelizeConfig extends Options {
55
/**
66
* Name of database
77
*/
8-
name: string;
8+
database: string;
99

1010
/**
1111
* Username of database
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import {Options} from 'sequelize';
2+
3+
/**
4+
* This class is dedicated for deprecated "name" property.
5+
* For congruence to Sequelize config, use "database" instead.
6+
*/
7+
export interface ISequelizeDbNameConfig extends Options {
8+
9+
/**
10+
* Name of database
11+
* @deprecated: name is deprecated. Use database instead.
12+
*/
13+
name: string;
14+
15+
/**
16+
* Username of database
17+
*/
18+
username: string;
19+
20+
/**
21+
* Password for database user
22+
*/
23+
password: string;
24+
25+
/**
26+
* Path to models, which should be loaded
27+
*/
28+
modelPaths?: string[];
29+
30+
/**
31+
* Makes it possible to use sequelize for validation only
32+
* if set to true. For this configuration it is always false.
33+
* See ISequelizeValidationOnlyConfig interface
34+
*/
35+
validateOnly?: false;
36+
}

lib/interfaces/ISequelizeUriConfig.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import {Options} from 'sequelize';
2+
3+
export interface ISequelizeUriConfig extends Options {
4+
5+
/**
6+
* Uri connection string to database
7+
*/
8+
uri: string;
9+
10+
/**
11+
* Path to models, which should be loaded
12+
*/
13+
modelPaths?: string[];
14+
15+
/**
16+
* Makes it possible to use sequelize for validation only
17+
* if set to true. For this configuration it is always false.
18+
* See ISequelizeValidationOnlyConfig interface
19+
*/
20+
validateOnly?: false;
21+
}

lib/models/BaseSequelize.ts

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ import {Model} from "./Model";
22
import {DEFAULT_DEFINE_OPTIONS, getModels} from "../services/models";
33
import {getAssociations, processAssociation} from "../services/association";
44
import {ISequelizeConfig} from "../interfaces/ISequelizeConfig";
5+
import {ISequelizeUriConfig} from "../interfaces/ISequelizeUriConfig";
6+
import {ISequelizeDbNameConfig} from "../interfaces/ISequelizeDbNameConfig";
7+
import {SequelizeConfig} from "../types/SequelizeConfig";
58
import {resolveScopes} from "../services/scopes";
69
import {installHooks} from "../services/hooks";
710
import {ISequelizeValidationOnlyConfig} from "../interfaces/ISequelizeValidationOnlyConfig";
@@ -20,6 +23,14 @@ export abstract class BaseSequelize {
2023
throughMap: { [through: string]: any } = {};
2124
_: { [modelName: string]: (typeof Model) } = {};
2225

26+
static isISequelizeDbNameConfig(obj: any): obj is ISequelizeDbNameConfig {
27+
return obj.hasOwnProperty("name") && obj.hasOwnProperty("username");
28+
}
29+
30+
static isISequelizeUriConfig(obj: any): obj is ISequelizeUriConfig {
31+
return obj.hasOwnProperty("uri");
32+
}
33+
2334
static extend(target: any): void {
2435

2536
extend(target, this);
@@ -28,7 +39,7 @@ export abstract class BaseSequelize {
2839
/**
2940
* Prepares sequelize config passed to original sequelize constructor
3041
*/
31-
static prepareConfig(config: ISequelizeConfig | ISequelizeValidationOnlyConfig): ISequelizeConfig {
42+
static prepareConfig(config: SequelizeConfig | ISequelizeValidationOnlyConfig): SequelizeConfig {
3243
if (!config.define) {
3344
config.define = {};
3445
}
@@ -38,13 +49,19 @@ export abstract class BaseSequelize {
3849

3950
return this.getValidationOnlyConfig(config);
4051
}
41-
return {...config as ISequelizeConfig};
52+
53+
if (BaseSequelize.isISequelizeDbNameConfig(config)) {
54+
// @TODO: remove deprecated "name" property
55+
return {...config, database: config.name} as ISequelizeConfig;
56+
}
57+
58+
return {...config as SequelizeConfig};
4259
}
4360

44-
static getValidationOnlyConfig(config: ISequelizeConfig | ISequelizeValidationOnlyConfig): ISequelizeConfig {
61+
static getValidationOnlyConfig(config: SequelizeConfig | ISequelizeValidationOnlyConfig): ISequelizeConfig {
4562
return {
4663
...config,
47-
name: '_name_',
64+
database: '_name_',
4865
username: '_username_',
4966
password: '_password_',
5067
dialect: 'sqlite',
@@ -66,7 +83,7 @@ export abstract class BaseSequelize {
6683
models.forEach(model => this._[model.name] = model);
6784
}
6885

69-
init(config: ISequelizeConfig): void {
86+
init(config: SequelizeConfig): void {
7087

7188
if (config.modelPaths) this.addModels(config.modelPaths);
7289
}

lib/models/Sequelize.d.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
/// <reference types="sequelize" />
21
import 'reflect-metadata';
32
import * as SequelizeOrigin from 'sequelize';
43
import {Model} from "./Model";
5-
import {ISequelizeConfig} from "../interfaces/ISequelizeConfig";
4+
import {SequelizeConfig} from "../types/SequelizeConfig";
65
import {ISequelizeValidationOnlyConfig} from "../interfaces/ISequelizeValidationOnlyConfig";
76

87
export declare class Sequelize extends SequelizeOrigin {
98

109
_: {[modelName: string]: (typeof Model)};
1110

12-
constructor(config: ISequelizeConfig | ISequelizeValidationOnlyConfig);
11+
constructor(config: SequelizeConfig | ISequelizeValidationOnlyConfig);
12+
constructor(uri: string);
1313

1414
addModels(models: Array<typeof Model>): void;
1515
addModels(modelPaths: string[]): void;

lib/models/v3/Sequelize.ts

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,41 @@
11
import 'reflect-metadata';
22
import * as SequelizeOrigin from 'sequelize';
33
import {Model} from "../Model";
4-
import {ISequelizeConfig} from "../../interfaces/ISequelizeConfig";
4+
import {SequelizeConfig} from "../../types/SequelizeConfig";
55
import {getModelName, getAttributes, getOptions} from "../../services/models";
66
import {PROPERTY_LINK_TO_ORIG} from "../../services/models";
77
import {BaseSequelize} from "../BaseSequelize";
88
import {Table} from "../../annotations/Table";
99
import {ISequelizeAssociation} from "../../interfaces/ISequelizeAssociation";
1010

11-
let preparedConfig;
12-
1311
export class Sequelize extends SequelizeOrigin implements BaseSequelize {
1412

1513
// to fix "$1" called with something that's not an instance of Sequelize.Model
1614
Model: any = Function;
1715

1816
throughMap: { [through: string]: any } = {};
1917
_: { [modelName: string]: typeof Model } = {};
20-
init: (config: ISequelizeConfig) => void;
18+
init: (config: SequelizeConfig) => void;
2119
addModels: (models: Array<typeof Model> | string[]) => void;
2220
associateModels: (models: Array<typeof Model>) => void;
2321

24-
constructor(config: ISequelizeConfig) {
25-
// a spread operator would be the more reasonable approach here,
26-
// but this is currently not possible due to a bug by ts
27-
// https://github.com/Microsoft/TypeScript/issues/4130
28-
// TODO@robin probably make the constructor private and
29-
// TODO use a static factory function instead
22+
constructor(config: SequelizeConfig | string) {
23+
3024
super(
31-
(preparedConfig = BaseSequelize.prepareConfig(config), preparedConfig.name),
32-
preparedConfig.username,
33-
preparedConfig.password,
34-
preparedConfig
25+
(typeof config === "string") ?
26+
config : // URI string
27+
BaseSequelize.isISequelizeUriConfig(config) ?
28+
config.uri : // URI string from ISequelizeUriConfig
29+
BaseSequelize.prepareConfig(config) // Config object (ISequelizeConfig)
3530
);
3631

37-
this.init(config);
32+
if (BaseSequelize.isISequelizeUriConfig(config)) {
33+
this.options = {...this.options, ...config};
34+
}
35+
36+
if (typeof config !== "string") {
37+
this.init(config);
38+
}
3839
}
3940

4041
getThroughModel(through: string): typeof Model {

lib/models/v4/Sequelize.ts

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,37 @@
11
import 'reflect-metadata';
22
import * as OriginSequelize from 'sequelize';
33
import {Model} from "../Model";
4-
import {ISequelizeConfig} from "../../interfaces/ISequelizeConfig";
4+
import {SequelizeConfig} from "../../types/SequelizeConfig";
55
import {getModelName, getAttributes, getOptions} from "../../services/models";
66
import {BaseSequelize} from "../BaseSequelize";
77
import {Table} from "../../annotations/Table";
88
import {ISequelizeAssociation} from "../../interfaces/ISequelizeAssociation";
99

10-
let preparedConfig;
11-
1210
export class Sequelize extends OriginSequelize implements BaseSequelize {
1311

1412
throughMap: {[through: string]: any} = {};
1513
_: {[modelName: string]: typeof Model} = {};
16-
init: (config: ISequelizeConfig) => void;
17-
addModels: (models: Array<typeof Model>|string[]) => void;
14+
init: (config: SequelizeConfig) => void;
15+
addModels: (models: Array<typeof Model> | string[]) => void;
1816
associateModels: (models: Array<typeof Model>) => void;
1917

20-
constructor(config: ISequelizeConfig) {
21-
// a spread operator would be the more reasonable approach here,
22-
// but this is currently not possible due to a bug by ts
23-
// https://github.com/Microsoft/TypeScript/issues/4130
24-
// TODO@robin probably make the constructor private and
25-
// TODO use a static factory function instead
18+
constructor(config: SequelizeConfig | string) {
19+
2620
super(
27-
(preparedConfig = BaseSequelize.prepareConfig(config), preparedConfig.name),
28-
preparedConfig.username,
29-
preparedConfig.password,
30-
preparedConfig
21+
(typeof config === "string") ?
22+
config : // URI string
23+
BaseSequelize.isISequelizeUriConfig(config) ?
24+
config.uri : // URI string from ISequelizeUriConfig
25+
BaseSequelize.prepareConfig(config) // Config object (ISequelizeConfig)
3126
);
3227

33-
this.init(config);
28+
if (BaseSequelize.isISequelizeUriConfig(config)) {
29+
this.options = {...this.options, ...config};
30+
}
31+
32+
if (typeof config !== "string") {
33+
this.init(config);
34+
}
3435
}
3536

3637
getThroughModel(through: string): typeof Model {

lib/types/SequelizeConfig.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import {ISequelizeConfig} from "../interfaces/ISequelizeConfig";
2+
import {ISequelizeUriConfig} from "../interfaces/ISequelizeUriConfig";
3+
import {ISequelizeDbNameConfig} from "../interfaces/ISequelizeDbNameConfig";
4+
5+
export type SequelizeConfig = ISequelizeConfig | ISequelizeUriConfig | ISequelizeDbNameConfig;

package-lock.json

Lines changed: 18 additions & 18 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,10 @@
3030
"main": "index.js",
3131
"types": "index.d.ts",
3232
"dependencies": {
33+
"@types/bluebird": "3.5.4",
3334
"@types/node": "6.0.41",
3435
"@types/reflect-metadata": "0.0.4",
35-
"@types/sequelize": "4.0.68",
36+
"@types/sequelize": "4.0.69",
3637
"es6-shim": "0.35.3"
3738
},
3839
"devDependencies": {

0 commit comments

Comments
 (0)