From 574b43d778eea9bbe64edf45b68ef125c56d9e28 Mon Sep 17 00:00:00 2001 From: Jason Taylor Date: Thu, 17 Mar 2022 18:03:40 -0400 Subject: [PATCH] bump to version 1.0.3 add ESM version make ValueMap and ValueSet extend their native counterparts add forEach and toJSON functions --- ValueMap.js => ValueMap.cjs | 27 +- ValueMap.esm.js | 178 +++++++++ ValueSet.js => ValueSet.cjs | 27 +- ValueSet.esm.js | 160 ++++++++ hash.js => hash.cjs | 0 hash.esm.js | 51 +++ index.cjs | 7 + index.esm.js | 5 + index.js | 7 - package-lock.json | 763 ++++++++++++++++++++++++++++++++++++ package.json | 11 +- 11 files changed, 1216 insertions(+), 20 deletions(-) rename ValueMap.js => ValueMap.cjs (89%) create mode 100644 ValueMap.esm.js rename ValueSet.js => ValueSet.cjs (88%) create mode 100644 ValueSet.esm.js rename hash.js => hash.cjs (100%) create mode 100644 hash.esm.js create mode 100644 index.cjs create mode 100644 index.esm.js delete mode 100644 index.js create mode 100644 package-lock.json diff --git a/ValueMap.js b/ValueMap.cjs similarity index 89% rename from ValueMap.js rename to ValueMap.cjs index e9a396d..229c423 100644 --- a/ValueMap.js +++ b/ValueMap.cjs @@ -2,7 +2,7 @@ const isEqual = require("lodash.isequal"); -const { hash } = require("./hash"); +const { hash } = require("./hash.cjs"); const has = Object.prototype.hasOwnProperty; @@ -10,12 +10,15 @@ const has = Object.prototype.hasOwnProperty; * The ValueMap object holds key-value pairs. Any value (both objects and primitive values) may be used as either a key or a value. * By default, keys are considered equal using lodash's isEqual, which is deep equality. */ -class ValueMap { +class ValueMap extends Map { + static name = 'ValueMap'; + /** * Create a new ValueMap. * @param {Iterable} [iterable] An iterable object whose elements are [key, value] pairs to add to the new ValueMap. If you don't specify this parameter, or its value is null, the new ValueMap is empty. */ constructor(iterable) { + super(); this.clear(); if (iterable) { for (let [k, v] of iterable) @@ -141,6 +144,18 @@ class ValueMap { } } + /** + * The forEach() method invokes a function with three parameters: value, key, and the valueMap itself. + * Note that the elements are not itterated in insertion order. + * @returns {Iterator} A new ValueMap iterator object. + */ + forEach(func) { + for (let h in this.hash) { + for (let n of this.hash[h]) + func(n.value, n.key, this); + } + } + /** * The clear() method removes all elements from a ValueMap object. */ @@ -148,6 +163,10 @@ class ValueMap { this.hash = Object.create(null); this.size_ = 0; } + + toJSON() { + return JSON.stringify([...this]); + } } ValueMap.prototype.getHash = hash; @@ -156,6 +175,4 @@ ValueMap.prototype.isEqual = isEqual; if (Symbol && Symbol.iterator) ValueMap.prototype[Symbol.iterator] = ValueMap.prototype.entries; -module.exports = { - ValueMap, -} +module.exports = { ValueMap }; diff --git a/ValueMap.esm.js b/ValueMap.esm.js new file mode 100644 index 0000000..47c8987 --- /dev/null +++ b/ValueMap.esm.js @@ -0,0 +1,178 @@ +"use strict"; + +import isEqual from "lodash.isEqual"; + +import { hash } from "./hash.esm.js"; + +const has = Object.prototype.hasOwnProperty; + +/** + * The ValueMap object holds key-value pairs. Any value (both objects and primitive values) may be used as either a key or a value. + * By default, keys are considered equal using lodash's isEqual, which is deep equality. + */ +class ValueMap extends Map { + static name = 'ValueMap'; + + /** + * Create a new ValueMap. + * @param {Iterable} [iterable] An iterable object whose elements are [key, value] pairs to add to the new ValueMap. If you don't specify this parameter, or its value is null, the new ValueMap is empty. + */ + constructor(iterable) { + super(); + this.clear(); + if (iterable) { + for (let [k, v] of iterable) + this.set(k, v); + } + } + + /** + * Returns the number of elements in a ValueMap object. + * @returns {number} The number of elements. + */ + get size() { + return this.size_; + } + + /** + * Adds or updates an element with a specified key and value to a ValueMap object. + * @param {*} k The key of the element to add to the ValueMap object. + * @param {*} v The value of the element to add to the ValueMap object. + * @returns {ValueMap} The ValueMap object. + */ + set(k, v) { + let h = this.getHash(k); + let b = this.hash[h]; + if (b === undefined) + b = this.hash[h] = []; + let n = b.find(n => this.isEqual(n.key, k)) + if (n === undefined) { + b.push({ + key: k, + value: v, + }); + ++this.size_; + } else { + n.value = v; + } + return this; + } + + /** + * The has() method returns a boolean indicating whether an element with the specified key exists or not. + * @param {*} k The key of the element to test for presence in the ValueMap object. + * @returns {boolean} Returns true if an element with the specified key exists in the ValueMap object; otherwise false. + */ + has(k) { + let h = this.getHash(k); + let b = this.hash[h]; + if (b === undefined) + return false; + let ni = b.findIndex(n => this.isEqual(n.key, k)) + return ni >= 0; + } + + /** + * The get() method returns a specified element from a ValueMap object. + * @param {*} k The key of the element to return from the ValueMap object. + * @returns {*} Returns the element associated with the specified key or undefined if the key can't be found in the ValueMap object. + */ + get(k) { + let h = this.getHash(k); + let b = this.hash[h]; + if (b === undefined) + return undefined; + let n = b.find(n => this.isEqual(n.key, k)) + if (n === undefined) + return undefined; + return n.value; + } + + /** + * The delete() method removes the specified element from a ValueMap object if a corresponding key exists. + * @param {*} k The key of the element to remove from the ValueMap object. + * @returns {boolean} Returns true if an element with the specified key existed in the ValueMap object and was removed; otherwise false. + */ + delete(k) { + let h = this.getHash(k); + let b = this.hash[h]; + if (b === undefined) + return false; + let ni = b.findIndex(n => this.isEqual(n.key, k)) + if (ni < 0) + return false; + b.splice(ni, 1); + --this.size_; + if (b.length === 0) + delete this.hash[h]; + return true; + } + + /** + * The values() method returns a new Iterator object that contains the values for each element in the ValueMap object. + * Note that the values are not returned in insertion order. + * @returns {Iterator} A new ValueMap iterator object. + */ + *values() { + for (let h in this.hash) { + for (let n of this.hash[h]) + yield n.value; + } + } + + /** + * The keys() method returns a new Iterator object that contains the keys for each element in the ValueMap object. + * Note that the keys are not returned in insertion order. + * @returns {Iterator} A new ValueMap iterator object. + */ + *keys() { + for (let h in this.hash) { + for (let n of this.hash[h]) + yield n.key; + } + } + + /** + * The entries() method returns a new Iterator object that contains the [key, value] pairs for each element in the ValueMap object. + * Note that the elements are not returned in insertion order. + * @returns {Iterator} A new ValueMap iterator object. + */ + *entries() { + for (let h in this.hash) { + for (let n of this.hash[h]) + yield [n.key, n.value]; + } + } + + /** + * The forEach() method invokes a function with three parameters: value, key, and the valueMap itself. + * Note that the elements are not itterated in insertion order. + * @returns {Iterator} A new ValueMap iterator object. + */ + forEach(func) { + for (let h in this.hash) { + for (let n of this.hash[h]) + func(n.value, n.key, this); + } + } + + /** + * The clear() method removes all elements from a ValueMap object. + */ + clear() { + this.hash = Object.create(null); + this.size_ = 0; + } + + toJSON() { + return JSON.stringify([...this]); + } +} + +ValueMap.prototype.getHash = hash; +ValueMap.prototype.isEqual = isEqual; + +if (Symbol && Symbol.iterator) + ValueMap.prototype[Symbol.iterator] = ValueMap.prototype.entries; + +export { ValueMap }; diff --git a/ValueSet.js b/ValueSet.cjs similarity index 88% rename from ValueSet.js rename to ValueSet.cjs index 2890e77..b29155c 100644 --- a/ValueSet.js +++ b/ValueSet.cjs @@ -2,7 +2,7 @@ const isEqual = require("lodash.isequal"); -const { hash } = require("./hash"); +const { hash } = require("./hash.cjs"); const has = Object.prototype.hasOwnProperty; @@ -10,12 +10,15 @@ const has = Object.prototype.hasOwnProperty; * The ValueSet object lets you store unique values of any type, whether primitive values or object references. * By default, elements are considered equal using lodash's isEqual, which is deep equality. */ -class ValueSet { +class ValueSet extends Set { + static name = 'ValueSet'; + /** * Create a new ValueSet. * @param {Iterable} [iterable] If an iterable object is passed, all of its elements will be added to the new ValueSet. If you don't specify this parameter, or its value is null, the new ValueSet is empty. */ constructor(iterable) { + super(); this.clear(); if (iterable) { for (let k of iterable) @@ -123,6 +126,18 @@ class ValueSet { } } + /** + * The forEach() method invokes a function with three parameters: value, key, and the valueMap itself. + * Note that the elements are not itterated in insertion order. + * @returns {Iterator} A new ValueMap iterator object. + */ + forEach(func) { + for (let h in this.hash) { + for (let n of this.hash[h]) + func(n.value, n.key, this); + } + } + /** * The clear() method removes all elements from a ValueSet object. */ @@ -130,6 +145,10 @@ class ValueSet { this.hash = Object.create(null); this.size_ = 0; } + + toJSON() { + return JSON.stringify([...this]); + } } ValueSet.prototype.getHash = hash; @@ -138,6 +157,4 @@ ValueSet.prototype.isEqual = isEqual; if (Symbol && Symbol.iterator) ValueSet.prototype[Symbol.iterator] = ValueSet.prototype.values; -module.exports = { - ValueSet, -} +module.exports = { ValueSet }; diff --git a/ValueSet.esm.js b/ValueSet.esm.js new file mode 100644 index 0000000..58af38f --- /dev/null +++ b/ValueSet.esm.js @@ -0,0 +1,160 @@ +"use strict"; + +import isEqual from "lodash.isEqual"; + +import { hash } from "./hash.esm.js"; + +const has = Object.prototype.hasOwnProperty; + +/** + * The ValueSet object lets you store unique values of any type, whether primitive values or object references. + * By default, elements are considered equal using lodash's isEqual, which is deep equality. + */ +class ValueSet extends Set { + static name = 'ValueSet'; + + /** + * Create a new ValueSet. + * @param {Iterable} [iterable] If an iterable object is passed, all of its elements will be added to the new ValueSet. If you don't specify this parameter, or its value is null, the new ValueSet is empty. + */ + constructor(iterable) { + super(); + this.clear(); + if (iterable) { + for (let k of iterable) + this.add(k); + } + } + + /** + * Returns the number of elements in a ValueSet object. + * @returns {number} The number of elements. + */ + get size() { + return this.size_; + } + + /** + * Adds a new element with a specified value to the ValueSet object. + * @param {*} k The value of the element to add to the ValueSet object. + * @returns {boolean} Returns true if an element was added to the ValueSet object or false if an element with the same key already existed. + */ + add(k) { + let h = this.getHash(k); + let b = this.hash[h]; + if (b === undefined) + b = this.hash[h] = []; + let ni = b.findIndex(n => this.isEqual(n, k)) + if (ni >= 0) + return false; + b.push(k); + ++this.size_; + return true; + } + + /** + * Returns a boolean indicating whether an element with the specified value exists in a ValueSet object or not. + * @param {*} k The value to test for presence in the ValueSet object. + * @returns {boolean} Returns true if an element with the specified value exists in the ValueSet object, otherwise false. + */ + has(k) { + let h = this.getHash(k); + let b = this.hash[h]; + if (b === undefined) + return false; + let ni = b.findIndex(n => this.isEqual(n, k)) + return ni >= 0; + } + + /** + * Returns a specified element from a ValueSet object. + * @param {*} k The value of the element to return from the ValueSet object. + * @returns {*} Returns the corresponding element or undefined if the element can't be found in the ValueSet object. + */ + get(k) { + let h = this.getHash(k); + let b = this.hash[h]; + if (b === undefined) + return undefined; + let ni = b.findIndex(n => this.isEqual(n, k)) + if (ni < 0) + return undefined; + return b[ni]; + } + + /** + * Removes the specified element from a ValueSet object. + * @param {*} k The value of the element to remove from the ValueSet object. + * @returns {boolean} Returns true if an element in the ValueSet object has been removed successfully; otherwise false. + */ + delete(k) { + let h = this.getHash(k); + let b = this.hash[h]; + if (b === undefined) + return false; + let ni = b.findIndex(n => this.isEqual(n, k)) + if (ni < 0) + return false; + b.splice(ni, 1); + --this.size_; + if (b.length === 0) + delete this.hash[h]; + return true; + } + + /** + * The values() method returns a new Iterator object that contains the values for each element in the ValueSet object. + * Note that the values are not returned in insertion order. + * @returns {Iterator} A new Iterator object containing the values for each element in the given ValueSet. + */ + *values() { + for (let h in this.hash) { + for (let n of this.hash[h]) + yield n; + } + } + + /** + * The entries() method returns a new Iterator object that contains an array of [value, value] for each element in the ValueSet object. + * Note that the values are not returned in insertion order. + * @returns {Iterator} A new Iterator object that contains an array of [value, value] for each element in the given ValueSet. + */ + *entries() { + for (let h in this.hash) { + for (let n of this.hash[h]) + yield [n, n]; + } + } + + /** + * The forEach() method invokes a function with three parameters: value, key, and the valueMap itself. + * Note that the elements are not itterated in insertion order. + * @returns {Iterator} A new ValueMap iterator object. + */ + forEach(func) { + for (let h in this.hash) { + for (let n of this.hash[h]) + func(n.value, n.key, this); + } + } + + /** + * The clear() method removes all elements from a ValueSet object. + */ + clear() { + this.hash = Object.create(null); + this.size_ = 0; + } + + toJSON() { + return JSON.stringify([...this]); + } +} + +ValueSet.prototype.getHash = hash; +ValueSet.prototype.isEqual = isEqual; + +if (Symbol && Symbol.iterator) + ValueSet.prototype[Symbol.iterator] = ValueSet.prototype.values; + +export { ValueSet }; diff --git a/hash.js b/hash.cjs similarity index 100% rename from hash.js rename to hash.cjs diff --git a/hash.esm.js b/hash.esm.js new file mode 100644 index 0000000..9531308 --- /dev/null +++ b/hash.esm.js @@ -0,0 +1,51 @@ +"use strict"; + +const has = Object.prototype.hasOwnProperty; + +const SEED = 5381; + +/** + * Returns the numeric hash value for a string. Must return the same hash value for equal strings. + * @param {number} h The seed hash value. + * @param {string} k The string to be hashes. + * @returns {number} The computed hash value. + */ +const hashString = (h, v) => { + v = String(v) + // Throughout this file, using (x | 0) to bitwise truncate x to a signed 32-bit integer. + for (let i = 0; i < v.length; ++i) + h = (((h * 33) | 0) + v.charCodeAt(i)) | 0; + return h; +} + +/** + * Returns a numeric hash value. Must return the same hash value for equal inputs. For objects, + * aside from looking at the name of the constructor function, only looks at property values one + * level deep, making it suitable for use with either shallow and deep equality. + * @param {*} k The value to be hashed. + * @returns {number} The computed hash value. + */ +const hash = (k) => { + if (k && typeof k === "object") { + let h = 0; + if (typeof k.constructor === "object") + h = hashString(SEED, k.constructor.name); + + // Property name and value are hashed as a pair. The hash values of all property name/value pairs are summed. + // Summming the hash values does not make a particularly good hash function but has the advantage that + // integer addition is commutative, which means it does not matter in which order the properties are enumerated. + // This is also the reason for bitwise ORing the has values with zero. It keeps them in the 32-bit signed + // integer range. If they were to stray into the range where they are floating point proper, addition would no + // longer be commutative because of rounding error. + for (let n in k) { + if (has.call(k, n)) + h = (h + hashString(hashString(SEED, n), k[n])) | 0; + } + return h; + } else { + return hashString(SEED, k); + } +} + + +export { hashString, hash }; diff --git a/index.cjs b/index.cjs new file mode 100644 index 0000000..5d727f1 --- /dev/null +++ b/index.cjs @@ -0,0 +1,7 @@ +"use strict"; + +const hash = require("./hash.cjs"); +const ValueSet = require("./ValueSet.cjs"); +const ValueMap = require("./ValueMap.cjs"); + +module.exports = Object.assign({}, hash, ValueSet, ValueMap); diff --git a/index.esm.js b/index.esm.js new file mode 100644 index 0000000..866ffb6 --- /dev/null +++ b/index.esm.js @@ -0,0 +1,5 @@ +"use strict"; + +export { hash } from "./hash.esm.js"; +export { ValueSet } from "./ValueSet.esm.js"; +export { ValueMap } from "./ValueMap.esm.js"; diff --git a/index.js b/index.js deleted file mode 100644 index 5a84ca6..0000000 --- a/index.js +++ /dev/null @@ -1,7 +0,0 @@ -"use strict"; - -const hash = require("./hash"); -const ValueSet = require("./ValueSet"); -const ValueMap = require("./ValueMap"); - -module.exports = Object.assign({}, hash, ValueSet, ValueMap); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..86feb75 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,763 @@ +{ + "name": "valuecollection", + "version": "1.0.3", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "valuecollection", + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "lodash.isequal": "^4.5.0" + }, + "devDependencies": { + "chai": "^4.0.1", + "mocha": "^3.4.2" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "node_modules/chai": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "dependencies": { + "graceful-readlink": ">= 1.0.0" + }, + "engines": { + "node": ">= 0.6.x" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true + }, + "node_modules/growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "deprecated": "Please use the native JSON object instead of JSON 3", + "dev": true + }, + "node_modules/lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true, + "dependencies": { + "lodash._basecopy": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "node_modules/lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "node_modules/lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", + "dev": true + }, + "node_modules/lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "node_modules/lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "node_modules/lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "dev": true, + "dependencies": { + "lodash._baseassign": "^3.0.0", + "lodash._basecreate": "^3.0.0", + "lodash._isiterateecall": "^3.0.0" + } + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "node_modules/lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + }, + "node_modules/lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "dependencies": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "node_modules/loupe": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", + "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "node_modules/mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "dev": true, + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mocha": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", + "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", + "dev": true, + "dependencies": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.6.8", + "diff": "3.2.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.1", + "growl": "1.9.2", + "he": "1.1.1", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 0.10.x", + "npm": ">= 1.4.x" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + }, + "dependencies": { + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "chai": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": ">= 1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true, + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "dev": true, + "requires": { + "lodash._baseassign": "^3.0.0", + "lodash._basecreate": "^3.0.0", + "lodash._isiterateecall": "^3.0.0" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "loupe": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", + "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", + "dev": true, + "requires": { + "get-func-name": "^2.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", + "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.6.8", + "diff": "3.2.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.1", + "growl": "1.9.2", + "he": "1.1.1", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } +} diff --git a/package.json b/package.json index 465ddcd..adb285e 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,13 @@ { "name": "valuecollection", - "version": "1.0.2", + "version": "1.0.3", "description": "Map and set collections with deep key equality", - "main": "index.js", + "type": "module", + "main": "index.esm.js", + "exports": { + "requires": "./index.cjs", + "import": "./index.esm.js" + }, "scripts": { "test": "mocha **/*.spec.js" }, @@ -30,4 +35,4 @@ "dependencies": { "lodash.isequal": "^4.5.0" } -} \ No newline at end of file +}