var uglify = require('uglify-js') var globalVars = require('./vars') module.exports = addWith function addWith(obj, src, exclude, environments) { environments = environments || ['reservedVars', 'ecmaIdentifiers', 'nonstandard', 'node'] exclude = exclude || [] exclude = exclude.concat(detect(obj)) var vars = detect('(function () {' + src + '}())')//allows the `return` keyword .filter(function (v) { for (var i = 0; i < environments.length; i++) { if (v in globalVars[environments[i]]) { return false; } } return exclude.indexOf(v) === -1 }) if (vars.length === 0) return src var declareLocal = '' var local = 'locals' if (/^[a-zA-Z0-9$_]+$/.test(obj)) { local = obj } else { while (vars.indexOf(local) != -1 || exclude.indexOf(local) != -1) { local += '_' } declareLocal = local + ' = (' + obj + '),' } return 'var ' + declareLocal + vars .map(function (v) { return v + ' = ' + local + '.' + v }).join(',') + ';' + src } function detect(src) { var ast = uglify.parse(src.toString()) ast.figure_out_scope() var globals = ast.globals .map(function (node, name) { return name }) return globals; }