felixfbecker / sequelize-decorators

Sequelize + Decorators = ❤

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Sequelize + Decorators = ❤

npm downloads build codecov dependencies node license

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).

About

Sequelize + Decorators = ❤

License:ISC License


Languages

Language:TypeScript 72.2%Language:JavaScript 27.8%