Skip to content

Commit d285136

Browse files
author
kukoo
committed
add new sequelize definition
1 parent fd14937 commit d285136

File tree

9 files changed

+99
-44
lines changed

9 files changed

+99
-44
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

lib/interfaces/ISequelizeDbNameConfig.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import {Options} from 'sequelize';
22

33
/**
44
* This class is for deprecated "name" property.
5-
* For cPlease
5+
* For congruence to Sequelize config, use "database" instead.
66
*/
77
export interface ISequelizeDbNameConfig extends Options {
88

lib/interfaces/ISequelizeUriConfig.ts

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,11 @@
11
import {Options} from 'sequelize';
22

3-
export interface ISequelizeConfig extends Options {
3+
export interface ISequelizeUriConfig extends Options {
44

55
/**
6-
* Name of database
6+
* Uri connection string to database
77
*/
8-
name: string;
9-
10-
/**
11-
* Username of database
12-
*/
13-
username: string;
14-
15-
/**
16-
* Password for database user
17-
*/
18-
password: string;
8+
uri: string;
199

2010
/**
2111
* Path to models, which should be loaded

lib/models/BaseSequelize.ts

Lines changed: 28 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 {ISequelizeValidationOnlyConfig} from "../interfaces/ISequelizeValidationOnlyConfig";
710
import {extend} from "../utils/object";
@@ -19,6 +22,18 @@ export abstract class BaseSequelize {
1922
thoughMap: { [through: string]: any } = {};
2023
_: { [modelName: string]: (typeof Model) } = {};
2124

25+
static isISequelizeConfig(obj: any): obj is ISequelizeConfig {
26+
return obj.hasOwnProperty("database") && obj.hasOwnProperty("username");
27+
}
28+
29+
static isISequelizeDbNameConfig(obj: any): obj is ISequelizeDbNameConfig {
30+
return obj.hasOwnProperty("name") && obj.hasOwnProperty("username");
31+
}
32+
33+
static isISequelizeUriConfig(obj: any): obj is ISequelizeUriConfig {
34+
return obj.hasOwnProperty("uri");
35+
}
36+
2237
static extend(target: any): void {
2338

2439
extend(target, this);
@@ -27,7 +42,7 @@ export abstract class BaseSequelize {
2742
/**
2843
* Prepares sequelize config passed to original sequelize constructor
2944
*/
30-
static prepareConfig(config: ISequelizeConfig | ISequelizeValidationOnlyConfig): ISequelizeConfig {
45+
static prepareConfig(config: SequelizeConfig | ISequelizeValidationOnlyConfig): SequelizeConfig {
3146
if (!config.define) {
3247
config.define = {};
3348
}
@@ -37,13 +52,21 @@ export abstract class BaseSequelize {
3752

3853
return this.getValidationOnlyConfig(config);
3954
}
40-
return {...config as ISequelizeConfig};
55+
56+
if (BaseSequelize.isISequelizeDbNameConfig(config)) {
57+
// Sequelize uses "database" property as a database name.
58+
// @TODO: "name" property is deprecated, use "database" instead
59+
const database = config.name;
60+
return {...config, database} as ISequelizeConfig;
61+
}
62+
63+
return {...config as SequelizeConfig};
4164
}
4265

43-
static getValidationOnlyConfig(config: ISequelizeConfig | ISequelizeValidationOnlyConfig): ISequelizeConfig {
66+
static getValidationOnlyConfig(config: SequelizeConfig | ISequelizeValidationOnlyConfig): ISequelizeConfig {
4467
return {
4568
...config,
46-
name: '_name_',
69+
database: '_name_',
4770
username: '_username_',
4871
password: '_password_',
4972
dialect: 'sqlite',
@@ -64,7 +87,7 @@ export abstract class BaseSequelize {
6487
models.forEach(model => this._[model.name] = model);
6588
}
6689

67-
init(config: ISequelizeConfig): void {
90+
init(config: SequelizeConfig): void {
6891

6992
if (config.modelPaths) this.addModels(config.modelPaths);
7093
}

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/v4/Sequelize.ts

Lines changed: 21 additions & 19 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

14-
thoughMap: {[through: string]: any} = {};
15-
_: {[modelName: string]: typeof Model} = {};
16-
init: (config: ISequelizeConfig) => void;
17-
addModels: (models: Array<typeof Model>|string[]) => void;
12+
thoughMap: { [through: string]: any } = {};
13+
_: { [modelName: string]: typeof Model } = {};
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 {
@@ -43,7 +44,8 @@ export class Sequelize extends OriginSequelize implements BaseSequelize {
4344
return Through;
4445
}
4546

46-
adjustAssociation(model: any, association: ISequelizeAssociation): void {}
47+
adjustAssociation(model: any, association: ISequelizeAssociation): void {
48+
}
4749

4850
/**
4951
* Creates sequelize models and registers these models

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;

test/specs/models/sequelize.spec.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* tslint:disable:max-classes-per-file */
22

33
import {expect} from 'chai';
4-
import {createSequelize} from "../../utils/sequelize";
4+
import {createSequelize, createSequelizeUriObject, createSequelizeUriString} from "../../utils/sequelize";
55
import {Game} from "../../models/exports/Game";
66
import Gamer from "../../models/exports/gamer.model";
77
import {Sequelize} from "../../../lib/models/Sequelize";
@@ -20,6 +20,24 @@ describe('sequelize', () => {
2020

2121
});
2222

23+
describe('constructor using uri in options object', () => {
24+
25+
const sequelizeUri = createSequelizeUriString(false);
26+
it('should equal Sequelize class', () => {
27+
expect(sequelizeUri.constructor).to.equal(Sequelize);
28+
});
29+
30+
});
31+
32+
describe('constructor using uri string', () => {
33+
34+
const sequelizeUri = createSequelizeUriObject(false);
35+
it('should equal Sequelize class', () => {
36+
expect(sequelizeUri.constructor).to.equal(Sequelize);
37+
});
38+
39+
});
40+
2341
describe('global define options', () => {
2442

2543
const DEFINE_OPTIONS = {timestamps: true, underscoredAll: true};

test/utils/sequelize.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ import {Sequelize} from "../../lib/models/Sequelize";
22
import * as OriginSequelize from "sequelize";
33
import {DefineOptions, Sequelize as SequelizeType} from "sequelize";
44

5+
56
export function createSequelize(useModelsInPath: boolean = true, define: DefineOptions<any> = {}): Sequelize {
67

78
return new Sequelize({
8-
name: '__',
9+
database: '__',
910
dialect: 'sqlite',
1011
username: 'root',
1112
password: '',
@@ -16,6 +17,22 @@ export function createSequelize(useModelsInPath: boolean = true, define: DefineO
1617
});
1718
}
1819

20+
export function createSequelizeUriObject(useModelsInPath: boolean = true, define: DefineOptions<any> = {}): Sequelize {
21+
22+
return new Sequelize({
23+
uri: 'sqlite://root@localhost/__',
24+
dialect: 'sqlite',
25+
define,
26+
storage: ':memory:',
27+
logging: !('SEQ_SILENT' in process.env),
28+
modelPaths: useModelsInPath ? [__dirname + '/../models'] : []
29+
});
30+
}
31+
export function createSequelizeUriString(useModelsInPath: boolean = true, define: DefineOptions<any> = {}): Sequelize {
32+
33+
return new Sequelize("sqlite://root@localhost/__");
34+
}
35+
1936
export function createSequelizeValidationOnly(useModelsInPath: boolean = true): Sequelize {
2037

2138
return new Sequelize({

0 commit comments

Comments
 (0)