sequelize-decorators

Sequelize + Decorators = ❤

ISC License

Downloads
215
Stars
76

Sequelize + Decorators = ❤

A proof of concept for using Sequelize with decorators.

Usage with TypeScript

Installation

npm install --save sequelize sequelize-decorators

Add to your tsconfig.json:

"experimentalDecorators": true,
"emitDecoratorMetadata": true

The second setting lets sequelize-decorators infer the type of attributes from the type declaration.

Example:

import {Sequelize, Model, DataTypes} from 'sequelize'
import {Options, Attribute} from 'sequelize-decorators'

const sequelize = new Sequelize(process.env.DB)

@Options({
    sequelize,
    tableName: 'users'
})
export class User extends Model {

    @Attribute({
        type: DataTypes.STRING,
        primaryKey: true
    })
    public username: string;

    @Attribute(DataTypes.STRING)
    public firstName: string;

    @Attribute() // Type is inferred as DataTypes.STRING
    public lastName: string;

    get fullName(): string {
        return this.firstName + ' ' + this.lastName;
    }

    set fullName(fullName: string) {
        const names = fullName.split(' ');
        this.lastName = names.pop();
        this.firstName = names.join(' ');
    }
}

The @Options decorator is required and must include the sequelize option (the connection to use).

Type inference

TypeScript type Sequelize data type
string STRING
number INTEGER
Date DATE
Buffer BLOB

Usage with Babel

Installation

npm install --save sequelize sequelize-decorators
npm install --save-dev babel-plugin-transform-decorators-legacy

Add to your .babelrc:

"plugins": ["transform-decorators-legacy"]

Example:

import {Sequelize, Model, DataTypes} from 'sequelize'
import {Options, Attributes} from 'sequelize-decorators'

const sequelize = new Sequelize(process.env.DB)

@Options({
    sequelize,
    tableName: 'users'
})
@Attributes({
    username: {
        type: DataTypes.STRING,
        primaryKey: true
    },
    lastName: DataTypes.STRING,
    firstName: DataTypes.STRING,
})
export class User extends Model {

    get fullName(): string {
        return this.firstName + ' ' + this.lastName;
    }

    set fullName(fullName: string) {
        const names = fullName.split(' ');
        this.lastName = names.pop();
        this.firstName = names.join(' ');
    }
}

The @Options decorator is required and must include the sequelize option (the connection to use).