From ec270f7907cb8f2395125584d69a05a907ea3710 Mon Sep 17 00:00:00 2001 From: Lealon Wolfe Date: Wed, 27 Aug 2025 15:44:44 -0500 Subject: [PATCH 01/10] commented --- underpants.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/underpants.js b/underpants.js index fc531b4..6523192 100644 --- a/underpants.js +++ b/underpants.js @@ -5,7 +5,7 @@ var _ = {}; - +//this is a comment /** * START OF OUR LIBRARY! * Implement each function below its instructions From 575f261e1b86cbb98901ac206ae42f3a4be34f81 Mon Sep 17 00:00:00 2001 From: Lealon Wolfe Date: Wed, 27 Aug 2025 16:31:23 -0500 Subject: [PATCH 02/10] finished .identity and started on _.typeOf --- underpants.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/underpants.js b/underpants.js index 6523192..4fc2e25 100644 --- a/underpants.js +++ b/underpants.js @@ -20,7 +20,9 @@ var _ = {}; * _.identity(5) === 5 * _.identity({a: "b"}) === {a: "b"} */ - +_.identify =function(val){ + return val; +} /** _.typeOf * Arguments: @@ -41,8 +43,10 @@ var _ = {}; * _.typeOf("javascript") -> "string" * _.typeOf([1,2,3]) -> "array" */ - - +_.typeOf = (val) => typeOf(val); +console.log(_.typeOf(5)); +console.log(_.typeOf("hello")); +console.log(_.typeOf([1,2,3])); /** _.first * Arguments: * 1) An array From bb2b468172cbe0172587bec4588c78b140801d70 Mon Sep 17 00:00:00 2001 From: Student Date: Thu, 28 Aug 2025 16:16:07 -0500 Subject: [PATCH 03/10] at indexOf --- package.json | 3 ++- underpants.js | 50 ++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 42 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 721ceba..5241f24 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ "scripts": { "pretest": "npm install", "test": "mocha ./test/underpants.spec.js || :", - "posttest": "rm -rf ./test ./node_modules" + "posttest": "rm -rf ./node_modules" + }, "repository": { "type": "git", diff --git a/underpants.js b/underpants.js index 4fc2e25..eeb99c1 100644 --- a/underpants.js +++ b/underpants.js @@ -20,7 +20,7 @@ var _ = {}; * _.identity(5) === 5 * _.identity({a: "b"}) === {a: "b"} */ -_.identify =function(val){ +_.identity = function (val) { return val; } @@ -43,10 +43,15 @@ _.identify =function(val){ * _.typeOf("javascript") -> "string" * _.typeOf([1,2,3]) -> "array" */ -_.typeOf = (val) => typeOf(val); -console.log(_.typeOf(5)); -console.log(_.typeOf("hello")); -console.log(_.typeOf([1,2,3])); +//_.typeOf = (val) => typeof(val); +_.typeOf = (val) => { + return val === null ? "null" : + Array.isArray(val) ? "array" : + typeof val; +} +// console.log(_.typeOf(5)); +// console.log(_.typeOf("hello")); +// console.log(_.typeOf([1,2,3])); /** _.first * Arguments: * 1) An array @@ -64,7 +69,15 @@ console.log(_.typeOf([1,2,3])); * _.first(["a", "b", "c"], 1) -> "a" * _.first(["a", "b", "c"], 2) -> ["a", "b"] */ - +_.first = (arr, num) => + !Array.isArray(arr) ? [] : + num === undefined || typeof num !== "number" ? arr[0] : + num < 0 ? [] : + arr.slice(0, num); +// console.log( _.first("ponies", 1)); +// console.log(_.first(["a", "b", "c"], "ponies")) +// console.log(_.first(["a", "b", "c"], 1)) +// console.log( _.first(["a", "b", "c"], 4)) /** _.last * Arguments: @@ -84,7 +97,17 @@ console.log(_.typeOf([1,2,3])); * _.last(["a", "b", "c"], 2) -> ["b", "c"] */ - +_.last = (arr, num) => + !Array.isArray(arr) ? [] : //first check: if arr is an array + num === undefined || typeof num !== "number" ? arr[arr.length - 1] : //second check + num < 0 ? [] : //third check + num > arr.length ? arr : + arr.slice(num - 1, arr.length); + +// console.log(_.last("ponies", 1)); +// console.log(_.last(["a", "b", "c"], "ponies")) +// console.log(_.last(["a", "b", "c"], 1)) +// console.log(_.last(["a", "b", "c"], 2)) /** _.indexOf * Arguments: * 1) An array @@ -100,7 +123,14 @@ console.log(_.typeOf([1,2,3])); * _.indexOf(["a","b","c"], "c") -> 2 * _.indexOf(["a","b","c"], "d") -> -1 */ - +_.indexOf = (arr, value) => { + for (var i = 0; i < arr.length; i++) { + if (arr[i] === value) { + return i + } + return -1 + } +} /** _.contains * Arguments: @@ -309,8 +339,8 @@ console.log(_.typeOf([1,2,3])); // DON'T REMOVE THIS CODE //////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// -if((typeof process !== 'undefined') && - (typeof process.versions.node !== 'undefined')) { +if ((typeof process !== 'undefined') && + (typeof process.versions.node !== 'undefined')) { // here, export any references you need for tests // module.exports = _; } From 1764751eb7dd09e9b17fa231e1d8ba59ba64613e Mon Sep 17 00:00:00 2001 From: Lealon Wolfe Date: Tue, 2 Sep 2025 16:27:25 -0500 Subject: [PATCH 04/10] finished the functions indexOf to map --- underpants.js | 126 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 123 insertions(+), 3 deletions(-) diff --git a/underpants.js b/underpants.js index eeb99c1..1e00e25 100644 --- a/underpants.js +++ b/underpants.js @@ -124,12 +124,21 @@ _.last = (arr, num) => * _.indexOf(["a","b","c"], "d") -> -1 */ _.indexOf = (arr, value) => { + var isFound = false; + var ind = []; +if(Array.isArray(arr)){ + for (var i = 0; i < arr.length; i++) { if (arr[i] === value) { - return i + ind.push(i); + isFound = true; } - return -1 } + + if(isFound){return ind[0]}else {return -1}; + +}else {return -1}; + } /** _.contains @@ -146,8 +155,28 @@ _.indexOf = (arr, value) => { * Examples: * _.contains([1,"two", 3.14], "two") -> true */ +_.contains = (arr, val) => { + var isFound = false; +if(Array.isArray(arr)){ + + for (var i = 0; i < arr.length; i++) { + if (arr[i] === val) { + isFound = true; + } + } + + return isFound === true ? true: + false; + +} + + + + +} + /** _.each * Arguments: * 1) A collection @@ -164,6 +193,27 @@ _.indexOf = (arr, value) => { * -> should log "a" "b" "c" to the console */ +_.each = (coll,func) => { + +if(Array.isArray(coll)){ + for (var i = 0; i < coll.length; i++) { + func(coll[i],i,coll) + } +}else{ + for( var element in coll){ + func(coll[element],element,coll); + } +} + +} + + +//it runs the function you give it while passing the element, index/elemment, and collection +//no inherent returns +// _.each(Any array, a function with possible parameters( the element, index/elemment, and collection) ) + + + /** _.unique * Arguments: @@ -174,6 +224,16 @@ _.indexOf = (arr, value) => { * Examples: * _.unique([1,2,2,4,5,6,5,2]) -> [1,2,4,5,6] */ +_.unique = (arr) => { + var holder = []; + + + + for (var i = 0; i < arr.length; i++) { + if(!_.contains(holder,arr[i])){holder.push(arr[i])} + } + return holder; +} /** _.filter @@ -193,6 +253,24 @@ _.indexOf = (arr, value) => { */ + + +_.filter = (arr, func) => { +// holds variable to return + var truths = []; + var holders = []; + //go through each element + _.each(arr,(...a) => { + truths.push(func(...a)) + }) + for(var i = 0; i { return x>2})) + /** _.reject * Arguments: * 1) An array @@ -206,6 +284,21 @@ _.indexOf = (arr, value) => { * _.reject([1,2,3,4,5], function(e){return e%2 === 0}) -> [1,3,5] */ +_.reject= (arr, func) => { +// holds variable to return + var truths = []; + var holders = []; + //go through each element + _.each(arr,(...a) => { + truths.push(func(...a)) + }) + for(var i = 0; i { } */ +_.partition= (arr, func) => { +// holds variable to return + var truths = []; + var tHolders = []; + var fHolders = []; + //go through each element + _.each(arr,(...a) => { + truths.push(func(...a)) + }) + for(var i = 0; i { * Examples: * _.map([1,2,3,4], function(e){return e * 2}) -> [2,4,6,8] */ - +_.map = (coll, func) => { +var result = []; +_.each(coll,(...a) => { + result.push(func(...a)) + }) + return result; +} /** _.pluck * Arguments: From fa9c4a7fcb64096124a6b9e38de6f89ad13589c4 Mon Sep 17 00:00:00 2001 From: Student Date: Wed, 3 Sep 2025 16:01:03 -0500 Subject: [PATCH 05/10] struggled on .pluck for 3 hours --- underpants.js | 126 +++++++++++++++++++++++++++++--------------------- 1 file changed, 73 insertions(+), 53 deletions(-) diff --git a/underpants.js b/underpants.js index 1e00e25..8a924f3 100644 --- a/underpants.js +++ b/underpants.js @@ -126,18 +126,18 @@ _.last = (arr, num) => _.indexOf = (arr, value) => { var isFound = false; var ind = []; -if(Array.isArray(arr)){ + if (Array.isArray(arr)) { - for (var i = 0; i < arr.length; i++) { - if (arr[i] === value) { - ind.push(i); - isFound = true; + for (var i = 0; i < arr.length; i++) { + if (arr[i] === value) { + ind.push(i); + isFound = true; + } } - } - if(isFound){return ind[0]}else {return -1}; + if (isFound) { return ind[0] } else { return -1 }; -}else {return -1}; + } else { return -1 }; } @@ -155,20 +155,20 @@ if(Array.isArray(arr)){ * Examples: * _.contains([1,"two", 3.14], "two") -> true */ -_.contains = (arr, val) => { +_.contains = (arr, val) => { var isFound = false; -if(Array.isArray(arr)){ + if (Array.isArray(arr)) { - for (var i = 0; i < arr.length; i++) { - if (arr[i] === val) { - isFound = true; + for (var i = 0; i < arr.length; i++) { + if (arr[i] === val) { + isFound = true; + } } - } - return isFound === true ? true: - false; + return isFound === true ? true : + false; -} + } @@ -193,17 +193,17 @@ if(Array.isArray(arr)){ * -> should log "a" "b" "c" to the console */ -_.each = (coll,func) => { +_.each = (coll, func) => { -if(Array.isArray(coll)){ - for (var i = 0; i < coll.length; i++) { - func(coll[i],i,coll) - } -}else{ - for( var element in coll){ - func(coll[element],element,coll); + if (Array.isArray(coll)) { + for (var i = 0; i < coll.length; i++) { + func(coll[i], i, coll) + } + } else { + for (var element in coll) { + func(coll[element], element, coll); + } } -} } @@ -226,11 +226,11 @@ if(Array.isArray(coll)){ */ _.unique = (arr) => { var holder = []; - + for (var i = 0; i < arr.length; i++) { - if(!_.contains(holder,arr[i])){holder.push(arr[i])} + if (!_.contains(holder, arr[i])) { holder.push(arr[i]) } } return holder; } @@ -256,20 +256,20 @@ _.unique = (arr) => { _.filter = (arr, func) => { -// holds variable to return + // holds variable to return var truths = []; var holders = []; //go through each element - _.each(arr,(...a) => { + _.each(arr, (...a) => { truths.push(func(...a)) }) - for(var i = 0; i { return x>2})) +console.log(_.filter([1, 2, 3, 4, 5], (x) => { return x > 2 })) /** _.reject * Arguments: @@ -284,17 +284,17 @@ console.log(_.filter([1,2,3,4,5], (x) => { return x>2})) * _.reject([1,2,3,4,5], function(e){return e%2 === 0}) -> [1,3,5] */ -_.reject= (arr, func) => { -// holds variable to return +_.reject = (arr, func) => { + // holds variable to return var truths = []; var holders = []; //go through each element - _.each(arr,(...a) => { + _.each(arr, (...a) => { truths.push(func(...a)) }) - for(var i = 0; i { } */ -_.partition= (arr, func) => { -// holds variable to return +_.partition = (arr, func) => { + // holds variable to return var truths = []; var tHolders = []; - var fHolders = []; + var fHolders = []; //go through each element - _.each(arr,(...a) => { + _.each(arr, (...a) => { truths.push(func(...a)) }) - for(var i = 0; i { * _.map([1,2,3,4], function(e){return e * 2}) -> [2,4,6,8] */ _.map = (coll, func) => { -var result = []; -_.each(coll,(...a) => { + var result = []; + _.each(coll, (...a) => { result.push(func(...a)) }) return result; + // var result = []; + // _.each(coll, (coll[i], i, coll) => { + // result.push(func(coll[i], i, coll)) + // }) + // return result; + } /** _.pluck @@ -375,6 +381,20 @@ _.each(coll,(...a) => { * _.pluck([{a: "one"}, {a: "two"}], "a") -> ["one", "two"] */ +_.pluck = (ao, prop) => { + //console.log({ ao, prop }) + let holder = _.map(ao, (o) => { + // console.log([e]) + return (o[prop]) // gives us access to the the objects + }) + + // for(let i= 0; i < prop.length; i++){ + // return prop[i] + // } + console.log(holder) + return holder // returns the array stored in .map + +} /** _.every * Arguments: From 9907098d5d4d925ae14d31c87e73155d604134a1 Mon Sep 17 00:00:00 2001 From: Malik Daliet Date: Wed, 3 Sep 2025 16:21:06 -0500 Subject: [PATCH 06/10] started _.every --- package-lock.json | 920 ++++++++++++++++++++++++++++++++++++++++++++++ underpants.js | 8 +- 2 files changed, 927 insertions(+), 1 deletion(-) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..c659699 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,920 @@ +{ + "name": "underpants", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "underpants", + "version": "1.0.0", + "license": "CC", + "devDependencies": { + "chai": "^3.5.0", + "istanbul": "^0.4.5", + "lodash": "^4.17.4", + "mocha": "^3.4.1", + "sinon": "^2.2.0" + } + }, + "node_modules/abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "dev": true, + "license": "BSD-3-Clause OR MIT", + "optional": true, + "engines": { + "node": ">=0.4.2" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.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, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "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": "sha512-7Rfk377tpSM9TWBEeHs0FlDZGoAIei2V/4MdZJoFMBFAK6BqLpxAIUepGRHGdPFgGsLb02PXovC4qddyHvQqTg==", + "dev": true, + "license": "ISC" + }, + "node_modules/chai": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", + "integrity": "sha512-eRYY0vPS2a9zt5w5Z0aCeWbrXTEyvk7u/Xf71EzNObrjSCPgMm1Nku/D/u2tiqHBX5j40wWhj54YJLtgn8g55A==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^1.0.1", + "deep-eql": "^0.1.3", + "type-detect": "^1.0.0" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==", + "dev": true, + "license": "MIT", + "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": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha512-E22fsyWPt/lr4/UgQLt/pXqerGMDsanhbnmqIS3VAXuDi1v3IpiwXe2oncEIondHSBuPDWRoK/pMjlvi8FuOXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/deep-eql": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha512-6sEotTRGBFiNcqVoeHwnfopbSpi5NbH1VWJmYCVkmxMmaVTT0bUTrNaGyBwhgP4MZL012W/mkzIn3Da+iDYweg==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-detect": "0.1.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/deep-eql/node_modules/type-detect": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha512-5rqszGVwYgBoDkIm2oUtvkfZMQ0vk29iDMU0W2qCa3rG0vPDNczCMT4hV/bLBgLg8k8ri6+u3Zbt+S/14eMzlA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha512-597ykPFhtJYaXqPq6fF7Vl1fXTKgPdLOntyxpmdzUOKiYGqK7zcnbplj5088+8qJnWdzXhyeau5iVr8HVo9dgg==", + "dev": true, + "license": "BSD-3-Clause", + "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": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=0.12.0" + }, + "optionalDependencies": { + "source-map": "~0.2.0" + } + }, + "node_modules/esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/formatio": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", + "integrity": "sha512-YAF05v8+XCxAyHOdiiAmHdgCVPrWO8X744fYIPtBciIorh5LndWfi1gjeJ16sTbJhzek9kd+j3YByhohtz5Wmg==", + "deprecated": "This package is unmaintained. Use @sinonjs/formatio instead", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "samsam": "1.x" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "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": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==", + "dev": true, + "license": "MIT" + }, + "node_modules/growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha512-RTBwDHhNuOx4F0hqzItc/siXCasGfC4DeWcBamclWd+6jWtBaeB/SGbMkGf0eiQoW7ib8JpvOgnUsmgMHI3Mfw==", + "dev": true, + "license": "MIT" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha512-z/GDPjlRMNOa2XJiB4em8wJpuuBfrFOlYKTZxtpkdr1uPdibHI8rYA3MY0KDObpVyaes0e/aunid/t88ZI2EKA==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "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, + "license": "ISC" + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha512-nMtdn4hvK0HjUlzr1DrKSUY8ychprt8dzHOgY2KXsIhHu5PuQQEOTM27gV9Xblyon7aUH/TSFIjRHEODF/FRPg==", + "deprecated": "This module is no longer maintained, try this instead:\n npm i nyc\nVisit https://istanbul.js.org/integrations for other alternatives.", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "istanbul": "lib/cli.js" + } + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/js-yaml/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha512-I5YLeauH3rIaE99EE++UeH2M2gSYo8/2TqDac7oZEH6D/DSQ4Woa628Qrfj1X9/OY5Mk5VvIDQaKCDchXaKrmA==", + "deprecated": "Please use the native JSON object instead of JSON 3", + "dev": true + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha512-t3N26QR2IdSN+gqSy9Ds9pBu/J1EAFEshKlUHpJG3rvyJOYgcELIxcIeKKfZk7sjOz11cFfzJRsyFry/JyabJQ==", + "dev": true, + "license": "MIT", + "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": "sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha512-EDem6C9iQpn7fxnGdmhXmqYGjCkStmDXT4AeyB2Ph8WKbglg4aJZczNkQglj+zWXcOEEkViK8THuV2JvugW47g==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha512-IUfOYwDEbI8JbhW6psW+Ig01BOVK67dTSCUAbS58M0HBkPcAv/jHuxD+oJVP2tUCo3H9L6f/8GM6rxwY+oc7/w==", + "dev": true, + "license": "MIT", + "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": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "node_modules/lolex": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", + "integrity": "sha512-/bpxDL56TG5LS5zoXxKqA6Ro5tkOS5M8cm/7yQcwLIKIcM2HR5fjjNCaIhJNv96SEk4hNGSafYMZK42Xv5fihQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "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, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "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, + "license": "MIT", + "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/mocha/node_modules/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-mRyN/EsN2SyNhKWykF3eEGhDpeNplMWaW18Bmh76tnOqk5TbELAVwFAYOCmKVssOYFrYvvLMguiA+NXO3ZTuVA==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "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/mocha/node_modules/minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/mocha/node_modules/mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==", + "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, + "license": "MIT", + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha512-F8dvPrZJtNzvDRX26eNXT4a7AecAvTGljmmnI39xEgSpbHKhQ7N0dO/NTxUExd0wuLHp4zbwYY7lvHq0aKpwrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/native-promise-only": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", + "integrity": "sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", + "dev": true, + "license": "MIT" + }, + "node_modules/samsam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", + "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", + "deprecated": "This package has been deprecated in favour of @sinonjs/samsam", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/sinon": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.4.1.tgz", + "integrity": "sha512-vFTrO9Wt0ECffDYIPSP/E5bBugt0UjcBQOfQUMh66xzkyPEnhl/vM2LRZi2ajuTdkH07sA6DzrM6KvdvGIH8xw==", + "deprecated": "16.1.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "diff": "^3.1.0", + "formatio": "1.2.0", + "lolex": "^1.6.0", + "native-promise-only": "^0.8.1", + "path-to-regexp": "^1.7.0", + "samsam": "^1.1.3", + "text-encoding": "0.6.4", + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=0.1.103" + } + }, + "node_modules/sinon/node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", + "dev": true, + "optional": true, + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/text-encoding": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", + "integrity": "sha512-hJnc6Qg3dWoOMkqP53F0dzRIgtmsAge09kxUIqGrEUS4qr5rWLckGYaQAVr+opBrIMRErGgy6f5aPnyPpyGRfg==", + "deprecated": "no longer maintained", + "dev": true, + "license": "Unlicense" + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", + "integrity": "sha512-f9Uv6ezcpvCQjJU0Zqbg+65qdcszv3qUQsZfjdRbWiZ7AMenrX1u0lNk9EoWWX6e1F+NULyg27mtdeZ5WhpljA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + } + } +} diff --git a/underpants.js b/underpants.js index 8a924f3..702d291 100644 --- a/underpants.js +++ b/underpants.js @@ -416,7 +416,13 @@ _.pluck = (ao, prop) => { * _.every([2,4,6], function(e){return e % 2 === 0}) -> true * _.every([1,2,3], function(e){return e % 2 === 0}) -> false */ - +_.every = (coll, func) => { + // if (coll === A) + _.map(coll, func) + for (let i = 0; i < coll.length; i++){ + + } +} /** _.some * Arguments: From d6ad9f4a237b59ff80f8f73de77ef1cfdd766705 Mon Sep 17 00:00:00 2001 From: Malik Daliet Date: Wed, 3 Sep 2025 16:39:53 -0500 Subject: [PATCH 07/10] _.every struggles --- underpants.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/underpants.js b/underpants.js index 702d291..dfc12c1 100644 --- a/underpants.js +++ b/underpants.js @@ -419,8 +419,17 @@ _.pluck = (ao, prop) => { _.every = (coll, func) => { // if (coll === A) _.map(coll, func) + let holder= 0 for (let i = 0; i < coll.length; i++){ - +if (coll.i === false ){ + holder++ +} + } + if(holder < 1){ + return true + } + else { + return false } } From d5ddab2a91dd91ee31566a0cbdc30fc1a7051a34 Mon Sep 17 00:00:00 2001 From: Malik Daliet Date: Thu, 4 Sep 2025 16:21:48 -0500 Subject: [PATCH 08/10] finished underpants --- underpants.js | 69 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 53 insertions(+), 16 deletions(-) diff --git a/underpants.js b/underpants.js index dfc12c1..3c66b56 100644 --- a/underpants.js +++ b/underpants.js @@ -269,7 +269,7 @@ _.filter = (arr, func) => { return holders; } -console.log(_.filter([1, 2, 3, 4, 5], (x) => { return x > 2 })) +//console.log(_.filter([1, 2, 3, 4, 5], (x) => { return x > 2 })) /** _.reject * Arguments: @@ -391,7 +391,7 @@ _.pluck = (ao, prop) => { // for(let i= 0; i < prop.length; i++){ // return prop[i] // } - console.log(holder) + //console.log(holder) return holder // returns the array stored in .map } @@ -417,22 +417,25 @@ _.pluck = (ao, prop) => { * _.every([1,2,3], function(e){return e % 2 === 0}) -> false */ _.every = (coll, func) => { - // if (coll === A) - _.map(coll, func) - let holder= 0 - for (let i = 0; i < coll.length; i++){ -if (coll.i === false ){ - holder++ -} - } - if(holder < 1){ - return true - } - else { - return false + // default function: identity (checks truthiness of elements) + func = (typeof func === "function") ? func : (val => val); + + // map results of func across coll + const results = _.map(coll, (...a) => func(...a)); + + // check if all results are truthy + for (let i = 0; i < results.length; i++) { + if (!results[i]) { + return false; + } } + return true; } + + + +//console.log(_.every([1, 2, 3], function (e) { return e % 2 === 0 })) /** _.some * Arguments: * 1) A collection @@ -454,7 +457,18 @@ if (coll.i === false ){ * _.some([1,2,3], function(e){return e % 2 === 0}) -> true */ +_.some = (coll, func) => { +func = (typeof func === "function") ? func : (val => val); +const results = _.map(coll, (...a) => func(...a)); + // check if all results are truthy + for (let i = 0; i < results.length; i++) { + if (results[i]) { + return true; + } + } + return false; +} /** _.reduce * Arguments: * 1) An array @@ -474,7 +488,23 @@ if (coll.i === false ){ * _.reduce([1,2,3], function(previousSum, currentValue, currentIndex){ return previousSum + currentValue }, 0) -> 6 */ +_.reduce = (arr ,func, seed) =>{ + var result; + var startIndex; + if(seed !== undefined){ + result = seed; + startIndex = 0 + } + else{ +result = arr[0]; +startIndex = 1 + } +for(let i = startIndex; i < arr.length; i++){ + result = func(result, arr[i], i) +} +return result +} /** _.extend * Arguments: * 1) An Object @@ -493,7 +523,14 @@ if (coll.i === false ){ ////////////////////////////////////////////////////////////////////// // DON'T REMOVE THIS CODE //////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// - +_.extend = (obj1,...objs) => { +_.each(objs, o =>{ +for(let key in o){ + obj1[key] = o[key] +} +}) +return obj1 +} if ((typeof process !== 'undefined') && (typeof process.versions.node !== 'undefined')) { // here, export any references you need for tests // From 668f730da7e910835c421605c8c7adf74de92f8c Mon Sep 17 00:00:00 2001 From: Malik Daliet Date: Thu, 4 Sep 2025 16:32:15 -0500 Subject: [PATCH 09/10] finished underpants --- underpants.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/underpants.js b/underpants.js index 3c66b56..ed6856a 100644 --- a/underpants.js +++ b/underpants.js @@ -519,10 +519,6 @@ return result * _.extend(data, {b:"two"}); -> data now equals {a:"one",b:"two"} * _.extend(data, {a:"two"}); -> data now equals {a:"two"} */ - -////////////////////////////////////////////////////////////////////// -// DON'T REMOVE THIS CODE //////////////////////////////////////////// -////////////////////////////////////////////////////////////////////// _.extend = (obj1,...objs) => { _.each(objs, o =>{ for(let key in o){ @@ -531,6 +527,10 @@ for(let key in o){ }) return obj1 } + +////////////////////////////////////////////////////////////////////// +// DON'T REMOVE THIS CODE //////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// if ((typeof process !== 'undefined') && (typeof process.versions.node !== 'undefined')) { // here, export any references you need for tests // From 414bfe26a656618155448d9847c24f6fddbfb7fe Mon Sep 17 00:00:00 2001 From: Malik Daliet Date: Fri, 5 Sep 2025 15:31:08 -0500 Subject: [PATCH 10/10] update --- LICENSE | 21 ++++++++++++++++++ README.md | 61 +++++---------------------------------------------- package.json | 50 ++++++++++++++++++++--------------------- underpants.js | 2 +- 4 files changed, 52 insertions(+), 82 deletions(-) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..7e40c7f --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 [Malik Daliet] + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md index 201f083..b081f5f 100644 --- a/README.md +++ b/README.md @@ -1,59 +1,8 @@ -# Underpants -This activity is essentially a re-write of [underscore.js](http://underscorejs.org/). +# @MalikDaliet/underpants -## Why? -In the past exercises we've been writing a lot of loops over objects and arrays ourselves. Instead of doing that, we are going to write several fuctions to handle the looping for us. These functions are used every day by professional developers and we're well on our way to becoming professional developers!! +A functional utility library implementing underscore.js-style functions. Created as part of a coding bootcamp exercise. -This means that if we're confused about how a function should work, we can check the underscore.js documentation linked above for help. +## Installation -## Instructions - - Open up index.html in a web browser. - - Notice that all the tests are failing. :) - - Open up underpants.js in a text editor and follow the instructions. - - Make all the test pass!! - - Open underpants.html in a text editor to view the code that runs the tests. - -## Links and Resources - -Some quick notes that may come in handy: - -- [underscore documentation](http://underscorejs.org/). -- Many of the functions operate on "collections." They can take both arrays or - objects as their arguments and you need to be able to handle both cases. - - You can use `Array.isArray(obj)` to find out whether an object is an array. - - You can use `obj.length` to test if something is either a string or an - array. -- Javascript has a built-in `Math` object that provides some very useful - functions. [Math Documentation](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math). -- Within a function, you can use the `arguments` variable to access all the - parameters that were passed in even if they aren't named in the function - definition. This is useful if you don't know how many arguments are going to - be passed in in advance. - - You can count the arguments by using `arguments.length` and access each - argument using `arguments[i]`. - - The `arguments` object is very similar to an array, but note that it does - not support most array functions (such as `slice` or `push`). You can read - more about this [here](http://www.sitepoint.com/arguments-a-javascript-oddity/). - -### Extra Credit: -See Instructor for instructions. -- defaults -- *once* -- memoize -- delay -- shuffle - -### Double Extra Credit: -See Instructor for instructions. -- once -- invoke -- sortBy -- zip -- flatten -- intersection -- difference -- throttle - -**Note:** Some browsers provide built-in functions--including `forEach`, `map`, -`reduce` and `filter`--that replicate the functionality of some of the functions -you will implement. Don't use them to implement your functions. +```bash +npm install @MalikDaliet/underpants \ No newline at end of file diff --git a/package.json b/package.json index 5241f24..865698b 100644 --- a/package.json +++ b/package.json @@ -1,33 +1,33 @@ { - "name": "underpants", + "name": "@MalikDaliet/underpants", "version": "1.0.0", - "private": true, - "description": "Functional Functions for Fun", - "main": "data.js", - "directories": { - "test": "test" - }, - "scripts": { - "pretest": "npm install", - "test": "mocha ./test/underpants.spec.js || :", - "posttest": "rm -rf ./node_modules" - - }, + "description": "Functional utility library - student implementation of underscore.js", + "main": "underpants.js", + "keywords": ["functional", "utilities", "underscore", "lodash", "functional-programming"], + "author": "Malik daliet ", + "license": "MIT", "repository": { "type": "git", - "url": "https://github.com/OperationSpark/underpants.git" + "url": "https://github.com/your-github-username/underpants.git" }, - "author": "jfraboni", - "license": "CC", "bugs": { - "url": "https://github.com/OperationSpark/underpants/issues" + "url": "https://github.com/your-github-username/underpants/issues" + }, + "homepage": "https://github.com/your-github-username/underpants#readme", + "engines": { + "node": ">=12.0.0" + }, + "scripts": { + "test": "mocha test/*.spec.js", + "test:browser": "open index.html" }, - "homepage": "https://github.com/OperationSpark/underpants", "devDependencies": { - "chai": "^3.5.0", - "istanbul": "^0.4.5", - "lodash": "^4.17.4", - "mocha": "^3.4.1", - "sinon": "^2.2.0" - } -} + "chai": "^4.3.7", + "mocha": "^10.2.0" + }, + "files": [ + "underpants.js", + "README.md", + "LICENSE" + ] +} \ No newline at end of file diff --git a/underpants.js b/underpants.js index ed6856a..f64579a 100644 --- a/underpants.js +++ b/underpants.js @@ -519,7 +519,7 @@ return result * _.extend(data, {b:"two"}); -> data now equals {a:"one",b:"two"} * _.extend(data, {a:"two"}); -> data now equals {a:"two"} */ -_.extend = (obj1,...objs) => { +_.extend = (obj1,...objs) => { // ..makes paramiters/ arguments arrays _.each(objs, o =>{ for(let key in o){ obj1[key] = o[key]