Comparing version 0.0.6 to 0.1.0
71
index.js
'use strict'; | ||
var toString = Object.prototype.toString; | ||
/** | ||
@@ -7,13 +9,13 @@ * The properties that need should be on a valid description object. As defined | ||
* | ||
* @type {Array} | ||
* @type {Object} | ||
* @private | ||
*/ | ||
var description = [ | ||
'configurable', // Property may be changed or deleted. | ||
'enumerable', // Shows up in enumeration of the properties. | ||
'get', // A function that serves as a getter. | ||
'set', // A function that serves as a setter. | ||
'value', // Value associated with the property. | ||
'writable' // Property may be changed using assignment. | ||
]; | ||
var description = { | ||
configurable: 'boolean', // Property may be changed or deleted. | ||
enumerable: 'boolean', // Shows up in enumeration of the properties. | ||
get: 'function', // A function that serves as a getter. | ||
set: 'function', // A function that serves as a setter. | ||
value: undefined, // Value associated with the property. | ||
writable: 'boolean' // Property may be changed using assignment. | ||
}; | ||
@@ -32,4 +34,28 @@ /** | ||
// | ||
// A descriptor can only be a data or accessor descriptor, never both. | ||
// An data descriptor can only specify: | ||
// | ||
// - configurable | ||
// - enumerable | ||
// - (optional) value | ||
// - (optional) writable | ||
// | ||
// And an accessor descriptor can only specify; | ||
// | ||
// - configurable | ||
// - enumerable | ||
// - (optional) get | ||
// - (optional) set | ||
// | ||
if ( | ||
('value' in obj || 'writable' in obj) | ||
&& ('function' === typeof obj.set || 'function' === typeof obj.get) | ||
) return false; | ||
return !!keys.length && keys.every(function allowed(key) { | ||
return !!~description.indexOf(key); | ||
var type = description[key] | ||
, valid = type === undefined || is(obj[key], type); | ||
return key in description && valid; | ||
}); | ||
@@ -39,2 +65,14 @@ } | ||
/** | ||
* Get accurate type information for a given JavaScript thing. | ||
* | ||
* @param {Mixed} thing The thing we want to know. | ||
* @param {String} type The class | ||
* @returns {Boolean} | ||
* @api private | ||
*/ | ||
function is(thing, type) { | ||
return toString.call(thing).toLowerCase().slice(8, -1) === type; | ||
} | ||
/** | ||
* Predefine, preconfigure an Object.defineProperty. | ||
@@ -44,2 +82,3 @@ * | ||
* @param {Object} pattern The default description. | ||
* @param {Boolean} override Override the pattern. | ||
* @returns {Function} The function definition. | ||
@@ -56,5 +95,9 @@ * @api public | ||
// | ||
if (!predefine.descriptor(description)) description = { | ||
value: description | ||
}; | ||
if ( | ||
!predefine.descriptor(description) | ||
|| is(description, 'object') && !predefine.descriptor(predefine.mixin({}, pattern, description)) | ||
) { description = { | ||
value: description | ||
}; | ||
} | ||
@@ -71,3 +114,3 @@ // | ||
Object.defineProperty(obj, method, !clean | ||
? predefine.mixin(pattern, description) | ||
? predefine.mixin({}, pattern, description) | ||
: description | ||
@@ -74,0 +117,0 @@ ); |
{ | ||
"name": "predefine", | ||
"version": "0.0.6", | ||
"version": "0.1.0", | ||
"description": "Predefine your Object.defineProperties to create a more human readable API.", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
@@ -34,2 +34,11 @@ describe('predefine', function () { | ||
expect(Object.keys(obj).length).to.equal(0); | ||
readable('cache', { | ||
get: function () { }, | ||
set: function () { } | ||
}); | ||
expect(obj.cache).to.be.a('object'); | ||
expect(obj.cache.get).to.be.a('function'); | ||
expect(obj.cache.set).to.be.a('function'); | ||
}); | ||
@@ -74,2 +83,22 @@ | ||
})).to.equal(true); | ||
expect(predefine.descriptor({ | ||
set: function() {}, | ||
get: function() {} | ||
})).to.equal(true); | ||
expect(predefine.descriptor({ | ||
set: function() {}, | ||
get: function() {}, | ||
value: 'foo' | ||
})).to.equal(false); | ||
expect(predefine.descriptor({ | ||
set: true, | ||
get: false, | ||
})).to.equal(false); | ||
expect(predefine.descriptor({ | ||
enumerable: function () {} | ||
})).to.equal(false); | ||
}); | ||
@@ -76,0 +105,0 @@ |
16808
419