diff options
Diffstat (limited to 'node_modules/pseudomap')
| -rw-r--r-- | node_modules/pseudomap/LICENSE | 15 | ||||
| -rw-r--r-- | node_modules/pseudomap/README.md | 60 | ||||
| -rw-r--r-- | node_modules/pseudomap/map.js | 9 | ||||
| -rw-r--r-- | node_modules/pseudomap/package.json | 25 | ||||
| -rw-r--r-- | node_modules/pseudomap/pseudomap.js | 113 | ||||
| -rw-r--r-- | node_modules/pseudomap/test/basic.js | 86 | 
6 files changed, 308 insertions, 0 deletions
diff --git a/node_modules/pseudomap/LICENSE b/node_modules/pseudomap/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/node_modules/pseudomap/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/pseudomap/README.md b/node_modules/pseudomap/README.md new file mode 100644 index 0000000..778bf01 --- /dev/null +++ b/node_modules/pseudomap/README.md @@ -0,0 +1,60 @@ +# pseudomap + +A thing that is a lot like ES6 `Map`, but without iterators, for use +in environments where `for..of` syntax and `Map` are not available. + +If you need iterators, or just in general a more faithful polyfill to +ES6 Maps, check out [es6-map](http://npm.im/es6-map). + +If you are in an environment where `Map` is supported, then that will +be returned instead, unless `process.env.TEST_PSEUDOMAP` is set. + +You can use any value as keys, and any value as data.  Setting again +with the identical key will overwrite the previous value. + +Internally, data is stored on an `Object.create(null)` style object. +The key is coerced to a string to generate the key on the internal +data-bag object.  The original key used is stored along with the data. + +In the event of a stringified-key collision, a new key is generated by +appending an increasing number to the stringified-key until finding +either the intended key or an empty spot. + +Note that because object traversal order of plain objects is not +guaranteed to be identical to insertion order, the insertion order +guarantee of `Map.prototype.forEach` is not guaranteed in this +implementation.  However, in all versions of Node.js and V8 where this +module works, `forEach` does traverse data in insertion order. + +## API + +Most of the [Map +API](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map), +with the following exceptions: + +1. A `Map` object is not an iterator. +2. `values`, `keys`, and `entries` methods are not implemented, +   because they return iterators. +3. The argument to the constructor can be an Array of `[key, value]` +   pairs, or a `Map` or `PseudoMap` object.  But, since iterators +   aren't used, passing any plain-old iterator won't initialize the +   map properly. + +## USAGE + +Use just like a regular ES6 Map. + +```javascript +var PseudoMap = require('pseudomap') + +// optionally provide a pseudomap, or an array of [key,value] pairs +// as the argument to initialize the map with +var myMap = new PseudoMap() + +myMap.set(1, 'number 1') +myMap.set('1', 'string 1') +var akey = {} +var bkey = {} +myMap.set(akey, { some: 'data' }) +myMap.set(bkey, { some: 'other data' }) +``` diff --git a/node_modules/pseudomap/map.js b/node_modules/pseudomap/map.js new file mode 100644 index 0000000..7db1599 --- /dev/null +++ b/node_modules/pseudomap/map.js @@ -0,0 +1,9 @@ +if (process.env.npm_package_name === 'pseudomap' && +    process.env.npm_lifecycle_script === 'test') +  process.env.TEST_PSEUDOMAP = 'true' + +if (typeof Map === 'function' && !process.env.TEST_PSEUDOMAP) { +  module.exports = Map +} else { +  module.exports = require('./pseudomap') +} diff --git a/node_modules/pseudomap/package.json b/node_modules/pseudomap/package.json new file mode 100644 index 0000000..4b02ab7 --- /dev/null +++ b/node_modules/pseudomap/package.json @@ -0,0 +1,25 @@ +{ +  "name": "pseudomap", +  "version": "1.0.2", +  "description": "A thing that is a lot like ES6 `Map`, but without iterators, for use in environments where `for..of` syntax and `Map` are not available.", +  "main": "map.js", +  "directories": { +    "test": "test" +  }, +  "devDependencies": { +    "tap": "^2.3.1" +  }, +  "scripts": { +    "test": "tap test/*.js" +  }, +  "repository": { +    "type": "git", +    "url": "git+https://github.com/isaacs/pseudomap.git" +  }, +  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)", +  "license": "ISC", +  "bugs": { +    "url": "https://github.com/isaacs/pseudomap/issues" +  }, +  "homepage": "https://github.com/isaacs/pseudomap#readme" +} diff --git a/node_modules/pseudomap/pseudomap.js b/node_modules/pseudomap/pseudomap.js new file mode 100644 index 0000000..25a21d8 --- /dev/null +++ b/node_modules/pseudomap/pseudomap.js @@ -0,0 +1,113 @@ +var hasOwnProperty = Object.prototype.hasOwnProperty + +module.exports = PseudoMap + +function PseudoMap (set) { +  if (!(this instanceof PseudoMap)) // whyyyyyyy +    throw new TypeError("Constructor PseudoMap requires 'new'") + +  this.clear() + +  if (set) { +    if ((set instanceof PseudoMap) || +        (typeof Map === 'function' && set instanceof Map)) +      set.forEach(function (value, key) { +        this.set(key, value) +      }, this) +    else if (Array.isArray(set)) +      set.forEach(function (kv) { +        this.set(kv[0], kv[1]) +      }, this) +    else +      throw new TypeError('invalid argument') +  } +} + +PseudoMap.prototype.forEach = function (fn, thisp) { +  thisp = thisp || this +  Object.keys(this._data).forEach(function (k) { +    if (k !== 'size') +      fn.call(thisp, this._data[k].value, this._data[k].key) +  }, this) +} + +PseudoMap.prototype.has = function (k) { +  return !!find(this._data, k) +} + +PseudoMap.prototype.get = function (k) { +  var res = find(this._data, k) +  return res && res.value +} + +PseudoMap.prototype.set = function (k, v) { +  set(this._data, k, v) +} + +PseudoMap.prototype.delete = function (k) { +  var res = find(this._data, k) +  if (res) { +    delete this._data[res._index] +    this._data.size-- +  } +} + +PseudoMap.prototype.clear = function () { +  var data = Object.create(null) +  data.size = 0 + +  Object.defineProperty(this, '_data', { +    value: data, +    enumerable: false, +    configurable: true, +    writable: false +  }) +} + +Object.defineProperty(PseudoMap.prototype, 'size', { +  get: function () { +    return this._data.size +  }, +  set: function (n) {}, +  enumerable: true, +  configurable: true +}) + +PseudoMap.prototype.values = +PseudoMap.prototype.keys = +PseudoMap.prototype.entries = function () { +  throw new Error('iterators are not implemented in this version') +} + +// Either identical, or both NaN +function same (a, b) { +  return a === b || a !== a && b !== b +} + +function Entry (k, v, i) { +  this.key = k +  this.value = v +  this._index = i +} + +function find (data, k) { +  for (var i = 0, s = '_' + k, key = s; +       hasOwnProperty.call(data, key); +       key = s + i++) { +    if (same(data[key].key, k)) +      return data[key] +  } +} + +function set (data, k, v) { +  for (var i = 0, s = '_' + k, key = s; +       hasOwnProperty.call(data, key); +       key = s + i++) { +    if (same(data[key].key, k)) { +      data[key].value = v +      return +    } +  } +  data.size++ +  data[key] = new Entry(k, v, key) +} diff --git a/node_modules/pseudomap/test/basic.js b/node_modules/pseudomap/test/basic.js new file mode 100644 index 0000000..4378e45 --- /dev/null +++ b/node_modules/pseudomap/test/basic.js @@ -0,0 +1,86 @@ +var t = require('tap') + +process.env.TEST_PSEUDOMAP = 'true' + +var PM = require('../') +runTests(PM) + +// if possible, verify that Map also behaves the same way +if (typeof Map === 'function') +  runTests(Map) + + +function runTests (Map) { +  t.throws(Map) + +  var m = new Map() + +  t.equal(m.size, 0) + +  m.set(1, '1 string') +  t.equal(m.get(1), '1 string') +  t.equal(m.size, 1) +  m.size = 1000 +  t.equal(m.size, 1) +  m.size = 0 +  t.equal(m.size, 1) + +  m = new Map([[1, 'number 1'], ['1', 'string 1']]) +  t.equal(m.get(1), 'number 1') +  t.equal(m.get('1'), 'string 1') +  t.equal(m.size, 2) + +  m = new Map(m) +  t.equal(m.get(1), 'number 1') +  t.equal(m.get('1'), 'string 1') +  t.equal(m.size, 2) + +  var akey = {} +  var bkey = {} +  m.set(akey, { some: 'data' }) +  m.set(bkey, { some: 'other data' }) +  t.same(m.get(akey), { some: 'data' }) +  t.same(m.get(bkey), { some: 'other data' }) +  t.equal(m.size, 4) + +  var x = /x/ +  var y = /x/ +  m.set(x, 'x regex') +  m.set(y, 'y regex') +  t.equal(m.get(x), 'x regex') +  m.set(x, 'x again') +  t.equal(m.get(x), 'x again') +  t.equal(m.size, 6) + +  m.set(NaN, 'not a number') +  t.equal(m.get(NaN), 'not a number') +  m.set(NaN, 'it is a ' + typeof NaN) +  t.equal(m.get(NaN), 'it is a number') +  m.set('NaN', 'stringie nan') +  t.equal(m.get(NaN), 'it is a number') +  t.equal(m.get('NaN'), 'stringie nan') +  t.equal(m.size, 8) + +  m.delete(NaN) +  t.equal(m.get(NaN), undefined) +  t.equal(m.size, 7) + +  var expect = [ +    { value: 'number 1', key: 1 }, +    { value: 'string 1', key: '1' }, +    { value: { some: 'data' }, key: {} }, +    { value: { some: 'other data' }, key: {} }, +    { value: 'x again', key: /x/ }, +    { value: 'y regex', key: /x/ }, +    { value: 'stringie nan', key: 'NaN' } +  ] +  var actual = [] + +  m.forEach(function (value, key) { +    actual.push({ value: value, key: key }) +  }) +  t.same(actual, expect) + +  m.clear() +  t.equal(m.size, 0) +}  | 
