var scope = require('lexical-scope') module.exports = addWith function addWith(obj, src, exclude) { exclude = exclude || [] var objScope = scope(obj) exclude = exclude.concat(objScope.globals.implicit).concat(objScope.globals.exported) var s = scope('(function () {' + src + '}())')//allows the `return` keyword var vars = s.globals.implicit .filter(function (v) { return !(v in global) && 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 (s.globals.implicit.indexOf(local) != -1 || s.globals.exported.indexOf(local) != -1 || exclude.indexOf(local) != -1 || obj.indexOf(local) != -1) { local += '_' } declareLocal = local + ' = (' + obj + '),' } return 'var ' + declareLocal + vars .map(function (v) { return v + ' = ' + local + '.' + v }).join(',') + ';' + src }