index.js
6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
/**
* 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;
if (debug) {
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) {
if (debug) {
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 (debug) {
if (fs.existsSync(debugFile)) { fs.unlinkSync(debugFile); }
debugFD = fs.openSync(debugFile, 'a');
}
getFileList(modelsPath).forEach(defineModel);
processAllRelations(defineRelation);
if (debug) {
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;
};