不要怂,就是干,撸起袖子干!

Commit b9bdc1d4 by Felix Becker Committed by Jan Aagaard Meier

ES6 refactor of utils.js (#6059)

- let, const, arrow functions, property shorthands, exports, classes
 - changes classes to be PascalCase
 - Removes inherit() function (not used anymore)
1 parent 49a7e543
...@@ -1098,9 +1098,9 @@ const QueryGenerator = { ...@@ -1098,9 +1098,9 @@ const QueryGenerator = {
if (Array.isArray(attr) && attr.length === 2) { if (Array.isArray(attr) && attr.length === 2) {
if (attr[0]._isSequelizeMethod) { if (attr[0]._isSequelizeMethod) {
if (attr[0] instanceof Utils.literal || if (attr[0] instanceof Utils.Literal ||
attr[0] instanceof Utils.cast || attr[0] instanceof Utils.Cast ||
attr[0] instanceof Utils.fn attr[0] instanceof Utils.Fn
) { ) {
verbatim = true; verbatim = true;
} }
...@@ -1110,9 +1110,9 @@ const QueryGenerator = { ...@@ -1110,9 +1110,9 @@ const QueryGenerator = {
attrAs = attr[1]; attrAs = attr[1];
attr = attr[0]; attr = attr[0];
} else if (attr instanceof Utils.literal) { } else if (attr instanceof Utils.Literal) {
return attr.val; // We trust the user to rename the field correctly return attr.val; // We trust the user to rename the field correctly
} else if (attr instanceof Utils.cast || attr instanceof Utils.fn) { } else if (attr instanceof Utils.Cast || attr instanceof Utils.Fn) {
throw new Error( throw new Error(
'Tried to select attributes using Sequelize.cast or Sequelize.fn without specifying an alias for the result, during eager loading. ' + 'Tried to select attributes using Sequelize.cast or Sequelize.fn without specifying an alias for the result, during eager loading. ' +
'This means the attribute will not be added to the returned instance' 'This means the attribute will not be added to the returned instance'
...@@ -1503,7 +1503,7 @@ const QueryGenerator = { ...@@ -1503,7 +1503,7 @@ const QueryGenerator = {
const subQueryOrder = []; const subQueryOrder = [];
const validateOrder = order => { const validateOrder = order => {
if (order instanceof Utils.literal) return; if (order instanceof Utils.Literal) return;
if (!_.includes([ if (!_.includes([
'ASC', 'ASC',
...@@ -1538,7 +1538,7 @@ const QueryGenerator = { ...@@ -1538,7 +1538,7 @@ const QueryGenerator = {
mainQueryOrder.push(this.quote(t, model)); mainQueryOrder.push(this.quote(t, model));
} }
} else { } else {
mainQueryOrder.push(this.quote(typeof options.order === 'string' ? new Utils.literal(options.order) : options.order, model)); mainQueryOrder.push(this.quote(typeof options.order === 'string' ? new Utils.Literal(options.order) : options.order, model));
} }
return {mainQueryOrder, subQueryOrder}; return {mainQueryOrder, subQueryOrder};
...@@ -1757,7 +1757,7 @@ const QueryGenerator = { ...@@ -1757,7 +1757,7 @@ const QueryGenerator = {
handleSequelizeMethod(smth, tableName, factory, options, prepend) { handleSequelizeMethod(smth, tableName, factory, options, prepend) {
let result; let result;
if (smth instanceof Utils.where) { if (smth instanceof Utils.Where) {
let value = smth.logic; let value = smth.logic;
let key; let key;
...@@ -1784,9 +1784,9 @@ const QueryGenerator = { ...@@ -1784,9 +1784,9 @@ const QueryGenerator = {
result = (value === 'NULL') ? key + ' IS NULL' : [key, value].join(' ' + smth.comparator + ' '); result = (value === 'NULL') ? key + ' IS NULL' : [key, value].join(' ' + smth.comparator + ' ');
} }
} else if (smth instanceof Utils.literal) { } else if (smth instanceof Utils.Literal) {
result = smth.val; result = smth.val;
} else if (smth instanceof Utils.cast) { } else if (smth instanceof Utils.Cast) {
if (smth.val._isSequelizeMethod) { if (smth.val._isSequelizeMethod) {
result = this.handleSequelizeMethod(smth.val, tableName, factory, options, prepend); result = this.handleSequelizeMethod(smth.val, tableName, factory, options, prepend);
} else { } else {
...@@ -1794,7 +1794,7 @@ const QueryGenerator = { ...@@ -1794,7 +1794,7 @@ const QueryGenerator = {
} }
result = 'CAST(' + result + ' AS ' + smth.type.toUpperCase() + ')'; result = 'CAST(' + result + ' AS ' + smth.type.toUpperCase() + ')';
} else if (smth instanceof Utils.fn) { } else if (smth instanceof Utils.Fn) {
result = smth.fn + '(' + smth.args.map(arg => { result = smth.fn + '(' + smth.args.map(arg => {
if (arg._isSequelizeMethod) { if (arg._isSequelizeMethod) {
return this.handleSequelizeMethod(arg, tableName, factory, options, prepend); return this.handleSequelizeMethod(arg, tableName, factory, options, prepend);
...@@ -1802,7 +1802,7 @@ const QueryGenerator = { ...@@ -1802,7 +1802,7 @@ const QueryGenerator = {
return this.escape(arg); return this.escape(arg);
} }
}).join(', ') + ')'; }).join(', ') + ')';
} else if (smth instanceof Utils.col) { } else if (smth instanceof Utils.Col) {
if (Array.isArray(smth.col)) { if (Array.isArray(smth.col)) {
if (!factory) { if (!factory) {
throw new Error('Cannot call Sequelize.col() with array outside of order / group clause'); throw new Error('Cannot call Sequelize.col() with array outside of order / group clause');
...@@ -1949,7 +1949,7 @@ const QueryGenerator = { ...@@ -1949,7 +1949,7 @@ const QueryGenerator = {
} }
} }
if (value && value._isSequelizeMethod && !(key !== undefined && value instanceof Utils.fn)) { if (value && value._isSequelizeMethod && !(key !== undefined && value instanceof Utils.Fn)) {
return this.handleSequelizeMethod(value); return this.handleSequelizeMethod(value);
} }
...@@ -2025,7 +2025,7 @@ const QueryGenerator = { ...@@ -2025,7 +2025,7 @@ const QueryGenerator = {
let $baseKey = this.quoteIdentifier(key)+'#>>\'{'+path.join(', ')+'}\''; let $baseKey = this.quoteIdentifier(key)+'#>>\'{'+path.join(', ')+'}\'';
if (options.prefix) { if (options.prefix) {
if (options.prefix instanceof Utils.literal) { if (options.prefix instanceof Utils.Literal) {
$baseKey = this.handleSequelizeMethod(options.prefix)+'.'+$baseKey; $baseKey = this.handleSequelizeMethod(options.prefix)+'.'+$baseKey;
} else { } else {
$baseKey = this.quoteTable(options.prefix)+'.'+$baseKey; $baseKey = this.quoteTable(options.prefix)+'.'+$baseKey;
...@@ -2060,7 +2060,7 @@ const QueryGenerator = { ...@@ -2060,7 +2060,7 @@ const QueryGenerator = {
$where[$prop] = $item; $where[$prop] = $item;
const $key = castKey($item); const $key = castKey($item);
$items.push(this.whereItemQuery(new Utils.literal($key), $where/*, _.pick(options, 'prefix')*/)); $items.push(this.whereItemQuery(new Utils.Literal($key), $where/*, _.pick(options, 'prefix')*/));
} else { } else {
traverse($prop, $item, path.concat([$prop])); traverse($prop, $item, path.concat([$prop]));
} }
...@@ -2069,7 +2069,7 @@ const QueryGenerator = { ...@@ -2069,7 +2069,7 @@ const QueryGenerator = {
$where.$eq = item; $where.$eq = item;
const $key = castKey(item); const $key = castKey(item);
$items.push(this.whereItemQuery(new Utils.literal($key), $where/*, _.pick(options, 'prefix')*/)); $items.push(this.whereItemQuery(new Utils.Literal($key), $where/*, _.pick(options, 'prefix')*/));
} }
}; };
...@@ -2125,7 +2125,7 @@ const QueryGenerator = { ...@@ -2125,7 +2125,7 @@ const QueryGenerator = {
comparator = 'IN'; comparator = 'IN';
if (value.$notIn) comparator = 'NOT IN'; if (value.$notIn) comparator = 'NOT IN';
if ((value.$in || value.$notIn) instanceof Utils.literal) { if ((value.$in || value.$notIn) instanceof Utils.Literal) {
value = (value.$in || value.$notIn).val; value = (value.$in || value.$notIn).val;
} else if ((value.$in || value.$notIn).length) { } else if ((value.$in || value.$notIn).length) {
value = '('+(value.$in || value.$notIn).map(item => this.escape(item)).join(', ')+')'; value = '('+(value.$in || value.$notIn).map(item => this.escape(item)).join(', ')+')';
...@@ -2226,7 +2226,7 @@ const QueryGenerator = { ...@@ -2226,7 +2226,7 @@ const QueryGenerator = {
} }
if (options.prefix && prefix) { if (options.prefix && prefix) {
if (options.prefix instanceof Utils.literal) { if (options.prefix instanceof Utils.Literal) {
key = [this.handleSequelizeMethod(options.prefix), key].join('.'); key = [this.handleSequelizeMethod(options.prefix), key].join('.');
} else { } else {
key = [this.quoteTable(options.prefix), key].join('.'); key = [this.quoteTable(options.prefix), key].join('.');
......
...@@ -124,7 +124,7 @@ const QueryGenerator = { ...@@ -124,7 +124,7 @@ const QueryGenerator = {
}, },
handleSequelizeMethod(smth, tableName, factory, options, prepend) { handleSequelizeMethod(smth, tableName, factory, options, prepend) {
if (smth instanceof Utils.json) { if (smth instanceof Utils.Json) {
// Parse nested object // Parse nested object
if (smth.conditions) { if (smth.conditions) {
const conditions = _.map(this.parseConditionObject(smth.conditions), condition => const conditions = _.map(this.parseConditionObject(smth.conditions), condition =>
......
...@@ -890,7 +890,7 @@ class Sequelize { ...@@ -890,7 +890,7 @@ class Sequelize {
* @return {Sequelize.fn} * @return {Sequelize.fn}
*/ */
static fn(fn) { static fn(fn) {
return new Utils.fn(fn, Utils.sliceArgs(arguments, 1)); return new Utils.Fn(fn, Utils.sliceArgs(arguments, 1));
} }
/** /**
...@@ -903,7 +903,7 @@ class Sequelize { ...@@ -903,7 +903,7 @@ class Sequelize {
* @return {Sequelize.col} * @return {Sequelize.col}
*/ */
static col(col) { static col(col) {
return new Utils.col(col); return new Utils.Col(col);
} }
/** /**
...@@ -916,7 +916,7 @@ class Sequelize { ...@@ -916,7 +916,7 @@ class Sequelize {
* @return {Sequelize.cast} * @return {Sequelize.cast}
*/ */
static cast(val, type) { static cast(val, type) {
return new Utils.cast(val, type); return new Utils.Cast(val, type);
} }
/** /**
...@@ -929,7 +929,7 @@ class Sequelize { ...@@ -929,7 +929,7 @@ class Sequelize {
* @return {Sequelize.literal} * @return {Sequelize.literal}
*/ */
static literal(val) { static literal(val) {
return new Utils.literal(val); return new Utils.Literal(val);
} }
/** /**
...@@ -968,7 +968,7 @@ class Sequelize { ...@@ -968,7 +968,7 @@ class Sequelize {
* @return {Sequelize.json} * @return {Sequelize.json}
*/ */
static json(conditionsOrPath, value) { static json(conditionsOrPath, value) {
return new Utils.json(conditionsOrPath, value); return new Utils.Json(conditionsOrPath, value);
} }
/** /**
...@@ -990,7 +990,7 @@ class Sequelize { ...@@ -990,7 +990,7 @@ class Sequelize {
* @return {Sequelize.where} * @return {Sequelize.where}
*/ */
static where(attr, comparator, logic) { static where(attr, comparator, logic) {
return new Utils.where(attr, comparator, logic); return new Utils.Where(attr, comparator, logic);
} }
/** /**
......
'use strict'; 'use strict';
var DataTypes = require('./data-types') const DataTypes = require('./data-types');
, SqlString = require('./sql-string') const SqlString = require('./sql-string');
, _ = require('lodash').runInContext() // Prevent anyone messing with template settings by creating a fresh copy const _ = require('lodash').runInContext(); // Prevent anyone messing with template settings by creating a fresh copy
, parameterValidator = require('./utils/parameter-validator') const parameterValidator = require('./utils/parameter-validator');
, inflection = require('inflection') const inflection = require('inflection');
, uuid = require('node-uuid') const uuid = require('node-uuid');
, primitives = ['string', 'number', 'boolean']; const Promise = require('./promise');
const primitives = ['string', 'number', 'boolean'];
var Utils = module.exports = {
inflection: inflection, exports.Promise = Promise;
_: _, exports._ = _;
camelizeIf: function(string, condition) { exports.inflection = inflection;
var result = string;
function camelizeIf(string, condition) {
let result = string;
if (condition) { if (condition) {
result = Utils.camelize(string); result = camelize(string);
} }
return result; return result;
}, }
underscoredIf: function(string, condition) { exports.camelizeIf = camelizeIf;
var result = string;
function underscoredIf(string, condition) {
let result = string;
if (condition) { if (condition) {
result = inflection.underscore(string); result = inflection.underscore(string);
} }
return result; return result;
}, }
isPrimitive: function (val) { exports.underscoredIf = underscoredIf;
function isPrimitive(val) {
return primitives.indexOf(typeof val) !== -1; return primitives.indexOf(typeof val) !== -1;
}, }
// Same concept as _.merge, but don't overwrite properties that have already been assigned exports.isPrimitive = isPrimitive;
mergeDefaults: function (a, b) {
return _.mergeWith(a, b, function (objectValue, sourceValue) { // Same concept as _.merge, but don't overwrite properties that have already been assigned
function mergeDefaults(a, b) {
return _.mergeWith(a, b, (objectValue, sourceValue) => {
// If it's an object, let _ handle it this time, we will be called again for each property // If it's an object, let _ handle it this time, we will be called again for each property
if (!this._.isPlainObject(objectValue) && objectValue !== undefined) { if (!this._.isPlainObject(objectValue) && objectValue !== undefined) {
return objectValue; return objectValue;
} }
}.bind(this)); });
}, }
// An alternative to _.merge, which doesn't clone its arguments exports.mergeDefaults = mergeDefaults;
// Cloning is a bad idea because options arguments may contain references to sequelize
// models - which again reference database libs which don't like to be cloned (in particular pg-native) // An alternative to _.merge, which doesn't clone its arguments
merge: function () { // Cloning is a bad idea because options arguments may contain references to sequelize
var result = {}; // models - which again reference database libs which don't like to be cloned (in particular pg-native)
function merge() {
const result = {};
Array.prototype.slice.apply(arguments).forEach(function (obj) { for (const obj of arguments) {
_.forOwn(obj, function (value, key) { _.forOwn(obj, (value, key) => {
if (typeof value !== 'undefined') { if (typeof value !== 'undefined') {
if (!result[key]) { if (!result[key]) {
result[key] = value; result[key] = value;
} else if (_.isPlainObject(value) && _.isPlainObject(result[key])) { } else if (_.isPlainObject(value) && _.isPlainObject(result[key])) {
result[key] = Utils.merge(result[key], value); result[key] = merge(result[key], value);
} else if (Array.isArray(value) && Array.isArray(result[key])) { } else if (Array.isArray(value) && Array.isArray(result[key])) {
result[key] = value.concat(result[key]); result[key] = value.concat(result[key]);
} else { } else {
...@@ -61,34 +71,48 @@ var Utils = module.exports = { ...@@ -61,34 +71,48 @@ var Utils = module.exports = {
} }
} }
}); });
}); }
return result; return result;
}, }
lowercaseFirst: function (s) { exports.merge = merge;
function lowercaseFirst(s) {
return s[0].toLowerCase() + s.slice(1); return s[0].toLowerCase() + s.slice(1);
}, }
uppercaseFirst: function (s) { exports.lowercaseFirst = lowercaseFirst;
function uppercaseFirst(s) {
return s[0].toUpperCase() + s.slice(1); return s[0].toUpperCase() + s.slice(1);
}, }
spliceStr: function (str, index, count, add) { exports.uppercaseFirst = uppercaseFirst;
function spliceStr(str, index, count, add) {
return str.slice(0, index) + add + str.slice(index + count); return str.slice(0, index) + add + str.slice(index + count);
}, }
camelize: function(str){ exports.spliceStr = spliceStr;
return str.trim().replace(/[-_\s]+(.)?/g, function(match, c){ return c.toUpperCase(); });
}, function camelize(str) {
format: function(arr, dialect) { return str.trim().replace(/[-_\s]+(.)?/g, (match, c) => c.toUpperCase());
var timeZone = null; }
exports.camelize = camelize;
function format(arr, dialect) {
const timeZone = null;
// Make a clone of the array beacuse format modifies the passed args // Make a clone of the array beacuse format modifies the passed args
return SqlString.format(arr[0], arr.slice(1), timeZone, dialect); return SqlString.format(arr[0], arr.slice(1), timeZone, dialect);
}, }
formatNamedParameters: function(sql, parameters, dialect) { exports.format = format;
var timeZone = null;
function formatNamedParameters(sql, parameters, dialect) {
const timeZone = null;
return SqlString.formatNamedParameters(sql, parameters, timeZone, dialect); return SqlString.formatNamedParameters(sql, parameters, timeZone, dialect);
}, }
cloneDeep: function(obj) { exports.formatNamedParameters = formatNamedParameters;
function cloneDeep(obj) {
obj = obj || {}; obj = obj || {};
return _.cloneDeepWith(obj, function (elem) { return _.cloneDeepWith(obj, elem => {
// Do not try to customize cloning of arrays or POJOs // Do not try to customize cloning of arrays or POJOs
if (Array.isArray(elem) || _.isPlainObject(elem)) { if (Array.isArray(elem) || _.isPlainObject(elem)) {
return undefined; return undefined;
...@@ -104,29 +128,31 @@ var Utils = module.exports = { ...@@ -104,29 +128,31 @@ var Utils = module.exports = {
return elem.clone(); return elem.clone();
} }
}); });
}, }
exports.cloneDeep = cloneDeep;
/* Expand and normalize finder options */ /* Expand and normalize finder options */
mapFinderOptions: function(options, Model) { function mapFinderOptions(options, Model) {
if (Model._hasVirtualAttributes && Array.isArray(options.attributes)) { if (Model._hasVirtualAttributes && Array.isArray(options.attributes)) {
options.attributes.forEach(function (attribute) { for (const attribute of options.attributes) {
if (Model._isVirtualAttribute(attribute) && Model.rawAttributes[attribute].type.fields) { if (Model._isVirtualAttribute(attribute) && Model.rawAttributes[attribute].type.fields) {
options.attributes = options.attributes.concat(Model.rawAttributes[attribute].type.fields); options.attributes = options.attributes.concat(Model.rawAttributes[attribute].type.fields);
} }
}.bind(Model)); }
options.attributes = _.without.apply(_, [options.attributes].concat(Model._virtualAttributes)); options.attributes = _.without.apply(_, [options.attributes].concat(Model._virtualAttributes));
options.attributes = _.uniq(options.attributes); options.attributes = _.uniq(options.attributes);
} }
Utils.mapOptionFieldNames(options, Model); mapOptionFieldNames(options, Model);
return options; return options;
}, }
exports.mapFinderOptions = mapFinderOptions;
/* Used to map field names in attributes and where conditions */ /* Used to map field names in attributes and where conditions */
mapOptionFieldNames: function(options, Model) { function mapOptionFieldNames(options, Model) {
if (Array.isArray(options.attributes)) { if (Array.isArray(options.attributes)) {
options.attributes = options.attributes.map(function(attr) { options.attributes = options.attributes.map(attr => {
// Object lookups will force any variable to strings, we don't want that for special objects etc // Object lookups will force any variable to strings, we don't want that for special objects etc
if (typeof attr !== 'string') return attr; if (typeof attr !== 'string') return attr;
// Map attributes to aliased syntax attributes // Map attributes to aliased syntax attributes
...@@ -138,12 +164,14 @@ var Utils = module.exports = { ...@@ -138,12 +164,14 @@ var Utils = module.exports = {
} }
if (options.where && _.isPlainObject(options.where)) { if (options.where && _.isPlainObject(options.where)) {
options.where = Utils.mapWhereFieldNames(options.where, Model); options.where = mapWhereFieldNames(options.where, Model);
} }
if (Array.isArray(options.order)) { if (Array.isArray(options.order)) {
options.order.forEach(function(oGroup) { for (const oGroup of options.order) {
var OrderModel, attr, attrOffset; let OrderModel;
let attr;
let attrOffset;
if (Array.isArray(oGroup)) { if (Array.isArray(oGroup)) {
OrderModel = Model; OrderModel = Model;
...@@ -169,15 +197,16 @@ var Utils = module.exports = { ...@@ -169,15 +197,16 @@ var Utils = module.exports = {
oGroup[oGroup.length - attrOffset] = OrderModel.rawAttributes[attr].field; oGroup[oGroup.length - attrOffset] = OrderModel.rawAttributes[attr].field;
} }
} }
}); }
} }
return options; return options;
}, }
exports.mapOptionFieldNames = mapOptionFieldNames;
mapWhereFieldNames: function (attributes, Model) { function mapWhereFieldNames(attributes, Model) {
var attribute let attribute;
, rawAttribute; let rawAttribute;
if (attributes) { if (attributes) {
for (attribute in attributes) { for (attribute in attributes) {
...@@ -189,15 +218,15 @@ var Utils = module.exports = { ...@@ -189,15 +218,15 @@ var Utils = module.exports = {
} }
if (_.isPlainObject(attributes[attribute])) { if (_.isPlainObject(attributes[attribute])) {
attributes[attribute] = Utils.mapOptionFieldNames({ attributes[attribute] = mapOptionFieldNames({
where: attributes[attribute] where: attributes[attribute]
}, Model).where; }, Model).where;
} }
if (Array.isArray(attributes[attribute])) { if (Array.isArray(attributes[attribute])) {
attributes[attribute] = attributes[attribute].map(function (where) { attributes[attribute] = attributes[attribute].map(where => {
if (_.isPlainObject(where)) { if (_.isPlainObject(where)) {
return Utils.mapWhereFieldNames(where, Model); return mapWhereFieldNames(where, Model);
} }
return where; return where;
...@@ -207,13 +236,14 @@ var Utils = module.exports = { ...@@ -207,13 +236,14 @@ var Utils = module.exports = {
} }
return attributes; return attributes;
}, }
exports.mapWhereFieldNames = mapWhereFieldNames;
/* Used to map field names in values */ /* Used to map field names in values */
mapValueFieldNames: function (dataValues, fields, Model) { function mapValueFieldNames(dataValues, fields, Model) {
var values = {}; const values = {};
fields.forEach(function(attr) { for (const attr of fields) {
if (dataValues[attr] !== undefined && !Model._isVirtualAttribute(attr)) { if (dataValues[attr] !== undefined && !Model._isVirtualAttribute(attr)) {
// Field name mapping // Field name mapping
if (Model.rawAttributes[attr] && Model.rawAttributes[attr].field && Model.rawAttributes[attr].field !== attr) { if (Model.rawAttributes[attr] && Model.rawAttributes[attr].field && Model.rawAttributes[attr].field !== attr) {
...@@ -222,19 +252,21 @@ var Utils = module.exports = { ...@@ -222,19 +252,21 @@ var Utils = module.exports = {
values[attr] = dataValues[attr]; values[attr] = dataValues[attr];
} }
} }
}); }
return values; return values;
}, }
exports.mapValueFieldNames = mapValueFieldNames;
isColString: function(value) { function isColString(value) {
return typeof value === 'string' && value.substr(0, 1) === '$' && value.substr(value.length - 1, 1) === '$'; return typeof value === 'string' && value.substr(0, 1) === '$' && value.substr(value.length - 1, 1) === '$';
}, }
exports.isColString = isColString;
argsArePrimaryKeys: function(args, primaryKeys) { function argsArePrimaryKeys(args, primaryKeys) {
var result = (args.length === Object.keys(primaryKeys).length); let result = (args.length === Object.keys(primaryKeys).length);
if (result) { if (result) {
Utils._.each(args, function(arg) { _.each(args, arg => {
if (result) { if (result) {
if (['number', 'string'].indexOf(typeof arg) !== -1) { if (['number', 'string'].indexOf(typeof arg) !== -1) {
result = true; result = true;
...@@ -245,39 +277,46 @@ var Utils = module.exports = { ...@@ -245,39 +277,46 @@ var Utils = module.exports = {
}); });
} }
return result; return result;
}, }
canTreatArrayAsAnd: function(arr) { exports.argsArePrimaryKeys = argsArePrimaryKeys;
return arr.reduce(function(treatAsAnd, arg) {
function canTreatArrayAsAnd(arr) {
return arr.reduce((treatAsAnd, arg) => {
if (treatAsAnd) { if (treatAsAnd) {
return treatAsAnd; return treatAsAnd;
} else { } else {
return Utils._.isPlainObject(arg); return _.isPlainObject(arg);
} }
}, false); }, false);
}, }
exports.canTreatArrayAsAnd = canTreatArrayAsAnd;
combineTableNames: function(tableName1, tableName2) { function combineTableNames(tableName1, tableName2) {
return (tableName1.toLowerCase() < tableName2.toLowerCase()) ? (tableName1 + tableName2) : (tableName2 + tableName1); return (tableName1.toLowerCase() < tableName2.toLowerCase()) ? (tableName1 + tableName2) : (tableName2 + tableName1);
}, }
exports.combineTableNames = combineTableNames;
singularize: function(s) { function singularize(s) {
return inflection.singularize(s); return inflection.singularize(s);
}, }
exports.singularize = singularize;
pluralize: function(s) { function pluralize(s) {
return inflection.pluralize(s); return inflection.pluralize(s);
}, }
exports.pluralize = pluralize;
removeCommentsFromFunctionString: function(s) { function removeCommentsFromFunctionString(s) {
s = s.replace(/\s*(\/\/.*)/g, ''); s = s.replace(/\s*(\/\/.*)/g, '');
s = s.replace(/(\/\*[\n\r\s\S]*?\*\/)/mg, ''); s = s.replace(/(\/\*[\n\r\s\S]*?\*\/)/mg, '');
return s; return s;
}, }
exports.removeCommentsFromFunctionString = removeCommentsFromFunctionString;
toDefaultValue: function(value) { function toDefaultValue(value) {
if (typeof value === 'function') { if (typeof value === 'function') {
var tmp = value(); const tmp = value();
if (tmp instanceof DataTypes.ABSTRACT) { if (tmp instanceof DataTypes.ABSTRACT) {
return tmp.toSql(); return tmp.toSql();
} else { } else {
...@@ -288,22 +327,23 @@ var Utils = module.exports = { ...@@ -288,22 +327,23 @@ var Utils = module.exports = {
} else if (value instanceof DataTypes.UUIDV4) { } else if (value instanceof DataTypes.UUIDV4) {
return uuid.v4(); return uuid.v4();
} else if (value instanceof DataTypes.NOW) { } else if (value instanceof DataTypes.NOW) {
return Utils.now(); return now();
} else if(_.isPlainObject(value) || _.isArray(value)) { } else if(_.isPlainObject(value) || _.isArray(value)) {
return _.clone(value); return _.clone(value);
} else { } else {
return value; return value;
} }
}, }
exports.toDefaultValue = toDefaultValue;
/** /**
* Determine if the default value provided exists and can be described * Determine if the default value provided exists and can be described
* in a db schema using the DEFAULT directive. * in a db schema using the DEFAULT directive.
* *
* @param {*} value Any default value. * @param {*} value Any default value.
* @return {boolean} yes / no. * @return {boolean} yes / no.
*/ */
defaultValueSchemable: function(value) { function defaultValueSchemable(value) {
if (typeof value === 'undefined') { return false; } if (typeof value === 'undefined') { return false; }
// TODO this will be schemable when all supported db // TODO this will be schemable when all supported db
...@@ -317,18 +357,19 @@ var Utils = module.exports = { ...@@ -317,18 +357,19 @@ var Utils = module.exports = {
} }
return true; return true;
}, }
exports.defaultValueSchemable = defaultValueSchemable;
removeNullValuesFromHash: function(hash, omitNull, options) { function removeNullValuesFromHash(hash, omitNull, options) {
var result = hash; let result = hash;
options = options || {}; options = options || {};
options.allowNull = options.allowNull || []; options.allowNull = options.allowNull || [];
if (omitNull) { if (omitNull) {
var _hash = {}; const _hash = {};
Utils._.forIn(hash, function(val, key) { _.forIn(hash, (val, key) => {
if (options.allowNull.indexOf(key) > -1 || key.match(/Id$/) || ((val !== null) && (val !== undefined))) { if (options.allowNull.indexOf(key) > -1 || key.match(/Id$/) || ((val !== null) && (val !== undefined))) {
_hash[key] = val; _hash[key] = val;
} }
...@@ -338,97 +379,100 @@ var Utils = module.exports = { ...@@ -338,97 +379,100 @@ var Utils = module.exports = {
} }
return result; return result;
}, }
exports.removeNullValuesFromHash = removeNullValuesFromHash;
inherit: function(SubClass, SuperClass) {
if (SuperClass.constructor === Function) { function stack() {
// Normal Inheritance const orig = Error.prepareStackTrace;
SubClass.prototype = new SuperClass(); Error.prepareStackTrace = (_, stack) => stack;
SubClass.prototype.constructor = SubClass; const err = new Error();
SubClass.prototype.parent = SuperClass.prototype; Error.captureStackTrace(err, stack);
} else { const errStack = err.stack;
// Pure Virtual Inheritance
SubClass.prototype = SuperClass;
SubClass.prototype.constructor = SubClass;
SubClass.prototype.parent = SuperClass;
}
return SubClass;
},
stack: function _stackGrabber() {
var orig = Error.prepareStackTrace;
Error.prepareStackTrace = function(_, stack) { return stack; };
var err = new Error();
Error.captureStackTrace(err, _stackGrabber);
var errStack = err.stack;
Error.prepareStackTrace = orig; Error.prepareStackTrace = orig;
return errStack; return errStack;
}, }
exports.stack = stack;
sliceArgs: function (args, begin) { function sliceArgs(args, begin) {
begin = begin || 0; begin = begin || 0;
var tmp = new Array(args.length - begin); const tmp = new Array(args.length - begin);
for (var i = begin; i < args.length; ++i) { for (let i = begin; i < args.length; ++i) {
tmp[i - begin] = args[i]; tmp[i - begin] = args[i];
} }
return tmp; return tmp;
}, }
exports.sliceArgs = sliceArgs;
now: function(dialect) { function now(dialect) {
var now = new Date(); const now = new Date();
if (['postgres', 'sqlite'].indexOf(dialect) === -1) { if (['postgres', 'sqlite'].indexOf(dialect) === -1) {
now.setMilliseconds(0); now.setMilliseconds(0);
} }
return now; return now;
}, }
exports.now = now;
tick: function(func) {
var tick = (global.hasOwnProperty('setImmediate') ? global.setImmediate : process.nextTick); // Note: Use the `quoteIdentifier()` and `escape()` methods on the
tick(func); // `QueryInterface` instead for more portable code.
},
const TICK_CHAR = '`';
// Note: Use the `quoteIdentifier()` and `escape()` methods on the exports.TICK_CHAR = TICK_CHAR;
// `QueryInterface` instead for more portable code.
function addTicks(s, tickChar) {
TICK_CHAR: '`', tickChar = tickChar || TICK_CHAR;
addTicks: function(s, tickChar) { return tickChar + removeTicks(s, tickChar) + tickChar;
tickChar = tickChar || Utils.TICK_CHAR; }
return tickChar + Utils.removeTicks(s, tickChar) + tickChar; exports.addTicks = addTicks;
},
removeTicks: function(s, tickChar) { function removeTicks(s, tickChar) {
tickChar = tickChar || Utils.TICK_CHAR; tickChar = tickChar || TICK_CHAR;
return s.replace(new RegExp(tickChar, 'g'), ''); return s.replace(new RegExp(tickChar, 'g'), '');
}, }
exports.removeTicks = removeTicks;
/* /**
* Utility functions for representing SQL functions, and columns that should be escaped. * Utility functions for representing SQL functions, and columns that should be escaped.
* Please do not use these functions directly, use Sequelize.fn and Sequelize.col instead. * Please do not use these functions directly, use Sequelize.fn and Sequelize.col instead.
*/ */
fn: function(fn, args) { class Fn {
constructor(fn, args) {
this.fn = fn; this.fn = fn;
this.args = args; this.args = args;
}, }
clone() {
return new Fn(this.fn, this.args);
}
}
exports.Fn = Fn;
col: function(col) { class Col {
constructor(col) {
if (arguments.length > 1) { if (arguments.length > 1) {
col = this.sliceArgs(arguments); col = this.sliceArgs(arguments);
} }
this.col = col; this.col = col;
}, }
}
exports.Col = Col;
cast: function(val, type) { class Cast {
constructor(val, type) {
this.val = val; this.val = val;
this.type = (type || '').trim(); this.type = (type || '').trim();
}, }
}
exports.Cast = Cast;
literal: function(val) { class Literal {
constructor(val) {
this.val = val; this.val = val;
}, }
}
exports.Literal = Literal;
json: function(conditionsOrPath, value) { class Json {
if (Utils._.isObject(conditionsOrPath)) { constructor(conditionsOrPath, value) {
if (_.isObject(conditionsOrPath)) {
this.conditions = conditionsOrPath; this.conditions = conditionsOrPath;
} else { } else {
this.path = conditionsOrPath; this.path = conditionsOrPath;
...@@ -436,9 +480,12 @@ var Utils = module.exports = { ...@@ -436,9 +480,12 @@ var Utils = module.exports = {
this.value = value; this.value = value;
} }
} }
}, }
}
exports.Json = Json;
where: function(attribute, comparator, logic) { class Where {
constructor(attribute, comparator, logic) {
if (logic === undefined) { if (logic === undefined) {
logic = comparator; logic = comparator;
comparator = '='; comparator = '=';
...@@ -447,20 +494,15 @@ var Utils = module.exports = { ...@@ -447,20 +494,15 @@ var Utils = module.exports = {
this.attribute = attribute; this.attribute = attribute;
this.comparator = comparator; this.comparator = comparator;
this.logic = logic; this.logic = logic;
}, }
}
validateParameter: parameterValidator exports.Where = Where;
};
Utils.where.prototype._isSequelizeMethod =
Utils.literal.prototype._isSequelizeMethod =
Utils.cast.prototype._isSequelizeMethod =
Utils.fn.prototype._isSequelizeMethod =
Utils.col.prototype._isSequelizeMethod =
Utils.json.prototype._isSequelizeMethod = true;
Utils.fn.prototype.clone = function() { Where.prototype._isSequelizeMethod =
return new Utils.fn(this.fn, this.args); Literal.prototype._isSequelizeMethod =
}; Cast.prototype._isSequelizeMethod =
Fn.prototype._isSequelizeMethod =
Col.prototype._isSequelizeMethod =
Json.prototype._isSequelizeMethod = true;
Utils.Promise = require('./promise'); exports.validateParameter = parameterValidator;
...@@ -130,8 +130,8 @@ describe(Support.getTestDialectTeaser('DAO'), function() { ...@@ -130,8 +130,8 @@ describe(Support.getTestDialectTeaser('DAO'), function() {
b: self.sequelize.col('always_false') b: self.sequelize.col('always_false')
}); });
expect(user.get('d')).to.be.instanceof(self.sequelize.Utils.fn); expect(user.get('d')).to.be.instanceof(self.sequelize.Utils.Fn);
expect(user.get('b')).to.be.instanceof(self.sequelize.Utils.col); expect(user.get('b')).to.be.instanceof(self.sequelize.Utils.Col);
return user.save().then(function() { return user.save().then(function() {
return user.reload().then(function() { return user.reload().then(function() {
......
...@@ -195,23 +195,23 @@ describe(Support.getTestDialectTeaser('Utils'), function() { ...@@ -195,23 +195,23 @@ describe(Support.getTestDialectTeaser('Utils'), function() {
another_json_field: { x: 1 } another_json_field: { x: 1 }
}; };
var expected = "metadata#>>'{language}' = 'icelandic' and metadata#>>'{pg_rating,dk}' = 'G' and another_json_field#>>'{x}' = '1'"; var expected = "metadata#>>'{language}' = 'icelandic' and metadata#>>'{pg_rating,dk}' = 'G' and another_json_field#>>'{x}' = '1'";
expect(queryGenerator.handleSequelizeMethod(new Utils.json(conditions))).to.deep.equal(expected); expect(queryGenerator.handleSequelizeMethod(new Utils.Json(conditions))).to.deep.equal(expected);
}); });
it('successfully parses a string using dot notation', function() { it('successfully parses a string using dot notation', function() {
var path = 'metadata.pg_rating.dk'; var path = 'metadata.pg_rating.dk';
expect(queryGenerator.handleSequelizeMethod(new Utils.json(path))).to.equal("metadata#>>'{pg_rating,dk}'"); expect(queryGenerator.handleSequelizeMethod(new Utils.Json(path))).to.equal("metadata#>>'{pg_rating,dk}'");
}); });
it('allows postgres json syntax', function() { it('allows postgres json syntax', function() {
var path = 'metadata->pg_rating->>dk'; var path = 'metadata->pg_rating->>dk';
expect(queryGenerator.handleSequelizeMethod(new Utils.json(path))).to.equal(path); expect(queryGenerator.handleSequelizeMethod(new Utils.Json(path))).to.equal(path);
}); });
it('can take a value to compare against', function() { it('can take a value to compare against', function() {
var path = 'metadata.pg_rating.is'; var path = 'metadata.pg_rating.is';
var value = 'U'; var value = 'U';
expect(queryGenerator.handleSequelizeMethod(new Utils.json(path, value))).to.equal("metadata#>>'{pg_rating,is}' = 'U'"); expect(queryGenerator.handleSequelizeMethod(new Utils.Json(path, value))).to.equal("metadata#>>'{pg_rating,is}' = 'U'");
}); });
}); });
} }
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!