wrapup
Version:
wraps up node packages for web development
128 lines (108 loc) • 3.39 kB
JavaScript
;
var path = require('path')
var fs = require('fs')
var esprima = require('esprima')
var type = require('prime/type')
var empty = function(object){
for (var k in object) return false
return true
}
var slice = Array.prototype.slice
var noop = function(){}
var throttle = function(fn){
var timer
return function(){
var args = arguments
clearTimeout(timer)
timer = setTimeout(function(){
fn.apply(null, args)
}, 10)
}
}
var relative = function(file){
return path.relative(process.cwd(), file)
}
var relativeID = function(from, to){
var file = path.relative(path.dirname(from), to)
if (file[0] != '.') file = './' + file
return (path.extname(file) == '.js') ? file.slice(0, -3) : file
}
var inPath = function(filepath, file){
return path.relative(filepath, file).slice(0, 2) != '..'
}
var cache = {}
var getAST = function(name, dir){
if (!dir) dir = __dirname + '/../includes'
return function(callback){
if (cache[name]) return callback(null, cache[name])
fs.readFile(dir + '/' + name + '.js', 'utf-8', function(err, code){
if (err) return callback(err)
try { cache[name] = esprima.parse(code) }
catch (e){ err = e }
callback(err, cache[name])
})
}
}
var appendWalkerPath = function(path, key){
return (path ? path + '.' : '') + key
}
var astWalker = function(ast, action){
var walker = function(ast, parent, key, path){
if (action(ast, parent, key, path)){
} else if (Array.isArray(ast)){
for (var i = 0; i < ast.length; i++) walker(ast[i], ast, i, appendWalkerPath(path, i))
} else if (typeof ast == 'object'){
for (var j in ast) walker(ast[j], ast, j, appendWalkerPath(path, j))
}
}
walker(ast)
}
// thanks MooTools!
var cloneOf = function(item){
switch (type(item)){
case 'array' : return cloneArray(item)
case 'object' : return cloneObject(item)
default : return item
}
}
var cloneObject = function(object){
var clone = {}
for (var key in object) clone[key] = cloneOf(object[key])
return clone
}
var cloneArray = function(array){
var i = array.length, clone = new Array(i)
while (i--) clone[i] = cloneOf(array[i])
return clone
}
var merge = function(object, key, value){
if (typeof key == 'string'){
if (type(object[key]) == 'object' && type(value[key]) == 'object'){
merge(object[key], value)
} else object[key] = value
} else for (var i = 0; i < arguments.length; i++){
var obj = arguments[i]
for (var k in obj) merge(object, k, obj[k])
}
return object
}
var getFromPath = function(object, parts){
if (typeof parts == 'string') parts = parts.split('.')
for (var i = 0, l = parts.length; i < l; i++){
if (object[parts[i]] != null) object = object[parts[i]]
else return null
}
return object
}
exports.empty = empty
exports.slice = slice
exports.noop = noop
exports.throttle = throttle
exports.relative = relative
exports.relativeID = relativeID
exports.inPath = inPath
exports.getAST = getAST
exports.astWalker = astWalker
exports.clone = cloneOf
exports.merge = merge
exports.getFromPath = getFromPath