node package manager
Painless code sharing. npm Orgs help your team discover, share, and reuse code. Create a free org »



Simple migration tool for Waterline ORM

Definitely a work in progress but the idea is to add migrations to Waterline. Currently it only supports "up" actions and some kind of "down" support should probably be added.


$ npm install waterline-migrate


Initialize the object by passing in a directory path and an optional logger.

var waterlineMigrate = require('waterline-migrate')({
    dir: path.resolve(__dirname, 'db/migrations'),
    logger: winston

Initialize Waterline and load collections including the Migration collection.

var Waterline = require('waterline'),
    Migration = require('../models/migration');
var waterline = new Waterline();
var config = { ... };
waterline.initialize(config, function(err, models) {
    if(err) throw err;


Migrations can contain any code you like as long as they expose an "up" and "down" function that can be called. The name of the file will be used to keep track of which migrations have been run and not so the name field here is only for logging.

'use strict';
var Promise = require('bluebird');
var winston = require('winston');
var migration = {};
module.exports = exports = migration;
var name = '0001_test_migration';
migration.up = function(models) {
    winston.debug('Applying migration ' + name);
    return models.collections.config.create({
            name: 'test',
            value: 'test value',
            data: {
                test: 'works'
        .then(function(model) {
            winston.debug('Successfully applied migration ' + name);
            return Promise.resolve();
        .catch(function(e) {
            winston.debug('Error applying migration ' + name);
            return Promise.reject(e);
migration.down = function() {
    console.log('running down function');


Waterline Migrate makes use of Promises via Bluebird so you can chain things together nicely like this.

var db = require('../config/orm'),
    path = require("path"),
    Promise = require('bluebird'),
    winston = require('winston');
var migrationUtil = require('../utils/migrations')({
    dir: path.resolve(__dirname, '../db/migrations'),
    logger: winston
winston.level = 'debug';
    .then(function(models) {
        return migrationUtil.migrate(models);
    .then(function(models) {
        // Initialize Express
        winston.debug('DB Migration complete, initializing server');
        var app = require('./express')(models);
        return app;
    .catch(function(e) {
        console.log('error', e);
        winston.error('Error initializing server');
function initializeDB() {
    // initialize the Database
    return new Promise(function(resolve, reject) {
        winston.debug('Initializing Database');
        db.initialize(function(err, models) {
            if(err) {
                winston.error('Error initializing database');
                return reject(err);
            winston.debug('Database initialized');
            return resolve(models);