diff --git a/shell.js b/shell.js index ad442ba..08fb00f 100644 --- a/shell.js +++ b/shell.js @@ -19,7 +19,15 @@ var version = require('./package.json').version var sublevel = module.exports = function (nut, prefix, createStream, options) { var emitter = new EventEmitter() - emitter.sublevels = {} + emitter._sublevels = {} + emitter.__defineGetter__("sublevels", function(){ + var result = {} + for (var k in this._sublevels) { + result[k.substring(1)] = this._sublevels[k] + } + return result + }) + emitter.options = options emitter.version = version @@ -35,10 +43,10 @@ var sublevel = module.exports = function (nut, prefix, createStream, options) { var o = {} if(options) for(var k in options) - if(options[k] != undefined)o[k] = options[k] + if(options[k] !== undefined)o[k] = options[k] if(opts) for(var k in opts) - if(opts[k] != undefined) o[k] = opts[k] + if(opts[k] !== undefined) o[k] = opts[k] return o } @@ -104,8 +112,8 @@ var sublevel = module.exports = function (nut, prefix, createStream, options) { } emitter.sublevel = function (name, opts) { - return emitter.sublevels[name] = - emitter.sublevels[name] || sublevel(nut, prefix.concat(name), createStream, mergeOpts(opts)) + return emitter._sublevels['$' + name] = + emitter._sublevels['$' + name] || sublevel(nut, prefix.concat(name), createStream, mergeOpts(opts)) } emitter.pre = function (key, hook) { diff --git a/test/special-names.js b/test/special-names.js new file mode 100644 index 0000000..e8ab347 --- /dev/null +++ b/test/special-names.js @@ -0,0 +1,52 @@ +var levelup = require('level-test')() + +var base = require('../')(levelup('test-sublevels')) + +var test = require('tape') + +test('special names', function (t) { + t.deepEqual(base.sublevels, {}) + + var cons = base.sublevel('constructor') + var proto = base.sublevel('__proto__') + var toString = base.sublevel('toString') + + t.deepEqual(base._sublevels, { + '$constructor': cons, + '$__proto__': proto, + '$toString': toString + }) + t.deepEqual(base.sublevels, { + 'constructor': cons, + '__proto__': proto, + 'toString': toString + }) + t.deepEqual(cons.sublevels, {}) + + t.strictEqual(base.sublevel('constructor'), cons) + t.strictEqual(base.sublevel('__proto__'), proto) + t.strictEqual(base.sublevel('toString'), toString) + + t.deepEqual(cons.prefix(), ['constructor']) + t.deepEqual(proto.prefix(), ['__proto__']) + t.deepEqual(toString.prefix(), ['toString']) + + var consBlerg = cons.sublevel('blerg') + t.deepEqual(cons._sublevels, {'$blerg': consBlerg}) + t.deepEqual(cons.sublevels, {'blerg': consBlerg}) + t.strictEqual(cons.sublevel('blerg'), consBlerg) + t.deepEqual(consBlerg.prefix(), ['constructor', 'blerg']) + + var consProto = cons.sublevel('__proto__') + t.deepEqual(cons._sublevels, {'$blerg': consBlerg, '$__proto__': consProto}) + t.deepEqual(cons.sublevels, {'blerg': consBlerg, '__proto__': consProto}) + t.strictEqual(cons.sublevel('__proto__'), consProto) + t.deepEqual(consProto.prefix(), ['constructor', '__proto__']) + + t.end() +}) + + + + +