Created
September 17, 2012 17:47
-
-
Save cowboy/3738726 to your computer and use it in GitHub Desktop.
grunt config idea: insanity?
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var grunt = {}; | |
// http://twitter.com/cowboy/status/247745191287611392 | |
var isObject = function(val) { | |
return val === function() { return this; }.call(val); | |
}; | |
var config = function(prop, val) { | |
var method = arguments.length === 2 ? 'set' : 'get'; | |
return config.__proto__[method].apply(null, arguments); | |
}; | |
config.__proto__ = { | |
toString: function() { | |
var obj = {}; | |
for (var prop in config) { obj[prop] = config[prop]; } | |
return JSON.stringify(obj); | |
}, | |
get: function(prop) { | |
var obj = config; | |
var parts = Array.isArray(prop) ? prop : String(prop).split('.'); | |
for (var i = 0; obj && i < parts.length; i++) { | |
obj = obj[parts[i]]; | |
} | |
return obj; | |
}, | |
set: function(prop, val) { | |
var obj = config; | |
var parts = Array.isArray(prop) ? prop : String(prop).split('.'); | |
for (var i = 0; i < parts.length - 1; i++) { | |
if (!(parts[i] in obj)) { obj[parts[i]] = {}; } | |
obj = obj[parts[i]]; | |
if (!isObject(obj)) { return false; } | |
} | |
obj[parts[i]] = val; | |
return true; | |
}, | |
}; | |
Object.defineProperty(grunt, 'config', { | |
set: function(obj) { | |
var prop; | |
for (prop in config) { delete config[prop]; } | |
for (prop in obj) { config[prop] = obj[prop]; } | |
}, | |
get: function() { | |
return config; | |
} | |
}); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Define the config. | |
grunt.config = { | |
prop: 'value', | |
prop2: { | |
a: [1, 2, 3] | |
}, | |
}; | |
// Amend the config. | |
grunt.config.prop3 = 678; | |
// Whole config, stringified | |
console.log('grunt.config', grunt.config); | |
// Get and set properties via "normal" dot syntax | |
console.log('grunt.config.prop', grunt.config.prop); | |
console.log('grunt.config.prop2', grunt.config.prop2); | |
console.log('grunt.config.prop2.a', grunt.config.prop2.a); | |
console.log('grunt.config.prop2.a.b', grunt.config.prop2.a.b); | |
grunt.config.prop2.a.b = 123; | |
console.log('grunt.config.prop2.a.b', grunt.config.prop2.a.b); | |
// Get properties via namespace string, implicitly | |
console.log('grunt.config("prop")', grunt.config('prop')); | |
console.log('grunt.config("prop2")', grunt.config('prop2')); | |
// Using explicit .get method | |
console.log('grunt.config.get("prop2.a")', grunt.config.get('prop2.a')); | |
console.log('grunt.config.get("prop2.a.b")', grunt.config.get('prop2.a.b')); | |
// Set properties via namespace string, implicitly | |
console.log('grunt.config("prop", 10)', grunt.config('prop', 10)); | |
console.log('grunt.config("prop.x", 11)', grunt.config('prop.x', 11)); | |
console.log('grunt.config("x.y.z", 12)', grunt.config('x.y.z', 12)); | |
console.log('grunt.config("prop2.a.x", 13)', grunt.config('prop2.b.x', 13)); | |
// Using explicit .set method | |
console.log('grunt.config.set("prop2.a.b.x", 14)', grunt.config.set('prop2.b.c.x', 14)); | |
console.log('grunt.config.set("x.y.z.foo", 15)', grunt.config.set('x.y.z.foo', 15)); | |
console.log('grunt.config.set("x.y.z.foo.bar", 16)', grunt.config.set('x.y.z.foo.bar', 16)); | |
// Whole config, stringified | |
console.log('grunt.config', grunt.config); |
tkellen
commented
Sep 17, 2012
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment