Source: template/sequelize4/index.js

/**
 * This file is auto generated by sequelize-pg-generator.
 * @module path/to/model
 * @author Özüm Eldoğan
 */

/*jslint node: true, stupid: true, nomen: true */
"use strict";

var Sequelize           = require('sequelize'),
    fs                  = require('fs'),
    path                = require('path'),
    util                = require('util'),
    models              = {},
    relationships       = {},
    modelsPath          = '',
    definitionDir       = 'definition-files',
    definitionDirCustom = definitionDir + '-custom',
    debug               = false,
    debugFD             = '',
    sequelize           = null;

/**
 * Requires given npm module file and defines sequelize module according to exported object from that module.
 * @private
 * @param {string} file - Location of the npm module file which contains model definition.
 */
function defineModel(file) {
    var object      = require(file),
        options     = object.options || {},
        modelName   = object.modelName;

    fs.writeSync(debugFD, 'var ' + modelName + ' = Sequelize.define("' + modelName + '",\n' + util.inspect(object.attributes) + ',\n' + util.inspect(options, {depth: null}) + ');\n\n\n');

    models[modelName] = sequelize.define(modelName, object.attributes, options);
    if (object.relations !== undefined) {
        relationships[modelName] = object.relations;
    }
}


/**
 * Define 'hasMany' and 'belongsTo' relations.
 * @private
 * @param {string} modelName - Name of the model
 * @param {string} relationType - Type of the relation 'hasMany' or 'belongsTo'
 * @param {string} targetModelName - Name of the target model which this relation related to.
 * @param {Object} options - Sequelize options of relation.
 */
function defineRelation(modelName, relationType, targetModelName, options) {
    fs.writeSync(debugFD, modelName + '.' + relationType + '(' + targetModelName + ', ' + util.inspect(options, {depth: null}) + ');\n\n');
    models[modelName][relationType](models[targetModelName], options); // account.hasMany(contact, {...})
}


/**
 * Generates list of definition files by looking given modelsPath directory. It traverses 'definition-files'
 * and 'definition-files-custom' directories to generate the list. Files in 'definition-files' will be skipped
 * if a file with same name is found in 'definition-files-custom' directory.
 * @private
 * @returns {Array}
 * @example
 * var list = getFileList('../model'); // ['./definition-files-custom/public_cart.js', './definition-files/public_account.js]
 */
function getFileList() {
    var i, file, isOverridden = {}, files = [], customFiles, baseFiles;
    baseFiles = fs.readdirSync(path.join(modelsPath, definitionDir));
    customFiles = fs.readdirSync(path.join(modelsPath, definitionDirCustom));

    for (i = 0; i < customFiles.length; i = i + 1) {
        file = customFiles[i];
        if (file.match(/\.js$/)) {
            isOverridden[file] = true;
            files.push('./' + path.join(definitionDirCustom, file));
        }
    }

    for (i = 0; i < baseFiles.length; i = i + 1) {
        file = baseFiles[i];
        if (!isOverridden[file] && file.match(/\.js$/)) {
            files.push('./' + path.join(definitionDir, file));
        }
    }
    return files;
}


/**
 * Iterates all relations and executes given callback on them. Callback is passed
 * ({string} modelName, {string} relationType, {string} targetModelName, {Object} relationOptions)
 * @private
 * @param {function} callback - Callback function.
 * @returns {Array}
 */
function processAllRelations(callback) {
    var i, modelName, relation, relations, result = [];
    for (modelName in relationships) {
        if (relationships.hasOwnProperty(modelName)) {
            relations = relationships[modelName];
            for (i = 0; i < relations.length; i = i + 1) {
                relation = relations[i];
                result.push(callback(modelName, relation.type, relation.model, relation.details));
            }
        }
    }
    return result;
}


/**
 * Initializes models.
 * @private
 */
function init() {
    var debugFile = path.join(__dirname, 'debug.js');
    if (fs.existsSync(debugFile)) { fs.unlinkSync(debugFile); }
    debugFD = fs.openSync(debugFile, 'a');

    getFileList(modelsPath).forEach(defineModel);
    processAllRelations(defineRelation);

    fs.closeSync(debugFD);
}

module.exports = {};

/**
 * Sets up sequelize models based on model files in given directory for given database details.
 * @param {string} database - Name of the database to connect
 * @param {string} username - Username of the database
 * @param {string} password - Password of the database
 * @param {Object} obj - Object to pass new Sequelize() function. See Sequelize for details.
 * @example
 * var orm = require('../model');
 * orm.setup('path/to/model', 'database', 'user', 'password', {
     *     host: '127.0.0.1',
     *     logging: false,
     *     native: true
     * });
 */
module.exports.setup = function (database, username, password, obj) {
    if (typeof obj !== 'object') { obj = {}; }
    if (obj.dialect === undefined || obj.dialect === null) { obj.dialect = 'postgres'; }

    if (arguments.length === 2) {
        sequelize = new Sequelize(database, username);
    } else if (arguments.length === 3) {
        sequelize = new Sequelize(database, username, password);
    } else if (arguments.length === 4) {
        sequelize = new Sequelize(database, username, password, obj);
    }
    modelsPath = __dirname;
    init();
};

/**
 * Returns requested model with given name.
 * @param {string} name - Model name
 * @returns {object} - Sequelize model
 */
module.exports.model = function (name) {
    return models[name];
};

/**
 * Returns Sequelize object.
 * @returns {Sequelize} - Sequelize object
 */
module.exports.Sequelize = function () {
    return Sequelize;
};

/**
 * Returns sequelize instance.
 * @returns {Sequelize} - sequelize instance
 */
module.exports.sequelize = function () {
    return sequelize;
};
sequelize-pg-generator Copyright © 2014 Özüm Eldoğan.
Documentation generated by JSDoc 3.3.1 on Thu Sep 10th 2015 using the DocStrap template.