{"_id":"@almela/obx","_rev":"5-86e0af543f42de7ab95bee08e3e0e326","name":"@almela/obx","dist-tags":{"latest":"0.0.6"},"versions":{"0.0.1":{"name":"@almela/obx","version":"0.0.1","description":"Fast & Lightweight Object Manipulation Library for Javascript","main":"index.js","scripts":{"start":"node build/index.js","watch":"babel src --watch --out-dir build --source-maps","build":"babel src --out-dir build --source-maps","doc-gen":"jsdoc2md --partial docs/partials/*.hbs --param-list-format list --global-index-format grouped --helper docs/*.js --template docs/README.hbs --files src/index.js > README.md","doc-json":"jsdoc2md --json src/index.js > docs/doc.json","test":"jest","test-watch":"jest --watch"},"keywords":["Javascript","JS","Object","Library"],"author":{"name":"Gaetan Almela"},"license":"MIT","dependencies":{"@babel/runtime":"^7.12.5"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"devDependencies":{"@babel/cli":"^7.12.10","@babel/core":"^7.12.10","@babel/preset-env":"^7.12.11","babel-jest":"^27.4.6","jest":"^27.4.7","jsdoc-to-markdown":"^7.1.1"},"gitHead":"0e53c9ff058dfc1c4b8b1590614b79e5b7d70909","_id":"@almela/obx@0.0.1","_nodeVersion":"14.17.6","_npmVersion":"8.4.1","dist":{"integrity":"sha512-Ooag1kf1V2RZNXH1mBBJcmY6CrfRciGhOXDAzQdYLhuH3plGRqMwT9Fdp6DmKeGS10GYV2PiZqlcsa3Bp58Fyg==","shasum":"370dd4d1bb6ca8620179ca5f45a090e261cc4841","tarball":"https://registry.npmjs.org/@almela/obx/-/obx-0.0.1.tgz","fileCount":5,"unpackedSize":38742,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC/EeMtePaIsi+jlcECRDOYSSioVTFRWbFKulnzT6o9tQIgBYsjgwC2WhNWXrFH42lwru0U+BFMenWmRer9XHWiEfw="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiny9mACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrEnxAAojeQN93b+AY/NyJHlIpOZz/AlvQGmFRwvJ+Vpwin4UmVigsT\r\n8Y+yy3s6kDZSRG3h6Rf6kwyFlpbeXR0QHWKVr06f1SAjorPgTSTG3dxHiNFC\r\nJmqPOwpRFJBZ/kkTMpl5e2VIkjb6ijT1Wr8QQ8xhPMX7LYStE20567aKsGDu\r\npH92Mu7tL2F43cjnw5/kv47Gvv0xZoQtvet9uLkNllXNgFiRJtFymOsJqrTm\r\n8pRIaILPZXS1+fhR+VMf9NLY6NVAwPvO8Iks6E2TDqqZ4wKn04r3ERLXNT76\r\nu/7Nw7N5TkSo3HKJySxh0N0jn5MdbGFmf1M2FSFYc70RaQYMSImU54uQwHJg\r\nd580SBNJ5yKkZl2sxqt3U3Voc6SKyawz32GVYA/1TOmrjjyGQLLt5wB7ItKH\r\nMooVBqpuqmVV8cYoDoKNFaTNXGDqnATXLTFl2AvOBOCrp3unMfCHKREp9hmb\r\np8K2tncK3B2zGGcneDWavKnJPshTricBvLdfzgj4OF+q8SCrjYGKKTVdvDlt\r\ndIkqxX8kLRvcqu27TDrlXBty7HL4QrwC4+LtK+XNn4TGvuQTRhbf8U6nGBBi\r\nekY7Nr2jV1ica3oR7tabFpqIkyD2TiO9VPUdFcMGCiG63PFd5tOA7Q/f9FDL\r\nFf1ADApA5hn6uGAYDe72arPrTXOFR18BwtY=\r\n=1cJ/\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"almela","email":"npm@almela.io"},"directories":{},"maintainers":[{"name":"almela","email":"npm@almela.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/obx_0.0.1_1654599526323_0.8885894357617081"},"_hasShrinkwrap":false},"0.0.2":{"name":"@almela/obx","version":"0.0.2","description":"Fast & Lightweight Object Manipulation Library for Javascript","main":"build/index.js","scripts":{"start":"node build/index.js","watch":"babel src --watch --out-dir build --source-maps","build":"babel src --out-dir build --source-maps","doc-gen":"jsdoc2md --partial docs/partials/*.hbs --param-list-format list --global-index-format grouped --helper docs/*.js --template docs/README.hbs --files src/index.js > README.md","doc-json":"jsdoc2md --json src/index.js > docs/doc.json","test":"jest","test-watch":"jest --watch"},"keywords":["Javascript","JS","Object","Library"],"author":{"name":"Gaetan Almela"},"license":"MIT","dependencies":{"@babel/runtime":"^7.12.5"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"devDependencies":{"@babel/cli":"^7.12.10","@babel/core":"^7.12.10","@babel/preset-env":"^7.12.11","babel-jest":"^27.4.6","jest":"^27.4.7","jsdoc-to-markdown":"^7.1.1"},"gitHead":"bd706da69fdb7cc0d49be5605c1d325fd56fb5e9","_id":"@almela/obx@0.0.2","_nodeVersion":"14.17.6","_npmVersion":"8.4.1","dist":{"integrity":"sha512-2PJ0wFO90UlLPV9r8OyENLGk42gwkRMo5GMn4M1jOmZiaPwF2vT6RnREUm3KpC9lXuC9HEReROBV2WRkbrHo2A==","shasum":"3c2ea8b5a01f1eeed66e3097f691647bb5a82265","tarball":"https://registry.npmjs.org/@almela/obx/-/obx-0.0.2.tgz","fileCount":5,"unpackedSize":38737,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGyyqJoWdqTNEDmB6suXIF7h9jIkaxqjjY3h5G+b3CEbAiApjFsefuPkvjno4Dco7Um6n13CqrwLHQWvc0P2X/uuJg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJin+UXACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrB8g//SEq3f9KYRDFye2qGXVNcJm/ijwBY/JCu4IFIK+VJWxBbn/KM\r\nZ7WNAu5h6CbzpCuzZ/RBXwPLPlflFRG3l/645YyyFudb7L6hwSNf7I7Wty9P\r\nmN5+g0W9v0f55IUqbU57PlYwoEBkY1LMFPCNJq9PYDlMt1khak/L35axLwrx\r\ngnkSgLMEUheMtEAtAzSyr5nZ+wrNqDHR89PpbRE7Q8hNX9iqsC5y6Tr8gPJs\r\nzzSBiRbssNjo6Awum8lAe5TXCkBCaH+rFYZC67heoMN/9rsscTSZhlHtmNZ9\r\nm/lUhMXCJxCxN1gfo1w+MmJzNkMrOzjhD8RWeb9xupov28xAv6ou8FBZ+F+N\r\ncqAiM6uo0lIHaG4jjpV2HvlGMYkgboK/b7ucoMXYn7sKdHkxq/Cp2gAMyRmh\r\nwvycYUcEBiCb+JfodUJDFEJAhnbEOzzkuBIsyRtT3ygirf3JttZuMQOSPLqe\r\naczSOPsH+JSPAYq6eRmKi7zi66yw/6fme4d2qYbz8Gy0olP9PY1o09aVney3\r\nJTdzBAsjpAI9HCBLyx7DOInDXykqPMRLwbcjb62F84abvoxYCCqUplVdh8G2\r\n2p7M3yfL/1fE3u0xLj24CL7yS6x1Js0SIS8pw/qgSo5GBO7OdJ/touCosJWy\r\nUfU0UcfwLHUL97GBSSZ1HMxHllGLz4Gv5Q4=\r\n=3PCc\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"almela","email":"npm@almela.io"},"directories":{},"maintainers":[{"name":"almela","email":"npm@almela.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/obx_0.0.2_1654646039537_0.2433011195073449"},"_hasShrinkwrap":false},"0.0.3":{"name":"@almela/obx","version":"0.0.3","description":"Fast & Lightweight Object Manipulation Library for Javascript","main":"build/index.js","scripts":{"start":"node build/index.js","watch":"babel src --watch --out-dir build --source-maps","build":"babel src --out-dir build --source-maps","doc-gen":"jsdoc2md --partial docs/partials/*.hbs --param-list-format list --global-index-format grouped --helper docs/*.js --template docs/README.hbs --files src/index.js > README.md","doc-json":"jsdoc2md --json src/index.js > docs/doc.json","test":"jest","test-watch":"jest --watch"},"keywords":["Javascript","JS","Object","Library"],"author":{"name":"Gaetan Almela"},"license":"MIT","dependencies":{"@babel/runtime":"^7.12.5"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"devDependencies":{"@babel/cli":"^7.12.10","@babel/core":"^7.12.10","@babel/preset-env":"^7.12.11","babel-jest":"^27.4.6","jest":"^27.4.7","jsdoc-to-markdown":"^7.1.1"},"gitHead":"2a2cb551fa5fc8776d007335eb4afb4e6da86cba","_id":"@almela/obx@0.0.3","_nodeVersion":"14.17.6","_npmVersion":"8.4.1","dist":{"integrity":"sha512-DBxFYVq0KrS5O04Z4/G2fHhOTqRCxEZ94xFowAaNOxGg3fpz20eeu8OnKpU3bqQeGuWUFcxMZG/JrSFDZRJSHA==","shasum":"a7aaca7c8ff7b0fe1a539b734e62124af20edced","tarball":"https://registry.npmjs.org/@almela/obx/-/obx-0.0.3.tgz","fileCount":7,"unpackedSize":159371,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICHCD4qoYuWuPXA2jd3drq1Jo8thrfAGhth+bmSdIj2tAiAcfhxaM3sJbB0gJYA3mZzOZWNnNGqLITkioaRASv26Hg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJin+iBACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoZuw//YFSOjMrWyQQiIooLKtuOFtzVi1b9rMfzjBem+mLgzLG+e8XM\r\nRhXjl6SlJW6JyyOx7xZk65tqfr/0ouThXuJh164twNz6hqVXl9gfvCLx2+GN\r\n+Ejz8N+rkg/GYoJHmX+d9C9ffY+JW0mw5GhU5sOOyMaGbjdj0yVYZU/M4vKw\r\nAUgxpDQQS5ByUzakMkf4Zqx8+nBWfmfAWn/FWCsZD3BybKYk8sVSqesijrGR\r\nnUuefWqec0qHC55MgRzlJivdcONL/H2rEl629Gaof/MosaUTYUnkjkYQMuSM\r\ndSNds/DZ0KLcAmFf2bvERYz5IbIGB4mv4rJuEq7UkjTZy/kHDC2hsjf3iHrW\r\n6fT6rsXpusderJ2w+ld77WMuK9UT0klUmyFZ6iY/vdL5O4mET/aD9xRECAjJ\r\nNYd3MWZMFeMG6SbT1kXyMqfeAO5mlvkVl8Ys84BkutdVUkjVQLakcd6IiF20\r\n+waH7lMRsE2rCFgG6+BT2QK+n8Jc1NX5bZWMgNX80vVitgwCwzP5NO8wSYb9\r\nxW3jOM8+3NSI5wHH0lhd/vh7abVvHg48eqwQPs58j5hjnQfXcrrUDn8VMwUS\r\nDbU3ZctZJoJmKOLepyXXgoJDL/sgh+/aQYO0NYddBlsY7NBgFY5lU0IbAhpF\r\nZqpsYgX60oNwUZUgT/i1poUt2cklXZsAntI=\r\n=uZDN\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"almela","email":"npm@almela.io"},"directories":{},"maintainers":[{"name":"almela","email":"npm@almela.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/obx_0.0.3_1654646912998_0.35461281748650175"},"_hasShrinkwrap":false},"0.0.4":{"name":"@almela/obx","version":"0.0.4","description":"Fast & Lightweight Object Manipulation Library for Javascript","main":"build/index.js","scripts":{"start":"node build/index.js","watch":"babel src --watch --out-dir build --source-maps","build":"babel src --out-dir build --source-maps","doc-gen":"jsdoc2md --partial docs/partials/*.hbs --param-list-format list --global-index-format grouped --helper docs/*.js --template docs/README.hbs --files src/index.js > README.md","doc-json":"jsdoc2md --json src/index.js > docs/doc.json","test":"jest --verbose","test-watch":"jest --watch"},"keywords":["Javascript","JS","Object","Library"],"author":{"name":"Gaetan Almela"},"license":"MIT","dependencies":{"@babel/runtime":"^7.12.5"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"devDependencies":{"@babel/cli":"^7.12.10","@babel/core":"^7.12.10","@babel/preset-env":"^7.12.11","babel-jest":"^27.4.6","jest":"^27.4.7","jsdoc-to-markdown":"^7.1.1"},"_id":"@almela/obx@0.0.4","gitHead":"ccefd310f99185b13a56d1c30df951d04aec79f8","_nodeVersion":"21.6.1","_npmVersion":"10.5.0","dist":{"integrity":"sha512-rQLFofF4XiPj9/eKkwU1Wne+g9MNVpRFpnWzwZNeaGzNvcpTutoB47CiNBtcgtECsLKNKzobOrq9/nLYelp3DA==","shasum":"d865e82866a9ff08883b6a75c0a8f3cbd42a9c00","tarball":"https://registry.npmjs.org/@almela/obx/-/obx-0.0.4.tgz","fileCount":3,"unpackedSize":18656,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDQtiucoNWDb8ww4wQPAMLgTnr6AJaJll3wD5tUo00Z8QIhAKZs7hPg57B0RDl6lwFphDnDsb6/LUi9fPEADkQbsMu2"}]},"_npmUser":{"name":"almela","email":"npm@almela.io"},"directories":{},"maintainers":[{"name":"almela","email":"npm@almela.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/obx_0.0.4_1712463729518_0.2518151452737929"},"_hasShrinkwrap":false},"0.0.5":{"name":"@almela/obx","version":"0.0.5","description":"Fast & Lightweight Object Manipulation Library for Javascript","main":"build/index.js","scripts":{"start":"node build/index.js","watch":"babel src --watch --out-dir build --source-maps","build":"babel src --out-dir build --source-maps","doc-gen":"jsdoc2md --partial docs/partials/*.hbs --param-list-format list --global-index-format grouped --helper docs/*.js --template docs/README.hbs --files src/index.js > README.md","doc-json":"jsdoc2md --json src/index.js > docs/doc.json","test":"jest --verbose","test-watch":"jest --watch"},"keywords":["Javascript","JS","Object","Library"],"author":{"name":"Gaetan Almela"},"license":"MIT","dependencies":{"@babel/runtime":"^7.12.5"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"devDependencies":{"@babel/cli":"^7.12.10","@babel/core":"^7.12.10","@babel/preset-env":"^7.12.11","babel-jest":"^27.4.6","jest":"^27.4.7","jsdoc-to-markdown":"^7.1.1"},"_id":"@almela/obx@0.0.5","gitHead":"ccefd310f99185b13a56d1c30df951d04aec79f8","_nodeVersion":"21.6.1","_npmVersion":"10.5.0","dist":{"integrity":"sha512-rk/y1eFpXF7C+Kmhu5ijv0Y8ny+u24xRDtGYJOyGLFpCLW+hlIy6j+PnQ8SAzMLDYgi4WaR/uf2gmimagXlpBw==","shasum":"213a7b16d7ebfdb7eb085a38c361dd23cf47dc07","tarball":"https://registry.npmjs.org/@almela/obx/-/obx-0.0.5.tgz","fileCount":7,"unpackedSize":160388,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDShPgBKV5sGKiy1G1bicsqZcFrsQNVb/RO2n599eNcWAIhALaitJdPweHpWd+Vvg/K6jqzNORg4X1K79KVHLadby46"}]},"_npmUser":{"name":"almela","email":"npm@almela.io"},"directories":{},"maintainers":[{"name":"almela","email":"npm@almela.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/obx_0.0.5_1712464142231_0.6961356924823854"},"_hasShrinkwrap":false},"0.0.6":{"name":"@almela/obx","version":"0.0.6","description":"Fast & Lightweight Object Manipulation Library for Javascript","main":"build/index.js","scripts":{"start":"node build/index.js","watch":"babel src --watch --out-dir build --source-maps","build":"babel src --out-dir build --source-maps","doc-gen":"jsdoc2md --partial docs/partials/*.hbs --param-list-format list --global-index-format grouped --helper docs/*.js --template docs/README.hbs --files src/index.js > README.md","doc-json":"jsdoc2md --json src/index.js > docs/doc.json","test":"jest --verbose","test-watch":"jest --watch"},"keywords":["Javascript","JS","Object","Library"],"author":{"name":"Gaetan Almela"},"license":"MIT","dependencies":{"@babel/runtime":"^7.12.5"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"devDependencies":{"@babel/cli":"^7.12.10","@babel/core":"^7.12.10","@babel/preset-env":"^7.12.11","babel-jest":"^27.4.6","jest":"^27.4.7","jsdoc-to-markdown":"^7.1.1"},"_id":"@almela/obx@0.0.6","gitHead":"6223775cd9229cf670870f3507d1a0e5cae62b23","_nodeVersion":"21.6.1","_npmVersion":"10.5.0","dist":{"integrity":"sha512-9qls+FPY5TjPrv/JZKzizmgJD8mAqWKi4w6gIGslqRFsD/eYfXDvHPHISccdtT0jsfalDpbFXMW5jlvyxiBAYw==","shasum":"a266941146167cac91fa04cc30c2aba2d8923439","tarball":"https://registry.npmjs.org/@almela/obx/-/obx-0.0.6.tgz","fileCount":8,"unpackedSize":173941,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCgsxcU6Xmuu94OpyfXD755clzRGViPHtHshYRcE3jVQAIgPfmLEf1bew4fZJIvTTD77Lz1yz7TjBnyY9tZaXBPQMs="}]},"_npmUser":{"name":"almela","email":"npm@almela.io"},"directories":{},"maintainers":[{"name":"almela","email":"npm@almela.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/obx_0.0.6_1712464397814_0.23538556000273125"},"_hasShrinkwrap":false}},"time":{"created":"2022-06-07T10:58:46.274Z","0.0.1":"2022-06-07T10:58:46.515Z","modified":"2024-04-07T04:33:18.189Z","0.0.2":"2022-06-07T23:53:59.743Z","0.0.3":"2022-06-08T00:08:33.168Z","0.0.4":"2024-04-07T04:22:09.724Z","0.0.5":"2024-04-07T04:29:02.371Z","0.0.6":"2024-04-07T04:33:18.030Z"},"maintainers":[{"name":"almela","email":"npm@almela.io"}],"description":"Fast & Lightweight Object Manipulation Library for Javascript","keywords":["Javascript","JS","Object","Library"],"author":{"name":"Gaetan Almela"},"license":"MIT","readme":"<div id=\"top\"></div>\n<!-- PROJECT SHIELDS -->\n<!--\n*** I'm using markdown \"reference style\" links for readability.\n*** Reference links are enclosed in brackets [ ] instead of parentheses ( ).\n*** See the bottom of this document for the declaration of the reference variables\n*** for contributors-url, forks-url, etc. This is an optional, concise syntax you may use.\n*** https://www.markdownguide.org/basic-syntax/#reference-style-links\n-->\n\n<div align=\"center\">\n\n[![Contributors][contributors-shield]][contributors-url]\n[![Forks][forks-shield]][forks-url]\n[![Stargazers][stars-shield]][stars-url]\n[![Issues][issues-shield]][issues-url]\n[![MIT License][license-shield]][license-url]\n[![LinkedIn][linkedin-shield]][linkedin-url]\n\n</div>\n\n\n<!-- PROJECT LOGO -->\n<br />\n<div align=\"center\">\n  <a href=\"https://github.com/llGaetanll/obx\">\n    <img src=\"docs/img/logo.png\" alt=\"Logo\" width=\"80\" height=\"80\">\n  </a>\n\n<h3 align=\"center\">@almela/obx</h3>\n\n  <p align=\"center\">\n    obx - objects extended\n    <br />\n    <a href=\"https://github.com/llGaetanll/obx#docs\"><strong>Explore the docs »</strong></a>\n    <br />\n    <br />\n    <a href=\"https://www.npmjs.com/package/@almela/obx\">View on NPM</a>\n    ·\n    <a href=\"https://github.com/llGaetanll/obx/issues\">Report Bug</a>\n    ·\n    <a href=\"https://github.com/llGaetanll/obx/issues\">Request Feature</a>\n  </p>\n</div>\n\n\n\n<!-- TABLE OF CONTENTS -->\n<details>\n  <summary>Table of Contents</summary>\n  <ol>\n    <li><a href=\"#about\">About</a></li>\n    <li><a href=\"#getting-started\">Getting Started</a></li>\n    <ul>\n      <li><a href=\"#installation\">Installation</a></li>\n      <li><a href=\"#usage\">Usage</a></li>\n    </ul>\n    <li><a href=\"#docs\">Docs</a></li>\n    <li><a href=\"#roadmap\">Roadmap</a></li>\n    <li><a href=\"#contributing\">Contributing</a></li>\n    <li><a href=\"#license\">License</a></li>\n    <li><a href=\"#contact\">Contact</a></li>\n    <li><a href=\"#acknowledgments\">Acknowledgments</a></li>\n  </ol>\n</details>\n\n\n\n<!-- ABOUT THE PROJECT -->\n## About\nobx is a super fast, tiny, well documented, and battle-tested object manipulation library for Javascript.\n\n\n\n<p align=\"right\">(<a href=\"#top\">back to top</a>)</p>\n\n\n\n<!-- INSTALLATION -->\n## Getting Started\n\n### Installation\nInstall with npm\n   ```sh\n   npm i @almela/obx\n   ```\nor with yarn\n   ```sh\n  yarn add @almela/obx \n   ```\n\n### Usage\nIn your file, simply add\n```js\nimport * as obx from '@almela/obx'\n```\nor simply import select functions\n```js\nimport { eq, cp } from '@almela/obx'\n```\n\n<p align=\"right\">(<a href=\"#top\">back to top</a>)</p>\n\n\n\n<!-- USAGE EXAMPLES -->\n## Docs\nFor even more examples, see the [tests](https://github.com/llGaetanll/obx/blob/master/src/index.test.js).\n\n### Functions\n\n* [eq(a, b, params)](#eq)\n* [cp(o, params)](#cp)\n* [get(o, p)](#get)\n* [set(o, p, v)](#set)\n* [len(o, params)](#len)\n* [map(o, fn, params)](#map)\n* [reduce(o, fn, a, params)](#reduce)\n* [zip(objs, params)](#zip)\n* [sub(o, s, params)](#sub)\n* [add(o, a, params)](#add)\n* [isEmptyObj(o)](#isEmptyObj)\n* [isEmptyArr(a)](#isEmptyArr)\n\n### `eq`\nAssert that two objects are equal.\nObjects are equal if they have the same keys and values.\n\n**Params**\n\n- `a`  : <code>Object</code> - *Object 1* \n- `b`  : <code>Object</code> - *Object 2* \n- `params`  : <code>Object</code> - *Parameters object* \n    - `[.depth]`  : <code>number</code> - *Depth of equality check. Defaults to infinity* \n\n\n\n\n<details>\n<summary><b>Examples</b></summary>\n\nObject order doesn&#x27;t matter\n```js\nobx.eq(\n  { foo: \"bar\", bar: \"baz\" },\n  { bar: \"baz\", foo: \"bar\" }\n)\n// -> true\n```\nWith Arrays\n```js\nobx.eq([1, 2, 3], [1, 2, 3])\n// -> true\n```\nArray order does matter!\n```js\nobx.eq([1, 2, 3], [3, 2, 1])\n// -> false\n```\nCustom depth\n```js\nobx.eq({ foo: \"bar\" }, { foo: \"baz\" }, { depth: 0 })\n// -> true\n```\n\n```js\nobx.eq({ foo: { bar: \"baz\" } }, { foo: {} }, { depth: 1 })\n// -> true\n```\n\n```js\nobx.eq({ foo: { bar: \"baz\" } }, { foo: {} }, { depth: 2 })\n// -> false\n```\nFunctions\n```js\n// Unfortunately, functions are basically impossible to\n// diff. `eq` assumes that all functions are the same.\nobx.eq({ foo: (x) => x + 1 }, { foo: (x) => x + 2 })\n// -> true\n```\n</details>\n\n### `cp`\nDeep copy an object.\n\n**Params**\n\n- `o`  : <code>Object</code> - *Object to copy* \n- `params`  : <code>Object</code> - *Parameters object* \n    - `[.depth]`  : <code>number</code> - *Depth of copy. Defaults to infinity* \n\n\n\n\n<details>\n<summary><b>Examples</b></summary>\n\nCopy by value, not by reference\n```js\nconst a = {\n   foo: {\n     bar: 'baz'\n   }\n}\nconst b = obx.cp(a)\n\na.foo.bar = 'bar'\nconsole.log(b)\n// object remains the same\n// -> {\n//   foo: {\n//     bar: 'baz'\n//   }\n// }\n```\n</details>\n\n### `get`\nGet value from object.\n\n**Params**\n\n- `o`  : <code>Object</code> - *The object* \n- `p`  : <code>String</code> - *Value path* \n\n\n\n\n<details>\n<summary><b>Examples</b></summary>\n\nGet a deep key\n```js\nobx.get(\"foo.bar\", {\n   foo: {\n     bar: \"baz\"\n   }\n});\n// -> \"baz\"\n```\nAlso works with arrays\n```js\nobx.get(\"foo.2.baz\", {\n   foo: [\n     {\n       foo: 'foo'\n     },\n     {\n       bar: 'bar'\n     },\n     {\n       baz: 'baz'\n     }\n   ]\n});\n// -> \"baz\"\n```\nNo key? No problem.\n```js\nobx.get(\"foo.2.baz\", {\n   foo: 'bar'\n})\n// -> null\n```\n</details>\n\n### `set`\nSet value in object.\n\n**Params**\n\n- `o`  : <code>Object</code> - *The object to be mutated* \n- `p`  : <code>String</code> - *Value path* \n- `v`  : <code>Object</code> - *Value to set* \n\n\n\n\n<details>\n<summary><b>Examples</b></summary>\n\n\n```js\nconst o = {}\nobx.set(o, \"foo.bar.baz.haz\", \"hello\")\n// -> {\n//   foo: {\n//     bar: {\n//       baz: {\n//         haz: \"hello\"\n//       }\n//     }\n//   }\n// }\n```\n\n```js\nconst o = {}\nobx.set(o, \"foo.2.foo\", 'bar')\n// o -> {\n//    foo: [<2 empty slots>, {\n//      foo: 'bar'\n//    }]\n// }\n```\n</details>\n\n### `len`\nRecursively find the number of keys of an object.\nNote that this includes object-valued keys.\n\n**Params**\n\n- `o`  : <code>Object</code> - *Object to find length of* \n- `params`  : <code>Object</code> - *Parameters object* \n    - `[.depth]`  : <code>number</code> - *Depth of len check. Defaults to infinity* \n\n\n\n\n<details>\n<summary><b>Examples</b></summary>\n\nSimple object\n```js\nobx.len({ foo: 'bar', bar: 'baz' }) // -> 2\n```\nRecursive object, depth 1\n```js\n// Here depth is only computed at the top level\nobx.len({ foo: 'bar', bar: { bar: 'baz', baz: [1, 2, 3] } }, { depth: 1 }) // -> 2\n```\nRecursive object, infinite depth\n```js\n// Note: array keys are counted\nobx.len({ foo: 'bar', bar: { bar: 'baz', baz: [1, 2, 3] } }) // -> 7\n```\n</details>\n\n### `map`\nRecursively map though all entries of an object.\nNote that map will also iterate through object-valued keys.\n\n**Params**\n\n- `o`  : <code>Object</code> - *Object to map through* \n- `fn`  : <code>function</code> - *Callback function. Contains [k, v] pair, path, object* \n- `params`  : <code>Object</code> - *Parameters object* \n    - `[.depth]`  : <code>number</code> - *Depth of map. Defaults to infinity* \n\n\n\n\n<details>\n<summary><b>Examples</b></summary>\n\nBasic Mapping\n```js\n const o = {\n   foo: \"bar\",\n   bar: \"baz\",\n   baz: \"foo\",\n };\n\n // Note that map will callback on every value of the object, including sub objects!\n const emphasis = ([_, v]) => (v instanceof Object ? v : v + \"!\");\n\n // Note that depth could be anything here, since this is just a flat object.\n obx.map(o, emphasis, { depth: 1 });\n // -> {\n //      foo: \"bar!\",\n //      bar: \"baz!\",\n //      baz: \"foo!\",\n //    }\n```\nRecursive Mapping, low depth\n```js\n const o = {\n   foo: \"bar\",\n   bar: {\n     baz: \"foo\",\n   },\n };\n\n // Note that map will callback on every value of the object, including sub objects!\n const emphasis = ([_, v]) => (v instanceof Object ? v : v + \"!\");\n obx.map(o, emphasis, { depth: 1 });\n // -> {\n //      foo: \"bar!\",\n //      bar: {\n //        baz: \"foo\",\n //      }\n //    }\n //\n //    Note that the inner key is unchanged.\n```\nRecursive Mapping, high depth\n```js\nconst o = {\n   foo: \"bar\",\n   bar: [\n     { foo: \"bar\", bar: \"baz\" },\n     { foo: \"bar\", bar: \"baz\" },\n     { foo: \"bar\", bar: \"baz\" },\n   ],\n   raz: \"faz\",\n };\n\n // Note that map will callback on every value of the object, including sub objects!\n const emphasis = ([_, v]) => (v instanceof Object ? v : v + \"!\");\n obx.map(o, emphasis);\n // -> {\n //       foo: \"bar!\",\n //       bar: [\n //         { foo: \"bar!\", bar: \"baz!\" },\n //         { foo: \"bar!\", bar: \"baz!\" },\n //         { foo: \"bar!\", bar: \"baz!\" },\n //       ],\n //       raz: \"faz!\",\n //    }\n```\n</details>\n\n### `reduce`\nRecursively reduce through all entries of an object.\nNote that reduce will also iterate through object-valued keys.\n\n**Params**\n\n- `o`  : <code>Object</code> - *Object to map through* \n- `fn`  : <code>function</code> - *Callback function* \n- `a`  : <code>Object</code> - *Accumulator* \n- `params`  : <code>Object</code> - *Parameters object* \n    - `[.depth]`  : <code>number</code> - *Depth of reduce. Defaults to infinity* \n    - `[.iter]`  : <code>function</code> - *Iterator used by reduce. Defaults to inorder traversal.* \n\n\n\n\n<details>\n<summary><b>Examples</b></summary>\n\nFlat object\n```js\nconst o = { foo: \"bar\", bar: \"baz\" };\n\nconst combineVals = (a, [k, v]) => [...a, v];\nobx.reduce(o, combineVals, []).join(\", \");\n// -> \"bar, baz\"\n```\nDeeper object\n```js\nconst o = {\n  foo: \"bar\",\n  bar: {\n    baz: \"haz\",\n  },\n};\n\nconst combineVals = (a, [k, v]) => (v instanceof Object ? a : [...a, v]);\nobx.reduce(o, combineVals, []).join(\", \");\n// -> \"bar, haz\"\n```\nCustom depth\n```js\nconst o = {\n  foo: \"bar\",\n  bar: {\n    baz: {\n      haz: \"wow\",\n    },\n    foo: \"bar\",\n  },\n  raz: {\n    faz: \"maz\",\n    gaz: 'haz',\n    haz: [\n      { maz: 'waz' },\n      { foo: 'moo' }\n    ]\n  },\n}\n\nconst combineVals = (a, [k, v]) => (v instanceof Object ? a : [...a, v]);\nobx.reduce(o, combineVals, [], { depth: 2 }).join(\", \");\n// -> \"bar, bar, maz, haz\"\n// Only gets keys down to depth 2\n```\n</details>\n\n### `zip`\nGroup multiple objects into a single iterator.\nNote that zip will also iterate through object-valued keys.\n\n**Params**\n\n- `objs`  : <code>Array</code> - *Array of objects to be zipped together.* \n- `params`  : <code>Object</code> - *Parameters object* \n    - `[.depth]`  : <code>number</code> - *Depth of zip. Defaults to infinity* \n    - `[.key]`  : <code>Boolean</code> - *Whether zip should return object keys. Defaults to `false`* \n    - `[.val]`  : <code>Boolean</code> - *Whether zip should return object values. Defaults to `true`* \n    - `[.last]`  : <code>Boolean</code> - *Whether zip should stop iterating when the last object is done, as opposed to the first. Defaults to `false`* \n    - `[.iter]`  : <code>function</code> - *Iterator used by zip. Defaults to inorder traversal.* \n\n\n\n\n<details>\n<summary><b>Examples</b></summary>\n\nStops at the first null value\n```js\nconst a = [\"a\", \"b\", \"c\"];\nconst b = [1];\n\n// loop runs only once\nfor (const z of obx.zip([a, b]))\n console.log(z)\n// -> [\"a\", 1]\n```\nRecursive\n```js\n const a = {\n  foo: \"bar\",\n  bar: {\n    baz: \"haz\",\n  },\n};\n\nconst b = [4, 5];\n\nfor (const z of obx.zip([a, b]))\n console.log(z)\n// -> [\"bar\", 4]\n// -> [\"haz\", 5]\n```\nMore than 2 Objects\n```js\nconst a = [\"a\", \"b\", \"c\"];\nconst b = [1, 2, 3];\nconst c = [\"x\", \"y\", \"z\"];\nconst d = [3, 2, 1];\n\nfor (const z of obx.zip([a, b, c, d]))\n console.log(z)\n// -> [\"a\", 1, \"x\", 3]\n// -> [\"b\", 2, \"y\", 2]\n// -> [\"c\", 3, \"z\", 1]\n```\n</details>\n\n### `sub`\nRecursive, in-place object subtraction.\n\n**Params**\n\n- `o`  : <code>Object</code> - *The object to be subtracted from. This object is mutated.* \n- `s`  : <code>Object</code> - *The object to subtract with* \n- `params`  : <code>Object</code> - *Parameters object* \n    - `[.depth]`  : <code>number</code> - *Depth of subtraction. Defaults to infinity* \n\n\n\n\n<details>\n<summary><b>Examples</b></summary>\n\nSimple subtraction\n```js\nconst a = {\n  foo: \"bar\",\n  bar: \"baz\",\n  list: [1, 2, 3],\n};\n\nconst b = {\n  foo: \"bar\",\n  list: [1, 2, 3],\n};\n\nobx.sub(a, b);\nconsole.log(a)\n// -> { bar: \"baz\" }\n```\nWith arrays\n```js\nconst a = [1, 2, 3];\nconst b = [1, 2, 3];\n\nobx.sub(a, b);\nconsole.log(a)\n// -> []\n```\n</details>\n\n### `add`\nRecursive, in-place object addition.\nIf both objects contain the same key, defaults to o\n\n**Params**\n\n- `o`  : <code>Object</code> - *The object to be added to. This object is mutated.* \n- `a`  : <code>Object</code> - *The object to add with* \n- `params`  : <code>Object</code> - *Parameters object* \n    - `[.depth]`  : <code>number</code> - *Depth of addition. Defaults to infinity* \n\n\n\n\n<details>\n<summary><b>Examples</b></summary>\n\nSimple addition\n```js\nconst a = {\n  foo: \"bar\",\n  bar: \"baz\",\n  list: [1, 2, 3],\n};\n\nconst b = {\n  foo: \"bar\",\n  haz: 5,\n};\n\nobx.add(a, b);\nconsole.log(a)\n// -> { foo: \"bar\", bar: \"baz\", list: [1, 2, 3], haz: 5 }\n```\n</details>\n\n### `isEmptyObj`\nAssert that an object type is empty.\n\n**Params**\n\n- `o`  : <code>Object</code> - *Object to assert is empty* \n\n\n\n\n<details>\n<summary><b>Examples</b></summary>\n\n\n```js\nobx.isEmptyObj({}) // -> true\n```\n\n```js\nobx.isEmptyObj({ foo: 'bar' }) // -> false\n```\nOnly works for objects\n```js\nobx.isEmptyObj([]) // -> false\n```\n</details>\n\n### `isEmptyArr`\nAssert that an array type is empty.\n\n**Params**\n\n- `a`  : <code>Array</code> - *The array to assert is empty* \n\n\n\n\n<details>\n<summary><b>Examples</b></summary>\n\n\n```js\nobx.isEmptyArr([]) // -> true\n```\n\n```js\nobx.isEmptyArr([1, 2, 3]) // -> false\n```\nOnly works for arrays\n```js\nobx.isEmptyArr({}) // -> false\n```\n</details>\n\n\n<p align=\"right\">(<a href=\"#top\">back to top</a>)</p>\n\n\n\n<!-- ROADMAP -->\n## Roadmap\n\n- [x] Write docs\n- [ ] Write `eq` in terms of a list of objects?\n  - [ ] Rewrite `eq` using inorder iterator\n- [x] Implement `zip`\n- [ ] Create new file of opinionated functions with nicer signatures based on existing functions \n  - Other helpful functions like `isEmptyObj` and `isEmptyArr` could go in there too\n- [x] Add traversal options to\n  - [x] `reduce`\n  - [x] `zip`\n- [x] Complete test coverage\n  - [x] Test `add`\n- [ ] Transition to TS\n\n<!-- See the [open issues](https://github.com/llGaetanll/obx/issues)\nfor a full list of proposed features (and known issues). -->\n\n<p align=\"right\">(<a href=\"#top\">back to top</a>)</p>\n\n\n\n<!-- CONTRIBUTING -->\n<!--\n\n## Contributing\n\nContributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are **greatly appreciated**.\n\nIf you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag \"enhancement\".\nDon't forget to give the project a star! Thanks again!\n\n1. Fork the Project\n2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`)\n3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`)\n4. Push to the Branch (`git push origin feature/AmazingFeature`)\n5. Open a Pull Request\n\n<p align=\"right\">(<a href=\"#top\">back to top</a>)</p>\n\n-->\n\n\n\n<!-- LICENSE -->\n## License\n\nDistributed under the MIT License. See `LICENSE.txt` for more information.\n\n<p align=\"right\">(<a href=\"#top\">back to top</a>)</p>\n\n\n\n<!-- CONTACT -->\n## Contact\n\n**Twitter**: [@GaetanAlmela](https://twitter.com/GaetanAlmela)\n\n**Email**: npm@almela.io\n\n**GitHub Repo**: [llGaetanll/obx](https://github.com/llGaetanll/obx)\n\n<p align=\"right\">(<a href=\"#top\">back to top</a>)</p>\n\n\n\n\n<!-- MARKDOWN LINKS & IMAGES -->\n<!-- https://www.markdownguide.org/basic-syntax/#reference-style-links -->\n[contributors-shield]: https://img.shields.io/github/contributors/llGaetanll/obx.svg?style=for-the-badge\n[contributors-url]: https://github.com/llGaetanll/obx/graphs/contributors\n[forks-shield]: https://img.shields.io/github/forks/llGaetanll/obx.svg?style=for-the-badge\n[forks-url]: https://github.com/llGaetanll/obx/network/members\n[stars-shield]: https://img.shields.io/github/stars/llGaetanll/obx.svg?style=for-the-badge\n[stars-url]: https://github.com/llGaetanll/obx/stargazers\n[issues-shield]: https://img.shields.io/github/issues/llGaetanll/obx.svg?style=for-the-badge\n[issues-url]: https://github.com/llGaetanll/obx/issues\n[license-shield]: https://img.shields.io/github/license/llGaetanll/obx.svg?style=for-the-badge\n[license-url]: https://github.com/llGaetanll/obx/blob/master/LICENSE.txt\n[linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=for-the-badge&logo=linkedin&colorB=555\n[linkedin-url]: https://linkedin.com/in/gaetan-almela-092973162","readmeFilename":"README.md"}