Comparing version 2.1.13 to 2.1.14
@@ -0,1 +1,5 @@ | ||
### v2.1.14 - 22 May 2014 | ||
- Allow explicitly specifying `key: true` on properties rather than passing in an array of ids. | ||
- Fix Property.mapsTo (#506) | ||
### v2.1.13 - 21 May 2014 | ||
@@ -2,0 +6,0 @@ - Dont modify array passed to execQuery |
@@ -58,5 +58,5 @@ var ORMError = require("./Error"); | ||
if (Array.isArray(arguments[0])) { | ||
opts.properties = opts.properties.concat(arguments[0]); | ||
opts.propertyList = opts.propertyList.concat(arguments[0]); | ||
} else { | ||
opts.properties = opts.properties.concat(Array.prototype.slice.apply(arguments)); | ||
opts.propertyList = opts.propertyList.concat(Array.prototype.slice.apply(arguments)); | ||
} | ||
@@ -101,3 +101,3 @@ return this; | ||
var query = opts.driver.getQuery().select().from(opts.table).select(opts.properties); | ||
var query = opts.driver.getQuery().select().from(opts.table).select(opts.propertyList); | ||
var i, j; | ||
@@ -104,0 +104,0 @@ |
@@ -11,3 +11,3 @@ var _ = require("lodash"); | ||
Model.hasMany = function () { | ||
var name; | ||
var name, makeKey, mergeId, mergeAssocId; | ||
var OtherModel = Model; | ||
@@ -45,2 +45,16 @@ var props = null; | ||
makeKey = opts.key || Settings.defaults().hasMany.key; | ||
mergeId = util.convertPropToJoinKeyProp( | ||
util.wrapFieldObject(opts.mergeId, OtherModel, Model.table, OtherModel.properties) || | ||
util.formatField(OtherModel, Model.table, true, opts.reversed), | ||
{ makeKey: makeKey, required: true } | ||
); | ||
mergeAssocId = util.convertPropToJoinKeyProp( | ||
util.wrapFieldObject(opts.mergeAssocId, Model, name, Model.properties) || | ||
util.formatField(Model, name, true, opts.reversed), | ||
{ makeKey: makeKey, required: true } | ||
) | ||
var assocName = opts.name || ucfirst(name); | ||
@@ -58,4 +72,4 @@ var assocTemplateName = opts.accessor || assocName; | ||
mergeTable : opts.mergeTable || (Model.table + "_" + name), | ||
mergeId : util.wrapFieldObject(opts.mergeId, OtherModel, Model.table, OtherModel.properties) || util.formatField(OtherModel, Model.table, true, opts.reversed), | ||
mergeAssocId : util.wrapFieldObject(opts.mergeAssocId, Model, name, Model.properties) || util.formatField(Model, name, true, opts.reversed), | ||
mergeId : mergeId, | ||
mergeAssocId : mergeAssocId, | ||
getAccessor : opts.getAccessor || ("get" + assocTemplateName), | ||
@@ -62,0 +76,0 @@ setAccessor : opts.setAccessor || ("set" + assocTemplateName), |
@@ -44,2 +44,3 @@ var _ = require("lodash"); | ||
} | ||
util.convertPropToJoinKeyProp(association.field, { makeKey: false, required: false }); | ||
for (var k in Accessors) { | ||
@@ -46,0 +47,0 @@ if (!association.hasOwnProperty(k + "Accessor")) { |
var _ = require("lodash"); | ||
var Utilities = require("./Utilities"); | ||
var ChainInstance = require("./ChainInstance"); | ||
@@ -48,3 +49,3 @@ var Promise = require("./Promise").Promise; | ||
} | ||
this.only(_.difference(Object.keys(Model.allProperties), omit)); | ||
this.only(_.difference(Object.keys(opts.properties), omit)); | ||
return this; | ||
@@ -174,5 +175,14 @@ }, | ||
all: function (cb) { | ||
opts.driver.find(opts.only, opts.table, opts.conditions, { | ||
var order, conditions; | ||
conditions = Utilities.transformPropertyNames( | ||
opts.conditions, opts.properties | ||
); | ||
order = Utilities.transformOrderPropertyNames( | ||
opts.order, opts.properties | ||
); | ||
opts.driver.find(opts.only, opts.table, conditions, { | ||
limit : opts.limit, | ||
order : opts.order, | ||
order : order, | ||
merge : opts.merge, | ||
@@ -179,0 +189,0 @@ offset : opts.offset, |
@@ -267,3 +267,6 @@ var Utilities = require("../../Utilities"); | ||
options.order[0] = options.order[0][1]; | ||
options.order = Utilities.standardizeOrder(options.order); | ||
options.order = Utilities.transformOrderPropertyNames( | ||
Utilities.standardizeOrder(options.order), | ||
Model.allProperties | ||
); | ||
} | ||
@@ -270,0 +273,0 @@ |
@@ -1,4 +0,5 @@ | ||
var Property = require("./Property"); | ||
var Hook = require("./Hook"); | ||
var enforce = require("enforce"); | ||
var Utilities = require("./Utilities"); | ||
var Property = require("./Property"); | ||
var Hook = require("./Hook"); | ||
var enforce = require("enforce"); | ||
@@ -159,5 +160,5 @@ exports.Instance = Instance; | ||
if (opts.driver.propertyToValue) { | ||
data[prop.mapsTo] = opts.driver.propertyToValue(opts.data[k], prop); | ||
data[k] = opts.driver.propertyToValue(opts.data[k], prop); | ||
} else { | ||
data[prop.mapsTo] = opts.data[k]; | ||
data[k] = opts.data[k]; | ||
} | ||
@@ -195,2 +196,4 @@ } else { | ||
data = Utilities.transformPropertyNames(data, Model.allProperties); | ||
opts.driver.insert(opts.table, data, opts.id, function (save_err, info) { | ||
@@ -253,2 +256,4 @@ if (save_err) { | ||
} | ||
changes = Utilities.transformPropertyNames(changes, Model.allProperties); | ||
opts.driver.update(opts.table, changes, conditions, function (err) { | ||
@@ -255,0 +260,0 @@ if (err) { |
@@ -0,1 +1,2 @@ | ||
var _ = require("lodash"); | ||
var ChainFind = require("./ChainFind"); | ||
@@ -25,8 +26,7 @@ var Instance = require("./Instance").Instance; | ||
function Model(opts) { | ||
opts = opts || {}; | ||
opts = _.defaults(opts || {}, { | ||
id: [] | ||
}); | ||
opts.id = Array.isArray(opts.id) ? opts.id : [opts.id]; | ||
if (!Array.isArray(opts.id)) { | ||
opts.id = [ opts.id ]; | ||
} | ||
var one_associations = []; | ||
@@ -114,3 +114,4 @@ var many_associations = []; | ||
association_properties : association_properties, | ||
setupAssociations : setupAssociations | ||
setupAssociations : setupAssociations, | ||
fieldToPropertyMap : fieldToPropertyMap | ||
}); | ||
@@ -148,14 +149,2 @@ instance.on("ready", function (err) { | ||
var mapDatastoreFieldsToProperties = function (dataIn) { | ||
var k, prop; | ||
var dataOut = {}; | ||
for (k in dataIn) { | ||
prop = fieldToPropertyMap[k]; | ||
if (!prop) dataOut[k] = dataIn[k]; | ||
else dataOut[prop.name] = dataIn[k]; | ||
} | ||
return dataOut; | ||
} | ||
var model = function () { | ||
@@ -305,3 +294,3 @@ var instance, i; | ||
data = mapDatastoreFieldsToProperties(data[0]); | ||
Utilities.renameDatastoreFieldsToPropertyNames(data[0], fieldToPropertyMap); | ||
@@ -314,3 +303,3 @@ var uid = opts.driver.uid + "/" + opts.table + "/" + ids.join("/"); | ||
}, function (cb) { | ||
return createInstance(data, { | ||
return createInstance(data[0], { | ||
uid : uid, | ||
@@ -407,2 +396,3 @@ autoSave : options.autoSave, | ||
offset : options.offset, | ||
properties : allProperties, | ||
newInstance : function (data, cb) { | ||
@@ -414,2 +404,4 @@ var uid = opts.driver.uid + "/" + opts.table + (merge ? "+" + merge.from.table : ""); | ||
Utilities.renameDatastoreFieldsToPropertyNames(data, fieldToPropertyMap); | ||
Singleton.get(uid, { | ||
@@ -505,3 +497,3 @@ cache : options.cache, | ||
var conditions = {}; | ||
var properties = []; | ||
var propertyList = []; | ||
@@ -511,3 +503,3 @@ for (var i = 0; i < arguments.length; i++) { | ||
if (Array.isArray(arguments[i])) { | ||
properties = arguments[i]; | ||
propertyList = arguments[i]; | ||
} else { | ||
@@ -524,7 +516,8 @@ conditions = arguments[i]; | ||
return new require("./AggregateFunctions")({ | ||
table : opts.table, | ||
driver_name : opts.driver_name, | ||
driver : opts.driver, | ||
conditions : conditions, | ||
properties : properties | ||
table : opts.table, | ||
driver_name : opts.driver_name, | ||
driver : opts.driver, | ||
conditions : conditions, | ||
propertyList : propertyList, | ||
properties : allProperties | ||
}); | ||
@@ -658,4 +651,14 @@ }; | ||
var currFields = {}, cType; | ||
var currFields = {}, cType, name; | ||
// If no keys are defined add the default one | ||
if (opts.id.length == 0 && !_.any(opts.properties, { key: true })) { | ||
name = opts.settings.get("properties.primary_key"); | ||
opts.properties[name] = Property.normalize({ | ||
prop: { type: 'serial', key: true, required: false, klass: 'key' }, | ||
name: name, customTypes: opts.db.customTypes, settings: opts.settings | ||
}); | ||
} | ||
// standardize properties | ||
@@ -673,3 +676,6 @@ for (k in opts.properties) { | ||
prop.key = true; | ||
} else if (prop.key) { | ||
opts.id.push(k); | ||
} | ||
if (prop.lazyload !== true && !currFields[k]) { | ||
@@ -695,12 +701,2 @@ currFields[k] = true; | ||
for (var i = 0; i < opts.id.length; i++) { | ||
k = opts.id[i]; | ||
allProperties[k] = opts.properties[k] || Property.normalize({ | ||
prop: { type: 'serial', key: true, klass: 'key' }, | ||
name: k, customTypes: opts.db.customTypes, settings: opts.settings | ||
}); | ||
fieldToPropertyMap[allProperties[k].mapsTo] = allProperties[k]; | ||
} | ||
model_fields = opts.id.concat(model_fields); | ||
// setup hooks | ||
@@ -707,0 +703,0 @@ for (k in AvailableHooks) { |
@@ -229,3 +229,3 @@ var util = require("util"); | ||
cache : opts.hasOwnProperty("cache") ? opts.cache : this.settings.get("instance.cache"), | ||
id : opts.id || this.settings.get("properties.primary_key"), | ||
id : opts.id,// || this.settings.get("properties.primary_key"), | ||
autoSave : opts.hasOwnProperty("autoSave") ? opts.autoSave : this.settings.get("instance.autoSave"), | ||
@@ -232,0 +232,0 @@ autoFetch : opts.hasOwnProperty("autoFetch") ? opts.autoFetch : this.settings.get("instance.autoFetch"), |
@@ -17,2 +17,6 @@ var _ = require('lodash'); | ||
}, | ||
hasMany : { | ||
// Makes the foreign key fields a composite key | ||
key : false | ||
}, | ||
connection : { | ||
@@ -19,0 +23,0 @@ reconnect : true, |
@@ -237,2 +237,25 @@ _ = require('lodash') | ||
// If the parent associations key is `serial`, the join tables | ||
// key should be changed to `integer`. | ||
exports.convertPropToJoinKeyProp = function (props, opts) { | ||
var prop; | ||
for (var k in props) { | ||
prop = props[k]; | ||
prop.required = opts.required; | ||
if (prop.type == 'serial') { | ||
prop.type = 'integer'; | ||
} | ||
if (opts.makeKey) { | ||
prop.key = true; | ||
} else { | ||
delete prop.key; | ||
} | ||
} | ||
return props; | ||
} | ||
exports.getRealPath = function (path_str, stack_index) { | ||
@@ -261,1 +284,54 @@ var path = require("path"); // for now, load here (only when needed) | ||
}; | ||
exports.transformPropertyNames = function (dataIn, properties) { | ||
var k, prop; | ||
var dataOut = {}; | ||
for (k in dataIn) { | ||
prop = properties[k]; | ||
if (prop) { | ||
dataOut[prop.mapsTo] = dataIn[k]; | ||
} else { | ||
dataOut[k] = dataIn[k]; | ||
} | ||
} | ||
return dataOut; | ||
}; | ||
exports.transformOrderPropertyNames = function (order, properties) { | ||
if (!order) return order; | ||
var i, item; | ||
var newOrder = JSON.parse(JSON.stringify(order)); | ||
// Rename order properties according to mapsTo | ||
for (var i = 0; i < newOrder.length; i++) { | ||
item = newOrder[i]; | ||
// orderRaw | ||
if (Array.isArray(item[1])) continue; | ||
if (Array.isArray(item[0])) { | ||
// order on a hasMany | ||
// [ ['modelName', 'propName'], 'Z'] | ||
item[0][1] = properties[item[0][1]].mapsTo; | ||
} else { | ||
// normal order | ||
item[0] = properties[item[0]].mapsTo; | ||
} | ||
} | ||
return newOrder; | ||
} | ||
exports.renameDatastoreFieldsToPropertyNames = function (data, fieldToPropertyMap) { | ||
var k, prop; | ||
for (k in data) { | ||
prop = fieldToPropertyMap[k]; | ||
if (prop && prop.name != k) { | ||
data[prop.name] = data[k]; | ||
delete data[k]; | ||
} | ||
} | ||
return data; | ||
} |
@@ -15,3 +15,3 @@ { | ||
], | ||
"version" : "2.1.13", | ||
"version" : "2.1.14", | ||
"license" : "MIT", | ||
@@ -41,4 +41,4 @@ "homepage" : "http://dresende.github.io/node-orm2", | ||
"enforce" : "0.1.2", | ||
"sql-query" : "git://github.com/dresende/node-sql-query.git#v0.1.20", | ||
"sql-ddl-sync" : "git://github.com/dresende/node-sql-ddl-sync.git#v0.3.6", | ||
"sql-query" : "git+https://github.com/dresende/node-sql-query.git#v0.1.21", | ||
"sql-ddl-sync" : "git+https://github.com/dresende/node-sql-ddl-sync.git#v0.3.6", | ||
"hat" : "0.0.3", | ||
@@ -45,0 +45,0 @@ "lodash" : "2.4.1" |
@@ -235,13 +235,12 @@ ## Object Relational Mapping | ||
For example, each Model instance has a unique ID in the database. This table column is | ||
by default "id" but you can change it. | ||
For example, each Model instance has a unique ID in the database. This table column is added automatically, and called "id" by default.<br/> | ||
If you define your own `key: true` column, "id" will not be added: | ||
```js | ||
var Person = db.define("person", { | ||
name : String | ||
}, { | ||
id : "person_id" | ||
personId : { type: 'serial', key: true }, | ||
name : String | ||
}); | ||
// or just do it globally.. | ||
// You can also change the default "id" property name globally: | ||
db.settings.set("properties.primary_key", "UID"); | ||
@@ -257,10 +256,8 @@ | ||
It is also possible to have multiple IDs for a model in the database, this is done by specifying an array of IDs to use. | ||
It's also possible to have composite keys: | ||
```js | ||
var Person = db.define("person", { | ||
firstname: String, | ||
lastname: String | ||
}, { | ||
id: ['firstname', 'lastname'] | ||
firstname : { type: 'string', key: true }, | ||
lastname : { type: 'string', key: true } | ||
}); | ||
@@ -267,0 +264,0 @@ ``` |
Git dependency
Supply chain riskContains a dependency which resolves to a remote git URL. Dependencies fetched from git URLs are not immutable and can be used to inject untrusted code or reduce the likelihood of a reproducible install.
Found 2 instances in 1 package
Git dependency
Supply chain riskContains a dependency which resolves to a remote git URL. Dependencies fetched from git URLs are not immutable and can be used to inject untrusted code or reduce the likelihood of a reproducible install.
Found 2 instances in 1 package
229606
63
5855
839