{"_id":"@skypilot/sugarbowl","_rev":"217-b8e6adf1b0dad828861952ec08a13d96","name":"@skypilot/sugarbowl","dist-tags":{"latest":"3.4.0","edge":"1.4.1-edge","next":"4.0.0-next.9","beta":"1.4.5-beta.0","alpha":"4.0.0-alpha.28"},"versions":{"0.2.0":{"name":"@skypilot/sugarbowl","version":"0.2.0","description":"A collection of convenience functions for JavaScript & TypeScript","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"build":"babel ./src -d ./lib --extensions .ts","generate-typings":"tsc --project tsconfig.generate-typings.json","prepublishOnly":"npm run build && npm run generate-typings","test":"jest"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"keywords":["javascript","typescript","utility","functions","arrays","strings","objects"],"author":{"name":"William Thorsen"},"license":"ISC","bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"homepage":"https://github.com/skypilotcc/sugarbowl#readme","dependencies":{},"devDependencies":{"@babel/cli":"^7.4.4","@babel/core":"^7.4.5","@babel/node":"^7.4.5","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/plugin-proposal-numeric-separator":"^7.2.0","@babel/plugin-proposal-object-rest-spread":"^7.4.4","@babel/preset-env":"^7.4.5","@babel/preset-typescript":"^7.3.3","@babel/runtime":"^7.4.5","@types/jest":"^24.0.15","@types/node":"^12.0.8","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","babel-jest":"^24.8.0","eslint":"^5.16.0","eslint-plugin-jest":"^22.7.0","jest":"^24.8.0","prettier":"^1.18.2","typescript":"^3.5.2"},"gitHead":"273be585bc502755e492a5f0a2c7cd9eabe6369a","_id":"@skypilot/sugarbowl@0.2.0","_nodeVersion":"10.14.1","_npmVersion":"6.9.0","dist":{"integrity":"sha512-S5M7NXEFIy3X3vDzh6YCz1vdjMsJyGlDY1AzcChq26v3tz1ahQeWLhkLjkr4oUGbGOtrBVxD7olzobgyI+Rp3w==","shasum":"f5ac13b9d494dfccc064b49bf3816cbd69673993","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-0.2.0.tgz","fileCount":41,"unpackedSize":11116,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdDpDGCRA9TVsSAnZWagAA7pwP/3sk5vyjTCkm6kcEuvGj\n/GjvaCO+4Itrs9ViAQxLeKVtBWdqFIEqyyGYmvwfaH+EMGfDXYM4Djad1AIp\nhEGRVRvZfDURZk2Xh3B18ug8DXyFfbeC5p7UWn/8yqSWs8IcF3m+uZ8qYfET\nTWU3u0n19rWTF8qD3umanU/ltVGbcmOOM/4nNKBGvodv9GEeWIEByyh+WpYS\nxf3O5egVuhco1Rjh8MXL/+nRzu4ULf4SOZIa4LezK83FRFSPKnemMv6Knk5R\nXp5jGPvrtf061ZO6WbjoQJdEl8sS7/tVy2E9rtfj3u5FSJpn4Sx0tVh/hBy0\n5FI/8YBXyT7qvnMXskIDSUH6r9iqBsU/b+McsW59H1dAaGOhX+0XccXpcfkC\nbv8J0zM7Gue2M+npHWnkjapQnlWtV1+aNxE1GJAFWRnEbqVnzVqsNkgq83Hq\nLmFeu1WlnRmBaYCYOQq//xr4y200OUJsb6069P6xI9eLQO9Eau0Keasyn4T3\nP4E1PNqI8Z7T460musb2ou/o0mrQIbKZvgsq11LSPgTnANwD+SDwqB3yOnX7\nyOyM1KUKlkugBScTFz7pvnpCg3KGPpdOJjesdIdz3X79jJsCHkyUhUy6aMUN\n9VcvUc11DGorUjPf9ychQbWE1JZOG6F3KomGUeSN2Io005TFMM8UhHzG4xD8\nLnZ7\r\n=gvvQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDcauV3nqpBQb7mZmV8/nQDYEbbw3GgEvm0v0cVzPvOHwIgcFXTz0s0mBPLhn2EBsVplvKhtAw4Vb0HrsXMq+Jka0o="}]},"maintainers":[{"name":"thorsenio","email":"william@thorsen.io"}],"_npmUser":{"name":"thorsenio","email":"william@thorsen.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_0.2.0_1561235653740_0.41348664670647506"},"_hasShrinkwrap":false},"0.3.0":{"name":"@skypilot/sugarbowl","version":"0.3.0","description":"A collection of convenience functions for JavaScript & TypeScript","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"build":"babel ./src -d ./lib --extensions .ts --ignore '**/*.test.ts'","generate-typings":"tsc --project tsconfig.generate-typings.json","prepublishOnly":"npm run build && npm run generate-typings","test":"jest"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"keywords":["javascript","typescript","utility","functions","arrays","strings","objects"],"author":{"name":"William Thorsen"},"license":"ISC","bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"homepage":"https://github.com/skypilotcc/sugarbowl#readme","dependencies":{},"devDependencies":{"@babel/cli":"^7.4.4","@babel/core":"^7.4.5","@babel/node":"^7.4.5","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/plugin-proposal-numeric-separator":"^7.2.0","@babel/plugin-proposal-object-rest-spread":"^7.4.4","@babel/preset-env":"^7.4.5","@babel/preset-typescript":"^7.3.3","@babel/runtime":"^7.4.5","@types/jest":"^24.0.15","@types/node":"^12.0.8","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","babel-jest":"^24.8.0","eslint":"^5.16.0","eslint-plugin-jest":"^22.7.0","jest":"^24.8.0","prettier":"^1.18.2","typescript":"^3.5.2"},"gitHead":"669cd2e20185936e3868474afb582fa8bd2ff649","_id":"@skypilot/sugarbowl@0.3.0","_nodeVersion":"10.14.1","_npmVersion":"6.9.0","dist":{"integrity":"sha512-MyTlemkJ5fPalXV3dGafCYqD3tqL/+B/MDpf9nlfFNyAWmAtoPngZhP0eV227G6tPnopZVCcTVjAcZVsVB7iwA==","shasum":"1e281a110d4e2464194044ab86516cacfee66cbd","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-0.3.0.tgz","fileCount":36,"unpackedSize":11945,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdD7chCRA9TVsSAnZWagAApSoP/0TlDbWb+hqq9MBxg8OS\nlnn23i8/Z7hHD8DtnVY21Y6xhf7prcL/k708AfSgoLjVK5b5FyRyZf4pGvP4\nn2P5eZdub2OK9Ceriz8kTb292edsWOZpE+RgzO3/LzO52dC7bjShkkJTEhOL\nULtpr9l6yRMeGGIPlb4GDTNM9FrriSO2YeQTmVcMNYEHisbjj1TORN0j57US\ni3riCvh6KPG/X5INQZfcodFhJ1KGe6Hf7KTTdwurapDvhCsKGZKUFXs5jrtr\nU4nq7tyOMnyZNEgIjgQFEIqZp63ym2iS6xG6dBKd4+mM11ulYH9yfi7IsZ18\n4Pb8VLDuE3v3T6lmA6dQiQr0ri50cKVjgjtLNaoQlNj+553Y0kYa0HHNy/gQ\nBMkx7sFk6LagclZ7v6gD2tBU3FVK4Xa3pLiSVGPozcCC+79j5tiaei6TT1Ff\nyXEYDcLrhkCtyuL2Rv2o5LPa/2FMBIdkPU9M1804SBIOhnvEt5LYOpds3znH\nZPham+3jGPxiHaciDE4n6fo45vDTmRi9on9QKBngsvjpa01HDWb7MvvacAvU\n/2O4SIaAKW7EVx+fJhGcnjg+iFrJ4rbuisY0JXf84XponH3f43idbKyiaOy7\n8rtIKgUk3iGyMxhThxM23UwFni6m6oHx+JpBgxe8ZED7x6LZwrbnWpEpVcql\nslhX\r\n=TrRt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC76SqflbSNi4k9RF7btM5A+BMptz/d6hn9FIg7ZkZN/gIgSQvVh3R17B/5L3XO7oSV5z+Rt5dhOVz1yQxTIuvJHGo="}]},"maintainers":[{"name":"thorsenio","email":"william@thorsen.io"}],"_npmUser":{"name":"thorsenio","email":"william@thorsen.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_0.3.0_1561311008610_0.09675562085270673"},"_hasShrinkwrap":false},"0.3.1":{"name":"@skypilot/sugarbowl","version":"0.3.1","description":"A collection of convenience functions for JavaScript & TypeScript","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"build":"babel ./src -d ./lib --extensions .ts --ignore '**/*.test.ts'","generate-typings":"tsc --project tsconfig.generate-typings.json","prepublishOnly":"npm run build && npm run generate-typings","test":"jest"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"keywords":["javascript","typescript","utility","functions","arrays","strings","objects"],"author":{"name":"William Thorsen"},"license":"ISC","bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"homepage":"https://github.com/skypilotcc/sugarbowl#readme","dependencies":{},"devDependencies":{"@babel/cli":"^7.4.4","@babel/core":"^7.4.5","@babel/node":"^7.4.5","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/plugin-proposal-numeric-separator":"^7.2.0","@babel/plugin-proposal-object-rest-spread":"^7.4.4","@babel/preset-env":"^7.4.5","@babel/preset-typescript":"^7.3.3","@babel/runtime":"^7.4.5","@types/jest":"^24.0.15","@types/node":"^12.0.8","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","babel-jest":"^24.8.0","eslint":"^5.16.0","eslint-plugin-jest":"^22.7.0","jest":"^24.8.0","prettier":"^1.18.2","typescript":"^3.5.2"},"gitHead":"6a2dd4204aa905b29f1064c970b46af097c57b0d","_id":"@skypilot/sugarbowl@0.3.1","_nodeVersion":"10.14.1","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Nz/JQJwc9BHM2Ll0d1c0ysfkUyAr7GWzqT3fdYxPQ55fa5KV5Xplawy3tHm7SZZVr8XASRe1pQDBkZZ95G84OA==","shasum":"7f0907baa5e114bdfeca31501ff6135660893d0f","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-0.3.1.tgz","fileCount":37,"unpackedSize":13214,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdD79vCRA9TVsSAnZWagAAnCEP/2a2T+RflRBlkvGbAumP\nLQM+OKnyBSHe+3XG03TEdeUJgJB4StBKYnsYobbE88GazqKGvbjUa5hNPASV\nfQRft8t4x0Q0NTXwy1dQEIE+QzuxjbFv++QkPG150WWZVQB0YsACv/j2ceNn\nwIE4Gi6ROabllw7aUXvLIE4GsWGb35aaQ6jl4joxngRkqSlNMB/AZH7xAcln\nAIG959bkmbyUuMeWVtaBBRpEdomiOEt3XpWJi8KJNHs7d6M+Xi3QdMXjsMme\nWvDS+RuxiDPNOsh0I/ccpbwtuxDlGMn+Y0gbajMrLloNn9tjpUZAp2Vv0cfe\nb/oI5g+Txg2xyPFkDEb8rV50DY00XZPXQywM+E8zpYEi9yEy9GX5+QGF/B8U\nQVInsEn1PSNlUqnQ/8ZmIzCUFC69+RYRdVurkEfYerVd7gHRKvLvlOTw5wDk\nOwMdJ1QKO3NNbxYadMWP2r7GdEbzN1FhJIlVXpOmc+SG3vuSsB3GoGomy5Db\nGKat49d10fx97o4Qff+UxmqvNC2uVmYmOR91w2QmJuXpE2pD4p0QToi2wb2G\nJQCkEAeF8Ow3YfMrb2IsEvgrSBfOGWvA0ooOXREI+bQ959mhRm9KacOM1m8w\nqm4rP/HElvqvEYi/fUycPf4EMz1j40DbMG+jQGGazxl5aS88ZPLe5ssl84H3\n73C6\r\n=U+z/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAa3+R3AYefyIHEkUfQpYg1aQK7mFX5hGvGukTDPGkn1AiEAirTaXZibTotRuREokQoJYUybOPZsY7YEJ3YWrovMWvg="}]},"maintainers":[{"name":"thorsenio","email":"william@thorsen.io"}],"_npmUser":{"name":"thorsenio","email":"william@thorsen.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_0.3.1_1561313134464_0.7880493382362181"},"_hasShrinkwrap":false},"0.3.2":{"name":"@skypilot/sugarbowl","version":"0.3.2","description":"A collection of convenience functions for JavaScript & TypeScript","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"build":"babel ./src -d ./lib --extensions .ts --ignore '**/*.test.ts'","generate-typings":"tsc --project tsconfig.generate-typings.json","prepublishOnly":"npm run build && npm run generate-typings","test":"jest"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"keywords":["javascript","typescript","utility","functions","arrays","strings","objects"],"author":{"name":"William Thorsen"},"license":"ISC","bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"homepage":"https://github.com/skypilotcc/sugarbowl#readme","dependencies":{},"devDependencies":{"@babel/cli":"^7.4.4","@babel/core":"^7.4.5","@babel/node":"^7.4.5","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/plugin-proposal-numeric-separator":"^7.2.0","@babel/plugin-proposal-object-rest-spread":"^7.4.4","@babel/preset-env":"^7.4.5","@babel/preset-typescript":"^7.3.3","@babel/runtime":"^7.4.5","@types/jest":"^24.0.15","@types/node":"^12.0.8","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","babel-jest":"^24.8.0","eslint":"^5.16.0","eslint-plugin-jest":"^22.7.0","jest":"^24.8.0","prettier":"^1.18.2","typescript":"^3.5.2"},"gitHead":"45116fee5b973124ab03b04274b9c0ccfc3a676b","_id":"@skypilot/sugarbowl@0.3.2","_nodeVersion":"10.14.1","_npmVersion":"6.9.0","dist":{"integrity":"sha512-YV2FXZNX7I3lTPLSA7lmrwNmzWTayS4O/bc2DmYBvNj3Nckicubgjvmx4Q3D5KpLc2b2W3mjSYtd84G8ywdNjA==","shasum":"80ea6482477cf8329260d97211b218396bdb86b3","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-0.3.2.tgz","fileCount":34,"unpackedSize":11453,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdD9jeCRA9TVsSAnZWagAAthkP/ia2Jua+WYGWDW9JHZVw\ngLjoJmPWOFC55zBSKk4iTPqiGoBcj9wK24iRVjdFX79qqjs67kqNjyBPGDOA\nYeFTWww0T2HcLmGIgKILPlQM7T4lewULrzGZTw7t95D+/GOZ+B25cYCL3cJu\nGGmzv5TVbYgRyLh6tMdmPYEPuvW+MBT/1dpu31xB9OjtnBh5Zlo1d9Ot+Hdk\nMB6mchNt0w1JCCIXO4bVZP6HE+n+AXdpswgbZ0lfHeByw1HfqCIKKrQNzOxE\nrAPbH1d4ItN7/SnfA0BgPPzxnzCBDXyqkJ0JbZL5ueAlan0Jx0nTmEhL0Ebt\nLDJSLnzhngt6VOW/dL5LuzTov67Tythuhia9m2bkDhvsNAU8XJtikSK+99F/\nfbB4qR9P39EQpAGbYfQU4vd4iA0a3WBJoHqt65CohMd+OYTDCMN7Z4rhYDp0\nHIZT3ta/QH6RzyyaNHN26W0uwUXgQCmWGZWvC8F5Nd5+v+Yy3pY4f+g9W5c9\nmZ8baD+YgTTATYMm6OFUUZX/9FCI0zCgIxDKEzknGalqjqI4ECw5emkrX4Np\nN7/UIP8Syz25YWY57ZhQFYEQ0WUR5R1VvCIvYK1AfQLu/V/mBTlwQr67yENf\nS9AlkelHFzd+I204H2DfDDCRoVn9Y0lLaLc75Y4qaODz9tKvlOQsoZdmNq4h\nH3cA\r\n=0ZRc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFT73fT7n9MItEADmikVtPGu5f3S8GYHZ7OJyGt08dkGAiAJEJ4UN0hvumBzalL0NdUUq7gGl641aHgdKJDv3frpsA=="}]},"maintainers":[{"name":"thorsenio","email":"william@thorsen.io"}],"_npmUser":{"name":"thorsenio","email":"william@thorsen.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_0.3.2_1561319645944_0.18881810566755264"},"_hasShrinkwrap":false},"0.4.0":{"name":"@skypilot/sugarbowl","version":"0.4.0","description":"A collection of convenience functions for JavaScript & TypeScript","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"build":"babel ./src -d ./lib --extensions .ts --ignore '**/*.test.ts'","generate-typings":"tsc --project tsconfig.generate-typings.json","prepublishOnly":"npm run build && npm run generate-typings","test":"jest"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"keywords":["javascript","typescript","utility","functions","arrays","strings","objects"],"author":{"name":"William Thorsen"},"license":"ISC","bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"homepage":"https://github.com/skypilotcc/sugarbowl#readme","dependencies":{},"devDependencies":{"@babel/cli":"^7.4.4","@babel/core":"^7.4.5","@babel/node":"^7.4.5","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/plugin-proposal-numeric-separator":"^7.2.0","@babel/plugin-proposal-object-rest-spread":"^7.4.4","@babel/preset-env":"^7.4.5","@babel/preset-typescript":"^7.3.3","@babel/runtime":"^7.4.5","@types/jest":"^24.0.15","@types/node":"^12.0.10","@typescript-eslint/eslint-plugin":"^1.11.0","@typescript-eslint/parser":"^1.11.0","babel-jest":"^24.8.0","eslint":"^5.16.0","eslint-plugin-jest":"^22.7.1","jest":"^24.8.0","prettier":"^1.18.2","typescript":"^3.5.2"},"gitHead":"757cc559e81aaef428c502b05153adfbc294809b","_id":"@skypilot/sugarbowl@0.4.0","_nodeVersion":"10.14.1","_npmVersion":"6.9.0","dist":{"integrity":"sha512-2F9WSzVrFSvOF77WDcfGM6r9Vl4Vv4Sxc2kV7c+I48mSWOm9RilYxTyp19sOA8YEroUzJMzL0rapZEZCjDwfow==","shasum":"2f2407bc1ceda4a134a2cb3da8e617cf34b94c0e","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-0.4.0.tgz","fileCount":38,"unpackedSize":12716,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdERnuCRA9TVsSAnZWagAAlbQP+wQOqL0eK8TDK0L5Yipi\nEhC+yVOdgASgFLSJ6FodKcbyCfWw6fG6HNY5Lg5LPd3U0Ind4kIVpVEeZ6Ky\now5M2WXHtWXBQZhRWgnZoi/eM8gPol1BMbqLUvU8OhYue5jXwyafTBsjHMXV\nG6raDfg8JVlYR1wYkrJJiB7LilfVjyOtlqCgUIOmNYMLQafXeSvBvKwcWMPu\nyu5K1RTgYp+pCCw/IrlIBUvu9K57Ikf4bv67tXqTm+K6+j5TSplR2fxsnnrX\nbIL7/uICnDxw34wnYzKbcS8VGAhEG8GiTPJ41O2uL0xEC62/Y9PXBq982XXN\n2XKxh0vWB/vFHoiaSU6UtPyd2a4IhvTbxA+rvB7IDgPBTZgJ4wWavFCkFwMC\n+YbkqrzpYCA0Ko+6GS8x/2vFhsfaFaEer76UCF6GpgsLHvKq1OuAQSOrdg8i\nVLGma+pU5KD/G3LNosJEW15Gg/37pGM+krcRLHKgRaKqcFAU4DcmCBD/rbxP\nuFt5B1X3She0TwQ+bu6CnwFRrGVwV9wyZZpDcSTAbCjNcketz88lsSSO7GQh\nqBT286q9DVEA2+Blkwii+F9k2J9kFwOjRx3sjQwpe2RRwfbSlMIE8UA8vuW+\nyim6dF2hVEIkqw3QMItRom3Qnr3blUS3R7t5+rK+eaDbxReTGh4RjDti8rrB\n2E+V\r\n=8oaH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC1lS1jQ3uINyL2RAgplWGhPiO+qAgfIk23EyR5ysBIGAiEA5LcWbPfO0vbKBv9xasoDGSGzlHVWGddHwopAeV3sCEU="}]},"maintainers":[{"name":"thorsenio","email":"william@thorsen.io"}],"_npmUser":{"name":"thorsenio","email":"william@thorsen.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_0.4.0_1561401837573_0.5911477919939299"},"_hasShrinkwrap":false},"0.4.1":{"name":"@skypilot/sugarbowl","version":"0.4.1","description":"A collection of convenience functions for JavaScript & TypeScript","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"build":"babel ./src -d ./lib --extensions .ts --ignore '**/*.test.ts'","generate-typings":"tsc --project tsconfig.generate-typings.json","prepublishOnly":"npm run build && npm run generate-typings","test":"jest"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"keywords":["javascript","typescript","utility","functions","arrays","strings","objects"],"author":{"name":"William Thorsen"},"license":"ISC","bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"homepage":"https://github.com/skypilotcc/sugarbowl#readme","dependencies":{},"devDependencies":{"@babel/cli":"^7.4.4","@babel/core":"^7.4.5","@babel/node":"^7.4.5","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/plugin-proposal-numeric-separator":"^7.2.0","@babel/plugin-proposal-object-rest-spread":"^7.4.4","@babel/preset-env":"^7.4.5","@babel/preset-typescript":"^7.3.3","@babel/runtime":"^7.4.5","@types/jest":"^24.0.15","@types/node":"^12.0.10","@typescript-eslint/eslint-plugin":"^1.11.0","@typescript-eslint/parser":"^1.11.0","babel-jest":"^24.8.0","eslint":"^5.16.0","eslint-plugin-jest":"^22.7.1","jest":"^24.8.0","prettier":"^1.18.2","typescript":"^3.5.2"},"gitHead":"7fd72fc5848ef16dae861f18c1f7259c03b9b843","_id":"@skypilot/sugarbowl@0.4.1","_nodeVersion":"10.14.1","_npmVersion":"6.9.0","dist":{"integrity":"sha512-UyMtSF4kt5mLmrXlni9YRK+HD4BK6gyRRR2e1KOcc9FvGmOlQiaTK+GPhMDhx/OzxMVdzIrzpevcEhuS+Yz3CA==","shasum":"b5c38d97b898f5939a4e21539a6ed7409af95a86","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-0.4.1.tgz","fileCount":38,"unpackedSize":13166,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdER5nCRA9TVsSAnZWagAAJW8P/3Cer/N1v8zcCPKuLC4e\nKIqq7lkMX78n7VV8OWnnvBFTGvqKI7/ok8CEdwWVCvGAbBLCV+dmwKrAH9MG\nVjQR/GGHurwXXhjqGv4vEag5EMmj4peHxifuQkzjKpeFTxa2qb3HWXm+cGZv\nFp+BhmHifaTfEbtDUGrIDWr+WI19Mac7iPNLwqdYs5py9pBJ78FTGtkqe2sF\n/AbGewxnW0d92X2IDQ1gBpuyt9vNJPq+6JwYqbdX+NpYclDEIx/OIhUt5mk2\nF09jjqCxFqSdXvznyOlmeIvXAvVVE+7ZaT5MIOpMlb6b6hGkXGE1NlJNhWuw\nzcOpHYKx6fuxcA2mlzCrXTpoXm4lISbCFUIs7J81pbttes3O5T3wbwxfTPTG\nKTOl1NRSY9nwvxYwTfqgkXwJriOT6JgdH2pUY6gD00+syohGWvSCzGbSqYc9\nmDkWWgi8Ck7jFpwB3a2U7yqVEAWZaqsED3kSRiGk4zAtjHVMsMUlc+s8+PCj\nAT6TFUa34th3SaCq3A9gWkWdGPnMzYrMNRlZv3s+66HmnG+hdaJKWOVo3H2i\nCjIDJw44iIfnCLwurnkNEpZLAqkX9iU92wG5NhWd9nJWS2n77I0mFnuvf5My\n4NbLZkFUbTt7ILu6B8Jb6Jh6+exEcNxlXOlhugt/C6xwvF4RlS3BA3tznuhr\nfBi2\r\n=4Tnk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCViLHrCpLBSzeKE9YrSPP8XA/Tb5Zr7TIsH6zLR/jQWwIgN47T3hRHEwb+QTle7NGgjWlNwOzlrnCnTOg6bOjV+dY="}]},"maintainers":[{"name":"thorsenio","email":"william@thorsen.io"}],"_npmUser":{"name":"thorsenio","email":"william@thorsen.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_0.4.1_1561402982974_0.8340963954258533"},"_hasShrinkwrap":false},"0.5.0":{"name":"@skypilot/sugarbowl","version":"0.5.0","description":"A collection of convenience functions for JavaScript & TypeScript","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"build":"babel ./src -d ./lib --extensions .ts --ignore '**/*.test.ts'","generate-typings":"tsc --project tsconfig.generate-typings.json","prepublishOnly":"npm run build && npm run generate-typings","test":"jest"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"keywords":["javascript","typescript","utility","functions","arrays","strings","objects"],"author":{"name":"William Thorsen"},"license":"ISC","bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"homepage":"https://github.com/skypilotcc/sugarbowl#readme","dependencies":{},"devDependencies":{"@babel/cli":"^7.4.4","@babel/core":"^7.4.5","@babel/node":"^7.4.5","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/plugin-proposal-numeric-separator":"^7.2.0","@babel/plugin-proposal-object-rest-spread":"^7.4.4","@babel/preset-env":"^7.4.5","@babel/preset-typescript":"^7.3.3","@babel/runtime":"^7.4.5","@types/jest":"^24.0.15","@types/node":"^12.0.10","@typescript-eslint/eslint-plugin":"^1.11.0","@typescript-eslint/parser":"^1.11.0","babel-jest":"^24.8.0","eslint":"^5.16.0","eslint-plugin-jest":"^22.7.1","jest":"^24.8.0","prettier":"^1.18.2","typescript":"^3.5.2"},"gitHead":"b13ca231456b5305acf653efc2f0f2ae5669e411","_id":"@skypilot/sugarbowl@0.5.0","_nodeVersion":"10.14.1","_npmVersion":"6.9.2","dist":{"integrity":"sha512-6tH5MI7IRfxc4sh3uPW0nslH0o7O/89FrR1acBQlg/gniAyyB5Cy5bpOkQWT8DrXd1jtbRVpn7jYtAa41Z9Jng==","shasum":"d5c62e866989fe36bb24d75f08cbbcf8ba052fce","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-0.5.0.tgz","fileCount":40,"unpackedSize":14284,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdINqXCRA9TVsSAnZWagAAKPIP/jpCOYc1VGghc/8mvzh5\nf/FS1TZIPTrOmgaxoFj5MFu6h0dnUBvFGzUkI9re2htalfudTs0uOOgHq4qJ\npftYiW1+geFi/qfQx9bURkzdi7QxpBWQNxgQVOmbA+hdZXtKh5IJ4NdrYQf3\nDHh2z8vn0wKKtCyHtEx7v02MbJPRqwNlzRuBCEFBMUA8X/7O2mYBGewCL3jc\nSS6sw9TknJy2m8CKpS77nHApYh1lMiyRXBiFO5J6gcqGxqJgjDSiYWGSiIe4\n/GPu4BHkpDgXN5h6Bkrt5iTQZv+X52yllqvEHroyRb/WFdaNgjDOV27cB0We\nJ57Dhyc2VwBQr5V5InZQ/EaD+fPINIzvtj8N1OKJ2I3T8hasAhE2UrcV805b\nSjZ7ByS5mR4y7KsVxV5NBwn3kP0cMo9Oemu9k6Dzl6QBNfFWjnw1IExvb6Bm\ng3TtjDMRXaFSnyyRetPal1YiP/Njb98Zxd2wCZJDZn2mDkzy0HeXXENphKHN\n8lLBdHpKbIsH4Lk2TIK3etv918mmidrv5d5bKIbE/qIovTlznCMKlZxkvD8a\nwoYYaNpE88KNzlJNWrI2OHTmc6Yychs3zsxyFMBzh+mHJOdg8Z+T+u0Yb+Rd\n9yaDhChB2H49L0UiwAzT+pEJNuxuJ5NOvJ9OySBMHyi/a3m6HXMjaJ6q6mVg\nNe2o\r\n=xkWS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGNCDkkZ977qsvypA3uUPavi+ZVGpWoQhOj6TO8g18XTAiBbMqJfMgXr/kyB+74SrsOrCj0lZnXH45RcpJCe9orbJg=="}]},"maintainers":[{"name":"thorsenio","email":"william@thorsen.io"}],"_npmUser":{"name":"thorsenio","email":"william@thorsen.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_0.5.0_1562434199017_0.5802014776047413"},"_hasShrinkwrap":false},"0.6.0":{"name":"@skypilot/sugarbowl","version":"0.6.0","description":"A collection of convenience functions for JavaScript & TypeScript","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"build":"babel ./src -d ./lib --extensions .ts --ignore '**/*.test.ts'","generate-typings":"tsc --project tsconfig.generate-typings.json","prepublishOnly":"npm run build && npm run generate-typings","test":"jest"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"keywords":["javascript","typescript","utility","functions","arrays","strings","objects"],"author":{"name":"William Thorsen"},"license":"ISC","bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"homepage":"https://github.com/skypilotcc/sugarbowl#readme","dependencies":{},"devDependencies":{"@babel/cli":"^7.4.4","@babel/core":"^7.4.5","@babel/node":"^7.4.5","@babel/plugin-proposal-class-properties":"^7.4.4","@babel/plugin-proposal-numeric-separator":"^7.2.0","@babel/plugin-proposal-object-rest-spread":"^7.4.4","@babel/preset-env":"^7.4.5","@babel/preset-typescript":"^7.3.3","@babel/runtime":"^7.4.5","@types/jest":"^24.0.15","@types/node":"^12.0.10","@typescript-eslint/eslint-plugin":"^1.11.0","@typescript-eslint/parser":"^1.11.0","babel-jest":"^24.8.0","eslint":"^5.16.0","eslint-plugin-jest":"^22.7.1","jest":"^24.8.0","prettier":"^1.18.2","typescript":"^3.5.2"},"gitHead":"b1ad1275f4b687e68ca148f364f2531d8682928c","_id":"@skypilot/sugarbowl@0.6.0","_nodeVersion":"10.14.1","_npmVersion":"6.9.2","dist":{"integrity":"sha512-eIo3Kd50YvkkAf+bpHW9tbwidD9jGde7cAl1evA+8vcWKc5BY8BFe5vBYpXbJw7V0mAjtKr2KHDwsMwgPsIlUg==","shasum":"959f5e5d14b9cde86af203a7ad325e4c512f83c0","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-0.6.0.tgz","fileCount":42,"unpackedSize":15170,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdIhpgCRA9TVsSAnZWagAAK5cQAKAb3Q/o2DbTiht1YVi/\nueLWLkvDLsGp+JkOxXhVo1OGTpo+0IP7VeWlMtwDKnbSTJXbdvsRKGLYAiV4\nCVWFn+bfES3Hauk4+czSce5Nv37GzT14EDmccA07NvbftvZu99g1tPN0e/hD\nijkF2JuhNRXVk/aRac5EJrhSTzCWiOSUPP/kzFae7tibRbisemB3/LhIFyBX\nnXh4QtAX+s0Zc0zc1Mus0jviJfcxFGR+0iZKFMk463ItAeu8GnYdH9bnK5Em\n0RAq5mfr9PGyOZy9udctXvOXjktyDnGmiYcM8nNh8ygkqOCsUGR810JO6I6p\ngKYuhEewLD3spf8+OA6dQ8p1m7+sA5KwgtvI2uxGWHVqARLspZToU1hKo7PV\nPeiIFaPMwDvMSAt1IkS+/hdSPX1QKOmzhXB5yJ65haD+MZQ/3ny8YpHLg2ZG\n8dPIkzPV7+KVvFCWBAuzgAxr+sjAqHP2kqn6VfvfGBy3Rc66qIxxMT6ITbmT\nLT02VHvZ6qBkSqtfffhOkBHzTmeuE6bRx940UnuxLkmDnu7yOJ6/IE5arSyw\nINekTTrksVxSNlS7UN3j7379UCrEVdCCANKym7CP2gVxWOgPcsQH3Am6En5E\nznAzKgUDI1edipsscCrjeS0Ua2/3GzsCcSODVLbRHWE78ygU56eTovo4jRqY\nUiVk\r\n=u/q0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGKOTArhfovk6ovAGg1hwAin+ASMtmQVo1BdcTOEyIB5AiAU9nmQBpAPqFOxEAw8/rW+eqBEJ3R7tFyKlxi+nqTMpQ=="}]},"maintainers":[{"name":"thorsenio","email":"william@thorsen.io"}],"_npmUser":{"name":"thorsenio","email":"william@thorsen.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_0.6.0_1562516063653_0.9777549433027124"},"_hasShrinkwrap":false},"0.6.3":{"name":"@skypilot/sugarbowl","version":"0.6.3","description":"A collection of convenience functions for JavaScript & TypeScript","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"build":"rm -rf lib && babel ./src -d ./lib --extensions .ts --ignore '**/*.test.ts'","generate-typings":"tsc --project tsconfig.generate-typings.json","prepublishOnly":"npm run build && npm run generate-typings","test":"jest"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"keywords":["javascript","typescript","utility","functions","arrays","strings","objects"],"author":{"name":"William Thorsen"},"license":"ISC","bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"homepage":"https://github.com/skypilotcc/sugarbowl#readme","dependencies":{},"devDependencies":{"@babel/cli":"^7.5.0","@babel/core":"^7.5.4","@babel/node":"^7.5.0","@babel/plugin-proposal-class-properties":"^7.5.0","@babel/plugin-proposal-numeric-separator":"^7.2.0","@babel/plugin-proposal-object-rest-spread":"^7.5.4","@babel/preset-env":"^7.5.4","@babel/preset-typescript":"^7.3.3","@babel/runtime":"^7.5.4","@types/jest":"^24.0.15","@types/node":"^12.6.2","@typescript-eslint/eslint-plugin":"^1.12.0","@typescript-eslint/parser":"^1.12.0","babel-jest":"^24.8.0","eslint":"^5.16.0","eslint-plugin-jest":"^22.7.2","jest":"^24.8.0","prettier":"^1.18.2","typescript":"^3.5.3"},"gitHead":"2fa7dc2311be19670a209cc94ea3c4be79b7d155","_id":"@skypilot/sugarbowl@0.6.3","_nodeVersion":"10.14.1","_npmVersion":"6.9.2","dist":{"integrity":"sha512-H0RH3S6jX8A9hQAwpnyQo6yE6QzV7BPW77A2LIkoIO+gRqoXvVUe9MtHvPDp8Fqvewn2/IpavIWBD2rJBPMgoQ==","shasum":"488d7fc4ebcaa07901d266a4c07b168d0194e1ac","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-0.6.3.tgz","fileCount":42,"unpackedSize":15183,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdK8GfCRA9TVsSAnZWagAAm7kP/0JyW/8o2j/pXUQnsTXj\ncYcbMr26y8RqeGdzduRRa+yza8IFDflzjzxgJPmsHFg4ey+lrGn7+p1ev+dh\nA1xIb6pljMi+ATdeFItJzmghRV98WaCb1ItND5udZp61+ml66zJ2yE3zEywd\nubQppSaOWfaqo0lYw7pZZUGw8Qn57xrZVrltRqLWgNosBhWlhRJUe239TSNJ\nFVQ4UKOG3N2wR/TGr+W6HZv5Zpz0L62ba8eBn0lna6Yt3KGqpv7+cGevXxTQ\n4WtF97j4DTN7F++CtUNc+CwmtCryHE5/XDOK0EQhOP1WOHh9kaLDMr/rycNw\n5E2ckyvfUdYO4J0NGjEkd13EiG/63TSNrpKtWQpmQFzWYdQBwC0biWitJSnC\nX/gJoTEXPQGSTUkDDOBGLdiPG+QX3Hu+xLvdPkna66isjYxZvFka7Oxc/5BT\n0CBLxNtvqL6bREm6VsVzIgFWBPo3rQujsAlaRbP7rIL28gKskNOIbULoY925\n+Bp5AELdvo2PIlJaHQaUfejsZK416lP/e4m4nt6Erb8P0KCpQzX8gvPdwzwP\nwdNdevuLtg1N5P7+Y6b7VCCNpN/STgVe3K6pNttFOWaPDMdI4rJYj3aGpE4Z\nmQsyTTar7+P1AQr9MMkI7riuaDh+fNpKdU2iHh7nsjJqNa2u1Fwsl0R1zc8b\nPaus\r\n=ZtZe\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDGuNq1Xye4Zvr8lEibpU6BWXbSF1Lylp2io/haLKm1MAiEAgxL2ScYMVsyGz/Qs60xGnknZ56aRmDRGRd8+LxLA934="}]},"maintainers":[{"name":"thorsenio","email":"william@thorsen.io"}],"_npmUser":{"name":"thorsenio","email":"william@thorsen.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_0.6.3_1563148702559_0.05356768116345534"},"_hasShrinkwrap":false},"0.6.4":{"name":"@skypilot/sugarbowl","version":"0.6.4","description":"A collection of convenience functions for JavaScript & TypeScript","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"build":"rm -rf lib && babel ./src -d ./lib --extensions .ts --ignore '**/*.test.ts'","generate-typings":"tsc --project tsconfig.generate-typings.json","prepublishOnly":"npm run build && npm run generate-typings","test":"jest"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"keywords":["javascript","typescript","utility","functions","arrays","strings","objects"],"author":{"name":"William Thorsen"},"license":"ISC","bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"homepage":"https://github.com/skypilotcc/sugarbowl#readme","dependencies":{},"devDependencies":{"@babel/cli":"^7.5.5","@babel/core":"^7.5.5","@babel/node":"^7.5.5","@babel/plugin-proposal-class-properties":"^7.5.5","@babel/plugin-proposal-numeric-separator":"^7.2.0","@babel/plugin-proposal-object-rest-spread":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/preset-typescript":"^7.3.3","@babel/runtime":"^7.5.5","@types/jest":"^24.0.15","@types/node":"^12.6.8","@typescript-eslint/eslint-plugin":"^1.13.0","@typescript-eslint/parser":"^1.13.0","babel-jest":"^24.8.0","eslint":"^5.16.0","eslint-plugin-jest":"^22.13.6","jest":"^24.8.0","prettier":"^1.18.2","typescript":"^3.5.3"},"gitHead":"dd6142a76f02470915d0cfa654188b58a2b597d1","_id":"@skypilot/sugarbowl@0.6.4","_nodeVersion":"10.14.1","_npmVersion":"6.10.1","dist":{"integrity":"sha512-fN0ZAMZW2z5O/o9QAzw3piNdGkt20iSDg6wY5tEXljL83vIGI37Kz9y7s68vXwBWwxp2aI8Lff/ReT7eoNrJRA==","shasum":"72278f574193bab19cba9ca568fbc84a689809db","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-0.6.4.tgz","fileCount":42,"unpackedSize":15184,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOLA0CRA9TVsSAnZWagAAKuUP/0JEdqTcl/j4Muve03l+\nvtbd7Kw+QRLx/GCmXh3OYxjiwLCwgV1vMBQNZcObylrrDcLYNBxcx6eRU4gE\nmQkj3N6XdpDbR5q+t3p2Dec7a0JEHonzo/LmCib+3LWZF/UUWW7GC3kEUprA\n6ONia8mtl5Ii6Qsmip4Sp4jOxwW508YZJzq87iXk9Tjy73ABdUzavnCBBFyX\ndrDR+6N5QDAtn5DgJvXQ4/Pc53AK3QVk71E9E+Mczyec2PtAsLPyS5ZN/xbe\nu3Q5qOpeXw+TR0KuGF+NPeqLz0eImAj8XHV/VOyUdi9Rspg3cXoXnQ/+1Emh\nbBYTEW4wkFGb5zauz7eS99D90LoXgLDu1oDLCZjC3EEBqMHPVz/ukfIBIsN8\nprP9ZGG2twceEQEsLUUfHkMGiEQt/5bCA+qGcaue069TgkNflqng9fvqLfue\nh36z0LQ4cgtK8eSyCLxqrUWiAXEFmyTo61fWSgrAEUfimORYUQyhD65z6NVU\n8elb6vlxmgg04ZQFij4rVtmFbMD8wCJR7dHmZxtGYeu/x42uIIGQNrEiwdOl\nHHF0+0vm4Jx6h++v0aBoL/1HQg4iuRK+5EWtzCdgcWJVkDOmzx8U71ZqqVgg\nPJ+hIdH7YEOeWnr8UQoaaZXS/lO4UnDLd6kadnVSD7qR4bjwwet4xVnJWlvI\nJ6Dk\r\n=untt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDR55297BgAinxLRxzl2zkCsJebUjAwIRpjPf1Du7t5WAIgX6KhRN+Ik2uV5cHVW9AOuamcRdEP0DXjSJRxegVbhoY="}]},"maintainers":[{"email":"wrt+npm@thorsen.ca","name":"thorsenio"},{"email":"william@skypilot.io","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"william@skypilot.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_0.6.4_1563996211743_0.9849850897876153"},"_hasShrinkwrap":false},"0.7.0":{"name":"@skypilot/sugarbowl","version":"0.7.0","description":"A collection of convenience functions for JavaScript & TypeScript","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"build":"rm -rf lib && babel ./src -d ./lib --extensions .ts --ignore '**/*.test.ts'","check-types":"tsc --noEmit","generate-typings":"tsc --project tsconfig.generate-typings.json","prepublishOnly":"npm test && npm run build && npm run generate-typings","test":"jest"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"keywords":["javascript","typescript","utility","functions","arrays","strings","objects"],"author":{"name":"William Thorsen"},"license":"ISC","bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"homepage":"https://github.com/skypilotcc/sugarbowl#readme","dependencies":{},"devDependencies":{"@babel/cli":"^7.5.5","@babel/core":"^7.5.5","@babel/node":"^7.5.5","@babel/plugin-proposal-class-properties":"^7.5.5","@babel/plugin-proposal-numeric-separator":"^7.2.0","@babel/plugin-proposal-object-rest-spread":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/preset-typescript":"^7.3.3","@babel/runtime":"^7.5.5","@types/jest":"^24.0.15","@types/node":"^12.6.8","@typescript-eslint/eslint-plugin":"^1.13.0","@typescript-eslint/parser":"^1.13.0","babel-jest":"^24.8.0","eslint":"^5.16.0","eslint-plugin-jest":"^22.13.6","jest":"^24.8.0","prettier":"^1.18.2","typescript":"^3.5.3"},"gitHead":"8f04c1d72a535ecd2ebc890a652074f356ab3e81","_id":"@skypilot/sugarbowl@0.7.0","_nodeVersion":"10.14.1","_npmVersion":"6.10.2","dist":{"integrity":"sha512-jORMJvBvO1qEYa8lsG/Jwmi+PQzCBH6E95b33RqVCozqac1QOA6rUGDeCYUz3R8VkWp5NPJWsJKfCJ+VfLEjGA==","shasum":"2815dc9d91a7575fcad04686e3dfb070eaaf1ffd","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-0.7.0.tgz","fileCount":44,"unpackedSize":17261,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdRMU6CRA9TVsSAnZWagAACIoP/0djN3yAeVjtLRDLKVuf\nf/u2HkYnw8K1fYttb3Cm8AZ2T3E9BmLQlJTogDui7BHJcUSQ9YZ+BpG5gXe6\nBVJY6zYyUTBOIUH9yuAQ/KYknOurJoFoJ6ZUy5yj7erdzPLZP0yPHhGc7B0h\nMOZZLvPM38Jrhr/CHe5khdpUjjW3jg5dONmKb20xtRtm7qR3djkvAyzA9RzY\n+Nq8TLUBkVLDfDVSIQtGH8coQ2YfdQtY4vSfMOOTail82esxdncySCUcmOeD\nDVLnwV3s6vPZDzN8E0Uv3/OCNg7z/leMd3dNk7Z+8naphyyILZY76Ew+zgSX\nj0zJY7c2zwRGrGidzSuvu14AyF5ffP8CBETkEP0gqAZMli+1eOBINzbQjkQ8\nQQ1frtYyJU8XZWeaP3asOgw8Z07UCY/xkWIffp2IEAafJH6l+ahsJB29hZOL\n2ERG4crNtt7JR0eBwLFvIcVFuIcjlsInKIZWRgX03WLsX7J/hvE9SeWBxYXl\n1U8fr5oyP1R3IRwW+1VhhEZ4gj50Sns0jgJxeV4GcH2o+5PEFzDZjtJOCkdM\nniBO7ZlKblctzRZZRMJv9RzB6MuAgfJOwvgGojqbyvhc6qfXUzw+Gd/rrnSB\nt0TDtCfaIY/phHpHc1sfR+cTMo0eMVqjJSzMbEWAeTs5n7aK/y8hDHG+iNOd\nCDJo\r\n=x2yT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDc0lRHguNg+HYs5RPvJxnD7Q0EK0UC1WJgzQfPMPcfdAiEAq/MJuRl4ttuFPh2x1INCTBbo5AJvxwJ4Jl0cMADTz2E="}]},"maintainers":[{"email":"wrt+npm@thorsen.ca","name":"thorsenio"},{"email":"william@skypilot.io","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"william@skypilot.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_0.7.0_1564788026039_0.2757190391566544"},"_hasShrinkwrap":false},"0.7.1":{"name":"@skypilot/sugarbowl","version":"0.7.1","description":"A collection of convenience functions for JavaScript & TypeScript","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"build":"rm -rf lib && babel ./src -d ./lib --extensions .ts --ignore '**/*.test.ts'","check-types":"tsc --noEmit","generate-typings":"tsc --project tsconfig.generate-typings.json","prepublishOnly":"npm test && npm run build && npm run generate-typings","test":"jest"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"keywords":["javascript","typescript","utility","functions","arrays","strings","objects"],"author":{"name":"William Thorsen"},"license":"ISC","bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"homepage":"https://github.com/skypilotcc/sugarbowl#readme","dependencies":{},"devDependencies":{"@babel/cli":"^7.5.5","@babel/core":"^7.5.5","@babel/node":"^7.5.5","@babel/plugin-proposal-class-properties":"^7.5.5","@babel/plugin-proposal-numeric-separator":"^7.2.0","@babel/plugin-proposal-object-rest-spread":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/preset-typescript":"^7.3.3","@babel/runtime":"^7.5.5","@types/jest":"^24.0.15","@types/node":"^12.6.8","@typescript-eslint/eslint-plugin":"^1.13.0","@typescript-eslint/parser":"^1.13.0","babel-jest":"^24.8.0","eslint":"^5.16.0","eslint-plugin-jest":"^22.13.6","jest":"^24.8.0","prettier":"^1.18.2","typescript":"^3.5.3"},"gitHead":"d1de39f497035637397cd3de3bf6a03738ad623f","_id":"@skypilot/sugarbowl@0.7.1","_nodeVersion":"10.14.1","_npmVersion":"6.10.2","dist":{"integrity":"sha512-4cg/hAHJhe9EHrLAsZEWkuHeE8HB1q9UiER6AmldXaxmi/I2YdrVfLuwUIzvrHYFAV/zs+39bDYD0+z0Styw0w==","shasum":"aad01a1ab5487e73ad5745310c535ecf3aa3f152","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-0.7.1.tgz","fileCount":44,"unpackedSize":17296,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdTausCRA9TVsSAnZWagAAD/8P/RewD9dtesAodH8Z9fyx\ntYVbAuaWaDO84Rkr+5DgLuAm+7kh6ny3FNskIJW60CvoRDqZP3mldmHtXW/O\n7eddVqE9I9pWOG+I7pHHkXYFiZxqn4GA3zTFpSrWocwNLjPFRUzod202tHmd\nJ4ZpakEv6gBr0r2ay9At1HqODJBQ7Z6BDRqedPB+au+/E9rg2QLibFs1XrUq\ny4/pf6ToDIK0AQVAbE08lDtfUydTFrdqTdp2niZFPIQ9GpgQbsGZnw9J48gJ\nIZuX/P1DOql2eiSXwCW0g6ILq3atJH7JGTX1KGk07VGNA/PsBr9BbvtgXmz2\nth48pmJb6p5yUbQE12/txvyUPrFmpcv9zxmNephgLszFoStlyxmT3K/ow7EF\nEearbl1Rrs98A5A2zVnRkxZjbzLbGTcagfXNIxaiATOOsrkIgfZhhYbqCeT9\nY72+JF1ynKpnm5jYH+AWPiFcR9N2tVEImLPtRVU4oX6lcvDbaARdmHKKu8yl\n/2Rn90jMRE/B0j5/91zu/LTlVNkO2Orh598rXnrQ64Gaj0sCQIyILX+zgcum\nriR1GYWbxVNBXUrZKU52daygianRpIv7koKDNdUPawVLCyusGosRXe46B2kY\nH3q3wMzd/FrTkvFw/rMZ9P5AWexnEFUIbKw9sDoTNLN7nvqu2ebO19EYPCcU\nTDoh\r\n=JJ3P\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH234nOWWVGutRaY3UP06eTche2gNjaMe3BbotCb9OYAAiEA4v1UY4LlcnVwb5PvlBZN12o6b08zV4/aw0xiRyxxrvQ="}]},"maintainers":[{"email":"wrt+npm@thorsen.ca","name":"thorsenio"},{"email":"william@skypilot.io","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"william@skypilot.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_0.7.1_1565371306520_0.9626899260940782"},"_hasShrinkwrap":false},"0.8.0":{"name":"@skypilot/sugarbowl","version":"0.8.0","description":"A collection of convenience functions for JavaScript & TypeScript","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"build":"rm -rf lib && babel ./src -d ./lib --extensions .ts --ignore '**/*.test.ts'","check-types":"tsc --noEmit","generate-typings":"tsc --project tsconfig.generate-typings.json","prepublishOnly":"npm test && npm run build && npm run generate-typings","test":"jest"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"keywords":["javascript","typescript","utility","functions","arrays","strings","objects"],"author":{"name":"William Thorsen"},"license":"ISC","bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"homepage":"https://github.com/skypilotcc/sugarbowl#readme","dependencies":{},"devDependencies":{"@babel/cli":"^7.5.5","@babel/core":"^7.5.5","@babel/node":"^7.5.5","@babel/plugin-proposal-class-properties":"^7.5.5","@babel/plugin-proposal-numeric-separator":"^7.2.0","@babel/plugin-proposal-object-rest-spread":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/preset-typescript":"^7.3.3","@babel/runtime":"^7.5.5","@types/jest":"^24.0.15","@types/node":"^12.6.8","@typescript-eslint/eslint-plugin":"^1.13.0","@typescript-eslint/parser":"^1.13.0","babel-jest":"^24.8.0","eslint":"^5.16.0","eslint-plugin-jest":"^22.13.6","jest":"^24.8.0","prettier":"^1.18.2","typescript":"^3.5.3"},"gitHead":"477425036344c1563c44fcfe024edc2589801e04","_id":"@skypilot/sugarbowl@0.8.0","_nodeVersion":"10.14.1","_npmVersion":"6.10.2","dist":{"integrity":"sha512-J7qDk4FM0QjH82SQLQ7F56mbzKWlUKPpAt2n2sIZWuCiO8U+AZ6tCMI/KE0r3drR5STI9a4cAJ0FQlPozwLKxQ==","shasum":"9daadc292b65438499fdee0fa78c980bf6194778","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-0.8.0.tgz","fileCount":46,"unpackedSize":18945,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdTwKMCRA9TVsSAnZWagAAovoP/1kUq7+ouqb09anC0u7h\nnDOOmRoe14lV8v/vwfZZG8dyT986QCsL+0MP/wAO65OGl1C+mYzpuIGsl+HU\nzqXuQooi5/6ewulAHw4vaj7O4ZiHlM94qmM7RROoyw26rpFqJJrpYcUHnaJ1\nkVwQahlicfq94Sdzhpj4d0xHp6j23moFsfkpb52VmFdaXLtQEOIaALdCV3SC\noVQoYXVD+f5/xPtYpQZZ+1WcfEspNokCmdywRzSCe9gNKh5BIU242L8M5lK9\nUakA3g1N5LaODFdDbWgSjDTW7MMyjQupIswZ9DzvMOY2mueb9zltV6fSXPpT\nvfBX8GLLuezHznTmrN5p7SH9wxA4ohsmMR+ooP/r4kr7mLJ4WjFghd+rvx9W\n+hxwbI5BmC0QQMikjMeMi01FgLmvKHbFigrn3creMF2GCrmY2EYNu0uNwy+H\nBbrstPvWitXXbUi8pPpMv3X9syBa3WzJLoj/3d4ciXRDZNOyVwQunEXd1xtg\nVd/oPhmzG1yZh9KyP5LMVvPql3rIrKxbdiEfvKvLL4nx+RrjfBHOwxIk41hQ\n1FKpYw11d7gjnAGGfJY5rku1O5li1M/jiCo47xuLqRyEeBxpQYE6+W7WNs7R\nPCDtvcSOlGQ5QkqDTofrF6cNG65O57Cvg0608+C0sxufSTgHNCBNHA3tsFVD\nxXYc\r\n=hXN7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDLSXeU6+XZedf+KCAdaf1n4tV7x3fzSFB0PE2pQd6ewgIgIleW/9BApw01cgnUN7y0Tbo0BgRLgfv/Q4glpOU+msI="}]},"maintainers":[{"email":"wrt+npm@thorsen.ca","name":"thorsenio"},{"email":"william@skypilot.io","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"william@skypilot.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_0.8.0_1565459084392_0.7920837113542307"},"_hasShrinkwrap":false},"0.10.0":{"name":"@skypilot/sugarbowl","version":"0.10.0","description":"A collection of convenience functions for JavaScript & TypeScript","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"build":"rm -rf lib && babel ./src -d ./lib --extensions .ts --ignore '**/*.test.ts'","check-types":"tsc --noEmit","generate-typings":"tsc --project tsconfig.generate-typings.json","prepublishOnly":"npm test && npm run build && npm run generate-typings","test":"jest"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"keywords":["javascript","typescript","utility","functions","arrays","strings","objects"],"author":{"name":"William Thorsen"},"license":"ISC","bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"homepage":"https://github.com/skypilotcc/sugarbowl#readme","dependencies":{},"devDependencies":{"@babel/cli":"^7.5.5","@babel/core":"^7.5.5","@babel/node":"^7.5.5","@babel/plugin-proposal-class-properties":"^7.5.5","@babel/plugin-proposal-numeric-separator":"^7.2.0","@babel/plugin-proposal-object-rest-spread":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/preset-typescript":"^7.3.3","@babel/runtime":"^7.5.5","@types/jest":"^24.0.15","@types/node":"^12.6.8","@typescript-eslint/eslint-plugin":"^1.13.0","@typescript-eslint/parser":"^1.13.0","babel-jest":"^24.8.0","eslint":"^5.16.0","eslint-plugin-jest":"^22.13.6","jest":"^24.8.0","prettier":"^1.18.2","typescript":"^3.5.3"},"_id":"@skypilot/sugarbowl@0.10.0","dist":{"shasum":"3782fb751d6be6036b3dd18badde4136387591ac","integrity":"sha512-zwWtFtLivmJfsXDQzab0nV4pHSkixBkrH1b0fT6+pmSZ+RBIB3NeMcSndpOv2RQlN/K1V3MCKG6Vdu57rnSRYg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-0.10.0.tgz","fileCount":64,"unpackedSize":22983,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdVqzeCRA9TVsSAnZWagAAn+EP/irhNjm8O6w9iQs+MyMW\nDxx+5ZpctiDs6QqhQfY/1NTNM13EjPjnT+gIm/+NFC450fBxfoHV4gXpqdK7\nLUPhxvOTGxHkuHYHEoHhrYqSmAlx2Pz9fppEihcoDVeeg1koggtiV6+QuK98\nuS38lEFaYyMb5sjqkCLQEU+DxISbKMUYLYaxzpAQUvz3mzaXyHvM8v+Ua49t\noYborebPzMBs6E1vw6oYTXPB7XleZvLfCxQs82vpqqVcLLXVDuYEXRPzH8Ba\n1yyyoB8ouK//ntQLlw9BrxuPMzO2lRaER/at0FmeNM3ohgsT8sXok+1zb5b0\nHrUq5KXemK3mIbR5Z+cQuf6SkJcEBj9j4OJlGH1MLz3sVhhphgXHZGEyxR+k\npHQOFbrRpgcvLd86nuYIRWXkV2JfydDtZW1JXpnRKEvbubOIOhxg0fwNVNf6\n62bIPXt7RFn6Lid6GiWERZ8uPpZdewpq9PUmF0fPX0NPSXffWQ/Q543v6fXp\nbj00F+U/wqZwnbN2nP5e++NQ4lVrix7zSE+vAEyv/YHixiMfq1+/leO6hh7S\nbQPWvb4GwJ+iFKQ60jO8mJWdw4+yeKUM4ygTOj1b7woXp1pFcULpQ0+HQrOo\nAHFZc+MxK0B+16r36yN3qK/YOB6PUQRmbZoDe4gC33Xwg+1FMN3kvrUdkwAP\nMzbR\r\n=3LM9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAv9QUhGq8NqF/ZPiT+J5wBcvjCE+r32x+DQodF3Li4HAiBTBRRGF3pNcyT/GTnw3bQPMUXqufs/F5msvqhRqAm0FQ=="}]},"maintainers":[{"email":"wrt+npm@thorsen.ca","name":"thorsenio"},{"email":"william@skypilot.io","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"william@skypilot.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_0.10.0_1565961437742_0.9927430522881304"},"_hasShrinkwrap":false},"0.10.2":{"name":"@skypilot/sugarbowl","version":"0.10.2","description":"A collection of convenience functions for JavaScript & TypeScript","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"build":"rm -rf lib && babel ./src -d ./lib --extensions .ts --ignore '**/*.test.ts'","check-types":"tsc --noEmit","generate-typings":"tsc --project tsconfig.generate-typings.json","prepublishOnly":"yarn check-types && yarn test && yarn build && yarn generate-typings","test":"jest"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"keywords":["javascript","typescript","utility","functions","arrays","strings","objects"],"author":{"name":"William Thorsen"},"license":"ISC","bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"homepage":"https://github.com/skypilotcc/sugarbowl#readme","dependencies":{},"devDependencies":{"@babel/cli":"^7.6.4","@babel/core":"^7.6.4","@babel/node":"^7.6.3","@babel/plugin-proposal-class-properties":"^7.5.5","@babel/plugin-proposal-numeric-separator":"^7.2.0","@babel/plugin-proposal-object-rest-spread":"^7.6.2","@babel/preset-env":"^7.6.3","@babel/preset-typescript":"^7.6.0","@babel/runtime":"^7.6.3","@types/jest":"^24.0.21","@types/node":"^12.12.3","@typescript-eslint/eslint-plugin":"^2.6.0","@typescript-eslint/parser":"^2.6.0","babel-jest":"^24.9.0","eslint":"^6.6.0","eslint-plugin-jest":"^23.0.2","jest":"^24.9.0","prettier":"^1.18.2","typescript":"^3.6.4"},"_id":"@skypilot/sugarbowl@0.10.2","dist":{"shasum":"aac6b6048d489d06ce747ed7432c79dfbba665d1","integrity":"sha512-AHuuPmGxqRuNWT8uCKJYFNvfVCr1qZYELPXlU82iS4ck+EoHyNLvXvAensQ1GzSdYES0wFKIy6CJgmGzaOjIAw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-0.10.2.tgz","fileCount":64,"unpackedSize":22995,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdvFfQCRA9TVsSAnZWagAAUFYP/1r9pUHCkmv/RiurGcVL\nTizMva1b0xKtGo5Uh2jXM2/2xyPnpOiy60lZTu58WSg54d5imEO6xO4GE1gV\nj/IgAmoCAA1/UJ0rqWiu5EnNJFkhRcpwKC4HzrbGILZCksHeIvo4P4NLJv23\nXU2EEYEbrrvrX5G5VcEl/I/S6h/3QGeky52Jk1hZSpX9U/IAvrshJGYOPLOf\nnA3XP/WgXGB3vCrfBJtO3cvVfZPX639X01yWXBOprF83GT+5+KHoOlIgQTda\np708hZShRr84OkLyax2dEbv5b5zZPNCrwFA0EXoBmP/QfaG4gNXwfn9wBRGq\nHIwT2oMf28PNjdmDGQKM/ReXoWokRvKJY9AuRuTuvHYbnBZeH7OaSM3TEJ7y\niLlwcoOQz/gVw68nG0zqgbqSNqKiQfMGkG8ixYMnZjn9hNfTc+o+7CaHDQRW\nGLC/Xt7ASvBts7p9B+M0AOCUNvHQsUQzyjXlmy3EsWuDc+6qsrqAci4dw9yz\nynCckt97ObmfHTQEH8r8ppDDp4ptoQNCKfnF/5dWUt8c4qZWpzkQ2X3X9YmY\ndCJaRQ/mXF8IUFwoNP3vQ0k/JvqWb9i/oEa0h/q27Sk6MX6t/lr+fJBHKgvC\nP4VdqyanVxshWAi49KKxDaGeAnVvpxUmCu5T3k+lTN+uHckdc9TFGR1Wqbwk\n2mNI\r\n=QKV0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE79SZ6OYLvDxNo01hBAB5VHRfjD2gxxwhCUlplzRbp5AiACjnMU63ix8o/WgEGVW/qfmMtLVwJf1zvmZeJc2MknFg=="}]},"maintainers":[{"email":"wrt+npm@thorsen.ca","name":"thorsenio"},{"email":"william@skypilot.io","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"william@skypilot.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_0.10.2_1572624336036_0.059250740605186314"},"_hasShrinkwrap":false},"0.10.3":{"name":"@skypilot/sugarbowl","version":"0.10.3","description":"A collection of convenience functions for JavaScript & TypeScript","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"build":"rm -rf lib && babel ./src -d ./lib --extensions .ts --ignore '**/*.test.ts'","check-types":"tsc --noEmit","generate-typings":"tsc --project tsconfig.generate-typings.json","prepublishOnly":"yarn check-types && yarn test && yarn build && yarn generate-typings","test":"jest"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"keywords":["javascript","typescript","utility","functions","arrays","strings","objects"],"author":{"name":"William Thorsen"},"license":"ISC","bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"homepage":"https://github.com/skypilotcc/sugarbowl#readme","dependencies":{},"devDependencies":{"@babel/cli":"^7.6.4","@babel/core":"^7.6.4","@babel/node":"^7.6.3","@babel/plugin-proposal-class-properties":"^7.5.5","@babel/plugin-proposal-numeric-separator":"^7.2.0","@babel/plugin-proposal-object-rest-spread":"^7.6.2","@babel/preset-env":"^7.6.3","@babel/preset-typescript":"^7.6.0","@babel/runtime":"^7.6.3","@types/jest":"^24.0.21","@types/node":"^12.12.5","@typescript-eslint/eslint-plugin":"^2.6.0","@typescript-eslint/parser":"^2.6.0","babel-jest":"^24.9.0","eslint":"^6.6.0","eslint-plugin-jest":"^23.0.2","jest":"^24.9.0","prettier":"^1.18.2","typescript":"^3.6.4"},"_id":"@skypilot/sugarbowl@0.10.3","dist":{"shasum":"21376f5a10e3ee6fb063704a2cbf7c809ca60744","integrity":"sha512-/WoPrt6fR8C17SPCBT9678rJDbV/Ryj0c00cdt6pxuxQMuWKgUbY27a02T5kP5NQYFB5PLZEC9CTKmpMZz/VjQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-0.10.3.tgz","fileCount":64,"unpackedSize":22995,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdvlFoCRA9TVsSAnZWagAAgAgQAIsVk9YRtE2emmVKvEpx\n3S4OC5XugBebanssfGhpOv4CGEAhUbV98HuZadqkPyVF5n/Z8uqbDb9LUT/K\nlLmXQCFPFUiFnWmHfh4tZOPeHNmGcra1uV4JpYjP7ZVrMqRgE0MrUg+/zUCy\njWf42JeZ92PYmZCdiRD9KFU/bMP5L89JGl7JN8x/jUG1s9MhYUok18r3mcSr\nvI1wY4x593BTEi9WLAZGK/VghlwjpkFNRFfpd1wIGTVjR1dUvu9AJ0Bp35X9\nayJzEF31QAMHNxqKDb4/9wHJ0lFK1X1O80NyBCl6BJlPzBePa/09Dfc13GGY\noLcSUG3my8sJABXM8DLSyivpQ9FtlNKqdwqiPdt9VgtPYhEeuCxOHemRmgvn\n14lHRnF4GfpNvnPtE0piIDmQw+1k0FMy4Zh2XNObtj0AsCE4dCSA+koNEHUK\nGQRvJLUzGmI6YzSUmDh812uQO8gUvHEe4y9EAEz0FiKpZYwgd0ht7E+driWo\n0s7zeYl9eA8f2vXE9JGDcV5JAw1ZOzhPmzFFcViTXZorfj1siNb/JdPgA3BB\nvTZDYUfMBj2v+5i6QnRRHfqDks6WzsLHg1/3ROmn1zJA/m7h/x1JyyxsjV0F\nl7vGRu6c6akJQZ+kqkgKeordPKJVBQQLbJYae9kJAwkU1oz1bG4ltAwWqdXE\n4m2A\r\n=nBW8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGa7q2EneGv1nGz+DaDeRFeeLCM/HUBsuoZ7uiCfYsEjAiEA7xoP+HX381KujtlJbVGVllmhkiE9sVlABfa1JqJag2o="}]},"maintainers":[{"email":"wrt+npm@thorsen.ca","name":"thorsenio"},{"email":"william@skypilot.io","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"william@skypilot.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_0.10.3_1572753767833_0.8238551166871504"},"_hasShrinkwrap":false},"0.10.5":{"name":"@skypilot/sugarbowl","version":"0.10.5","description":"A collection of convenience functions for JavaScript & TypeScript","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","generate-typings":"tsc --project tsconfig.generate-typings.json","prepublishOnly":"yarn run check-types && yarn run lint --quiet && yarn test && yarn run build && yarn run generate-typings","test":"jest","all-ci-checks":"yarn run check-types && yarn run lint --quiet && yarn test && yarn run build","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/*.test.ts'","lint":"eslint --cache '**/*.{js,ts}'"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"keywords":["javascript","typescript","utility","functions","arrays","strings","objects"],"author":{"name":"William Thorsen"},"license":"ISC","bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"homepage":"https://github.com/skypilotcc/sugarbowl#readme","dependencies":{"@skypilot/toolchain":"^0.4.16-alpha"},"devDependencies":{},"_id":"@skypilot/sugarbowl@0.10.5","dist":{"shasum":"e48a905e1e0eab810d30147759a73f18a012f8f5","integrity":"sha512-W1GVIzGDpeUmYBuVPBt6yh5Pu9gLEz487SqvIXuug9BbAVN+idPilDQQ6WTCdTEr3hdP4PXSMJTlO/DgWIncow==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-0.10.5.tgz","fileCount":69,"unpackedSize":21584,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd0wHQCRA9TVsSAnZWagAAPGEQAIdAzfAGf6yMjQuIRUe/\nkthHMIHu/Rlh8umfnGEnh5UphzrY7yFDaVn5iZ9o/UAVjTWSuwA1zutEXDNF\n+Ktzi085Z9NlLU19ET0aON/Vj1HBivgg6VpY7N2tw3MJP8ct0gQ0LmdvcyqK\n1T7+1qcLpV+9xx20UrfXnjCqYvmLE/2wBfqhsNVOw8adOdHtET5y8am/UBiY\ndiMGGwMDcNn9s0n2Uue2J/YMF7Pz09upxRpuFmBZNnc1uU+Sik99kprEoExz\nG4Q4iDyUNKgt3x4XqBjlx0dpjuce+6tbsU8GshHglI6qkfKslgJbJHqDPqit\nmJfxUgNPYYJNIDS/yMwYEHMOoLOGmy8X90uczanCPFw5A9Qc0prGkowyUDa7\n6Fp61GkBUQPkF+r6Mmh72Su+CNjCOGS2D0AVOn9J/IiE0dMsGccGwwlK14tA\nhT9vvObpEqhohFg7NeBQe+6/12D1XdI6PaZvOj0gHxoIoz93pnWrMEtG/ldk\novA7ExSNEVe8D33Kaku9/zoQEFFgeORlojXzqS9IkHbd9ijaamQpQEwz6pEp\nNF037vCMYEK8MhoHxa9/MoPaL1s/4FnmVwl9ZqeOWZR3lmasLG1yAMtFMX+5\nvDfESbxiWYs0cQDNAQK37q9SU79AnEHD9SdVxWLxEgI8Pnn/mxCp1I4BDkBs\nUr6D\r\n=Oc/4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDNd4wpvzHucDZvVUDUsVhgk97+z5rCU9VX9RJkDekuQwIgZj9g6unxDDV0iXMK5hJyB18Ou20P4RkcpEDLxchgOu8="}]},"maintainers":[{"email":"wrt+npm@thorsen.ca","name":"thorsenio"},{"email":"william@skypilot.io","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"william@skypilot.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_0.10.5_1574109647976_0.6273275086670702"},"_hasShrinkwrap":false},"0.10.6":{"name":"@skypilot/sugarbowl","version":"0.10.6","description":"A collection of convenience functions for JavaScript & TypeScript","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","generate-typings":"tsc --project tsconfig.generate-typings.json","prepublishOnly":"yarn run check-types && yarn run lint --quiet && yarn test && yarn run build && yarn run generate-typings","test":"jest","all-ci-checks":"yarn run check-types && yarn run lint --quiet && yarn test && yarn run build","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/*.test.ts'","lint":"eslint --cache '**/*.{js,ts}'"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"keywords":["javascript","typescript","utility","functions","arrays","strings","objects"],"author":{"name":"William Thorsen"},"license":"ISC","bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"homepage":"https://github.com/skypilotcc/sugarbowl#readme","dependencies":{"@skypilot/toolchain":"^0.4.16-alpha"},"devDependencies":{},"_id":"@skypilot/sugarbowl@0.10.6","dist":{"shasum":"f631345f74752069980a6d1b003b11baa4ee9fb7","integrity":"sha512-igwJzN7hi/43p2G/DR9iaURTTzeoA/8YqQ7/ejZGEH/iPqz2+n5abJ7iV814ml0FjCnpJfP7oo5ADUt3eMkl1w==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-0.10.6.tgz","fileCount":71,"unpackedSize":22448,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd0x3qCRA9TVsSAnZWagAAQsUP+wRKrDUJNDa00138IkQ7\nnR+aaC5+PxwLLYeKxEB+pAIsguQm3DDaB9fS381lXOs9MH+1+XZ3HvoDO6gu\nXKAjdJAUxO61pOd8+41LjyKxf5yjM9OHih72NDWPpPXXe7NpX/O35naGbRr4\nW6POwM9Q21U+f+GoA6562M+pdE+uwj9nOEHPlT/o1d1HvMTzhe5qWnnT7gu6\niKv3ivhQHJWLOH9M67pya1L8woIsCqRSeFGpEzoeDBDQ2POySRUa0SOT3q85\nlJ5zE9WfmvFYVETAj47xxdIJ+poKA0ltlO2r1q0AD2c0znQSF/SIT0dfF7mr\n3mwBn1I2qu8pra0NYANLCDdn5PASu4qK2TslNsI/2rA3tctX7SkZTlAoIlRe\nERms3KF7+1ISSX7qRgDc2JFErUr/gaM6Qn/P5NVCk/pNZW7xIMm+4pXE6Dyp\nKTrC2HWoV7/AQ2BvQPmZvr4dNy13iIL7GrVPjEm9e+F6nKl/Y42QoeDVk/JA\nSjy9dGtdl0SwvUnM/7isPB7IXe/T7Ck8cDzPB71D1uvY5CcpEJceS1Th74Q8\nXdO9A8b5/s+UXpC+TBdB8FEUmFRZ06frZvJbBPrcgWAQAe1JfUC9+HgEhhgR\nHkEu5vCVp9A4GhIaBTYyb38pTJ/c/VJI1Gtr53lVOeTzvfmffmyIVgLJ4A33\nYw2L\r\n=RA3f\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEL96PBqEItH7OW+t4YihwKC2F6yP+xsgkU5SlfcDjijAiEAip8oJ7tbWpi2uOCGC8NlKW3goVa6IBbAe37Zu3P1yjw="}]},"maintainers":[{"email":"wrt+npm@thorsen.ca","name":"thorsenio"},{"email":"william@skypilot.io","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"william@skypilot.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_0.10.6_1574116842485_0.8696321012720554"},"_hasShrinkwrap":false},"0.10.7":{"name":"@skypilot/sugarbowl","version":"0.10.7","description":"A collection of convenience functions for JavaScript & TypeScript","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","generate-typings":"tsc --project tsconfig.generate-typings.json","prepublishOnly":"yarn run check-types && yarn run lint --quiet && yarn test && yarn run build && yarn run generate-typings","test":"jest","all-ci-checks":"yarn run check-types && yarn run lint --quiet && yarn test && yarn run build","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/*.test.ts'","lint":"eslint --cache '**/*.{js,ts}'"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"keywords":["javascript","typescript","utility","functions","arrays","strings","objects"],"author":{"name":"William Thorsen"},"license":"ISC","bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"homepage":"https://github.com/skypilotcc/sugarbowl#readme","dependencies":{"@skypilot/toolchain":"^0.4.16-alpha"},"devDependencies":{},"_id":"@skypilot/sugarbowl@0.10.7","dist":{"shasum":"723e4744d1380ac4393b1c6f8cebf8ba00f3491f","integrity":"sha512-h3FtgAuwyHRO2WH9CdNmDQMmz+Zax5rUIZImn4ZXQWV8Wrp871AkNrHMPjipDEQPk3TXVo0oA2j/gVo5tQNwPQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-0.10.7.tgz","fileCount":71,"unpackedSize":22687,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd0yPkCRA9TVsSAnZWagAALacP/RBmoPde18Fb4EJZ5P+S\n1zkVMWMRB2UtaZYQXBPj6IWi9rmmxq5Dtj4xthua+6kgRNhTqUYrwBgkyxGy\noiJVtc0eHYglUcFTdF9bTFkgo16uoySiusgewtSoE0/2hwp7MZp6MEoweGrf\nqeNhtpRboaq245e+47fqVzqZCLcURpOiMzjbzJqeJ56Lie9oKr4He2pWqXDL\nGan3cJZVelEOHfjSiFdiTlXx3ff+aKeWv2MHGbVien3U4mTTqpGRj/Ya6aTX\nibxyKhApWJS4MS9ODJU/LD+HhUkNg5pa1HN3pKwU+JCJ+yTqD4rg2OyH6Enk\nnmqtoZ/DrW3+tKxEk2gZSGk5guiiGK1rbaFBMkUszmWPiKRJUof7GQFK8e/H\nOCOZwUUYoQO8w1RIsfW5xyGqGcpVdqMCxcrQumo/CHzw053CAlI9iE/Bx5QH\n4wZn4nEuV/mTiDw+75jYBTDFvD+2/jnMFl/wCg+sR299UhlsCmKRQMD0db/R\nYdorqzq3jnqjtitSW2YSU2dTJXruiNeuxtLQeA+X9uUlSGo0kAUhqXZ3pzLD\nU2O2XQ1uLBAxmtbAWa3IbiHCEEbXlnLwTskL4NqKvUFPYRgjItU8O7/So/pi\nrEnq8KO+FIl7MHxvzAuja9QKXu5Ia/VdkIN85Xt+b84xtqNO4uwle7xgDoMv\nGu4Z\r\n=51Cr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDDDVI7KA34Y+IIel3AoXnyU/aSJ9XXNlLt8durwpOQ4QIgPdHD/3b20valkftsX7+9Iqm8I0XusHT/FT4JIM+JNIc="}]},"maintainers":[{"email":"wrt+npm@thorsen.ca","name":"thorsenio"},{"email":"william@skypilot.io","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"william@skypilot.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_0.10.7_1574118372127_0.4999719022599156"},"_hasShrinkwrap":false},"0.10.8":{"name":"@skypilot/sugarbowl","version":"0.10.8","description":"A collection of convenience functions for JavaScript & TypeScript","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","generate-typings":"tsc --project tsconfig.generate-typings.json","prepublishOnly":"yarn run check-types && yarn run lint --quiet && yarn test && yarn run build && yarn run generate-typings","test":"jest","all-ci-checks":"yarn run check-types && yarn run lint --quiet && yarn test && yarn run build","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/*.test.ts'","lint":"eslint --cache '**/*.{js,ts}'"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"keywords":["javascript","typescript","utility","functions","arrays","strings","objects"],"author":{"name":"William Thorsen"},"license":"ISC","bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"homepage":"https://github.com/skypilotcc/sugarbowl#readme","dependencies":{},"devDependencies":{"@skypilot/toolchain":"^0.4.16-alpha"},"_id":"@skypilot/sugarbowl@0.10.8","dist":{"shasum":"0b202f74aa7a2b6a058d9b04465d50995edeb5e4","integrity":"sha512-/QTo2ZJgkCNP2aXoTIqrUSBv3OyXF4P2xWA9Jgn9EZ3XtcK9qKVN2LXU5CyUTfT5nANhkMLfMdMl1V8nfN+2Xw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-0.10.8.tgz","fileCount":71,"unpackedSize":22687,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd1JJmCRA9TVsSAnZWagAAFdwP+QDPq20pL1a8yaPl2c3R\npO3IkQsVChhylej7GVyqYFCYrCiReoBDJ5f32GUeHnP7S3TF+egbk6DtW7IW\n08erbgSheY+WLZ5w5OYu3HuvSDbKM5igHvBtpa3Lg+1NVfslcHaU4IE24z0M\nkxH90ItKAceceUdGXpF82j6RBR/qY5NDOcjP+JVWuTq+nitwzP8CWh8/N/Fg\nZpqwQfmbAW+edzaVWNMGJruVcs5w2sUc/omLP/EQeku6EjLLaoIUolpHcAFf\nMNGqCmpcPltF1o5hfY2tezmCChW0++S9s6QU0Sn4Nh8qVf5ug61Z1ezhX2bI\n5I9m625nfT/U5IrXsAQG36qdyiDckU0fKKI88MULW+ldNXJFMU37cQczuYtV\nwwcJtarHYDqZucd64JQkEPUFElAWsHETmim3rFjnPfBVGczsANX6fdqq4Jbd\n9UO0j+aBRWt4WZuHNj+Mw5mY1yOBDmrc3KEGoN232TyQ1Oot9wrS1LPq9zy1\nxLTDK+QMjkxTPum8XfyHy+0f80m2W5/Il9yKsFHyBpdlYPt9b2vlr+i+uFXe\nsPCMskMibpe8l9d0QATuUHf0IHeSholOBAqUZ4XX4q+YVYdwOoWFGvyM3p0Z\nOTw5UhsRk1buLg8eOYnqH3I/XpfvegURk65GMjazdykdpXQAZQD9T2gs7BTv\ndaxB\r\n=n2Rk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFQxUi4f2vWWqG5uCZ66mto4lofRfARv3uGEsqE+cTgMAiAM7SEb2U//YyoIaUeV2bPrhxNCPog2WBS8KPsjdxpPng=="}]},"maintainers":[{"email":"wrt+npm@thorsen.ca","name":"thorsenio"},{"email":"william@skypilot.io","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"william@skypilot.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_0.10.8_1574212197832_0.7304238309062117"},"_hasShrinkwrap":false},"0.10.9":{"name":"@skypilot/sugarbowl","version":"0.10.9","description":"A collection of convenience functions for JavaScript & TypeScript","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","generate-typings":"tsc --project tsconfig.generate-typings.json","prepublishOnly":"yarn run check-types && yarn run lint --quiet && yarn test && yarn run build && yarn run generate-typings","test":"jest","all-ci-checks":"yarn run check-types && yarn run lint --quiet && yarn test && yarn run build","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/*.test.ts'","lint":"eslint --cache '**/*.{js,ts}'"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"keywords":["javascript","typescript","utility","functions","arrays","strings","objects"],"author":{"name":"William Thorsen"},"license":"ISC","bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"homepage":"https://github.com/skypilotcc/sugarbowl#readme","dependencies":{},"devDependencies":{"@skypilot/toolchain":"^0.4.17-alpha"},"_id":"@skypilot/sugarbowl@0.10.9","dist":{"shasum":"cbb0bbb92cb0cd146ef082f77dd3acccd13c15ce","integrity":"sha512-J654LCFQNkN/9n+KuGMpm6TmJQu8Zr+/yDQsESmn4b54UFAdrGhOCbY6K/2Fl879Mz+eyU3LsZhqmnEYtJaxNA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-0.10.9.tgz","fileCount":71,"unpackedSize":22687,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd1Jb0CRA9TVsSAnZWagAAFfsP/RRCWpWp7jaoauPJNJOE\n4uGVIM4+bDFlQtYViaS8ACegg2QfVJnWGEkLkVVMKPND/xwPgrbEAYQtGvuU\nxjg6CIMEf5+Q/t7CiVenCkuVXKGCIQoSVlGBMdfKcOvF/y699q8M7I88tIhx\nnZL18V2xgCeCQ5Aa4HBVhZPoutEswgWraTe+q95tbbDDtr0MQ0HfJtYE55hj\nAVtyYd2QkL5pRnZQgIr99L6uh8XLH27WXqTEHX4okz4hd1XTw8FPdOUkbXXL\nmjAoI8R1TWD8k/wmnrseUKfVa+su1mbzxEM8Ob59zCRnPcENAk9EHg6SGvjq\nwAMzrRmz8o57uzeMINNa4fQi4Gz70PN5llRzlqGtMqXeIZGK1WxXX08anayK\nUNiQ/bl9gdb7h2jpsVByjeG7hu0o/ekIVB30UzGxR0tE8TQd3O8POM1U56ND\nI+xwx3n8fSfCLNvMjfVvX5OkqP3M5xmWCbj4goBZdnc0kqJvybNG2t0M6fO+\nw2e8SHDXxFiDhrhiYpH26uG6V0xPj91h2QF54IbXCF+5PrNISLOxj0HCKGsW\nGEB1DYWo42mbn6toTIXmyManHpC2bezz85ahb3M6duxPYUULxR4WGCmpY5DM\nF2twyXU+vEzZMpZrjTKHjfkmjUqmFyPeHpu54yuJlTarVotD7cLbEifphzMu\noMWC\r\n=oAqK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDkmTis7f6tirDfeiVONYSYtNZiFqTNPrJz5IwZcZ/BMwIhAInbTKLGmzDUQftIlmBC3K6kDOOYAc7Ff2bXBXxoA5eB"}]},"maintainers":[{"email":"wrt+npm@thorsen.ca","name":"thorsenio"},{"email":"william@skypilot.io","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"william@skypilot.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_0.10.9_1574213363906_0.6998194766146473"},"_hasShrinkwrap":false},"0.11.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"0.11.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/toolchain":"^1.0.0","bumped":"^0.12.0","bumped-changelog":"^0.3.12","bumped-finepack":"^0.3.0","bumped-terminal":"^0.7.8"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run check-types && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/*.test.ts'","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run check-types && yarn run lint --quiet && yarn test && yarn run build && yarn run generate-typings","test":"jest"},"license":"ISC","types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2019 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@0.11.0","dist":{"shasum":"72944905a467dc9d32b115264f8180062fd18d39","integrity":"sha512-MlXxP9b0UTTXhpWhZ1KpPTmHNCAxdCVBLdT0YhQ88BOj/x3ga0pFtwrSsEWL6zdr6lyedEsJR9xZ6yoOyiA8VQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-0.11.0.tgz","fileCount":75,"unpackedSize":32270,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd2VPGCRA9TVsSAnZWagAARQgP/3Qrgq/zORypTCTnSXQB\nD7McR+O9FgX7D97JrDIrTKDkFANUT5rpFyrvexdIoDclQo/N7xV+kAYoypV6\nCL5ldXuy+uBVHadRxLWicEU7yWPtdQHIv+UMVmcCB86xWFE/Iaz/1G1ocw7z\nFdrWllCHreoEZyXpQJPL56PK1mXUfrmTRWAw+x+gTI4G/jDBetfJmIMvzFMT\nLpW9814wbp138EW4auSNwA0b54kvjxZccG+/4mkq6RyJgvCD9Xc8WnEQJRAf\nh8+Hnt14SpeKJjNerpyyb3cKv885JALWmnGXBhCyuwv0m7WfAsk7sF/J1dMB\ns0/Smp5zWLIo9xanTINApbcpAVjj2F1maGOYzz7iRsICxy43YZlAjfcP92Ff\niGj+d0WNE+tKJlKHNQP857AdM9jYBzfOL9aIYxoMmo6xGl9u9Tdt8WU63X3G\nglURgSn0877kdb6YM9WxLp/dqcC+GwYPLpuzHjqNyNcsr2AfAH4qp6h4LF90\nKre8a+zeuriVtb85nRf3CPTp7Hpd97P9DpTOMQgOke1Pqr7HCiAYt5l8quel\ntCtPUKWO4dizLz6PF2mjFZrK9lWKl8HW4Ioq+tBlDnQcZPFDMvepLxJB9MJN\nIIWdyH7Bg58yNNPRmaEQbimjm9nr1Vab/UaiWyi0k3zgZMqsKO2JKrK3aQbP\nOjXn\r\n=GViR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCA1Ank3diYhp3EnLvfa5JsrNuvw1O3dH/zDBPxNomrXQIgUvtQCfVsxhHzLhDziQgC+oB8CHsl/unjofevoy6cXGg="}]},"maintainers":[{"email":"wrt+npm@thorsen.ca","name":"thorsenio"},{"email":"william@skypilot.io","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_0.11.0_1574523846285_0.7830348854063336"},"_hasShrinkwrap":false},"0.12.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"0.12.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/toolchain":"^1.0.0","bumped":"^0.12.0","bumped-changelog":"^0.3.12","bumped-finepack":"^0.3.0","bumped-terminal":"^0.7.8"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run check-types && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/*.test.ts'","cq":"yarn run all-cq-checks","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run check-types && yarn run lint --quiet && yarn test && yarn run build && yarn run generate-typings","test":"jest"},"license":"ISC","types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2019 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@0.12.0","dist":{"shasum":"07a9c8871006c27491667894645adc072c99bd66","integrity":"sha512-ZlHp7/ut5cQKwjbGZ5O0EOb8brw9bbmEX053Gl4eEvq2Nxjsrv5TSUSaCHLXgdL5OHbHJ1jAexAGx0WxZYGjLQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-0.12.0.tgz","fileCount":85,"unpackedSize":34567,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd2fo6CRA9TVsSAnZWagAAlNUP/2D4PjJtUrKE6Rveh3v8\nFxglJQuORiHAZrbEGEi4xeBeRgvySiOMbnnpqPXPRsgGZu8kDumPGiUvj4Ei\n36yMBX0A8Kj6mPKi+A2c+ErNYhbyNzhPfKZPy+VLXKRIxUFhrKMIkRZUxLmF\nA90eBvjjpZzQBR3DfOCt6XFS0M55xO1JoowUmqOOjkQNgx2lm+P/cZDCGJ0l\nXFyXaoEUEIVHzwGHxFInFuCPoABvutSVJZ4tkMmfZDEnNuwcqUE80fxbWKs7\nLcZtEfqHeIbOmGxQFStvmpXiBA7jFBQrIBhjPa5HdOkjb6gTOOK4WbD7xFO2\nebp0hSBzG2X7sLiAUkRtpXT0RWVp1GqycoEl6/xxxyZNXcosUPVf15eIUhcV\nrd5CwxAfApRzR9NMTAmx7IeErvtcC56omPQUuUeF5cmpfTBUTHJFrx1c8Q9c\nbtioGaIMmFlIizsY+ld1c+bnZZnpHk/s4XWKmzngUtnlB51oWFLWfw7Y4SM6\nNJixrejuXXYRBXFBS/sI1Hx9ERY4dj7KRdvbDh6M0phuuRv3iAKbKZMuhUpk\nDEGdq4hUkrdDZUjEZkRSuxnln8x8D4ZEHlHI14gFo82vYPeQhhmDWmS+pvZF\nfsN9J4dxl+3Tu31PZpMhXubXEh7qFDCcrXv1kaRaItwDH1EE3p/mImSEPoSw\ns2Xf\r\n=3DJ+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG+NW2Ckpz5rHXgAnejflmKbKFQBvfzzPAk1X5sjKd7cAiAWXAWL7paD2HHdQgEyA3F2I3/GHFxGMB2QuDz6ZU0rfg=="}]},"maintainers":[{"email":"wrt+npm@thorsen.ca","name":"thorsenio"},{"email":"william@skypilot.io","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_0.12.0_1574566458046_0.5996202924952305"},"_hasShrinkwrap":false},"0.12.1":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"0.12.1","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^0.1.2","@skypilot/toolchain":"^1.0.0","bumped":"^0.12.0","bumped-changelog":"^0.3.12","bumped-finepack":"^0.3.0","bumped-terminal":"^0.7.8"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run check-types && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/*.test.ts'","cq":"yarn run all-cq-checks","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run check-types && yarn run lint --quiet && yarn test && yarn run build && yarn run generate-typings","test":"jest"},"license":"ISC","types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2019 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@0.12.1","dist":{"shasum":"bf3fdfba3efa2fe9b1ddc3c4cd2dbbd78ca7a901","integrity":"sha512-dJnElykv5IIyt8fCPFfA375ob3A3zywCWJMt36pXXRSCI75mofufmBt+qIXyo/hOXB5BN79q819D4zWQp/u7mA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-0.12.1.tgz","fileCount":82,"unpackedSize":34763,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd3wrRCRA9TVsSAnZWagAAWFYP/jvC/ah+ishZcE9mapUU\nrp3U8V5N3Tll9WWzzK9xYVjnSgx8Bai2TFm/7iUuYsdHOdWJC+ccNO8cvLy1\nWZNQSLaGVf9GRCDAz1DvlFf267OhWYlqdboBmQinmiuiR6V2lfQQbk/RAfhS\nzUhvyIBrVNdy0YAl1SmkgcBuYDnvGrL38jKcKXDl0831ZEv7/c7KSXUIf27i\nvbLZ95dmlOjy+wtt2BuRc6k7DfYqYWmhc+1kxNZK+3et4ZGqzQWMC54wkwYC\nNT51/Dm491B0mlJNbL0ug15wdK2oqyaHB6cmWOyXVMfGmC4AAxEALpGW0Htp\nQMI5ReVROcCcLPnzjzBwBZ3m+n4mcO0V992r9oHXb9o+IagyZbrj0+QrN5ej\nAkExtEYY6r0pXfgjgZzbsyENBDHRhkvLlS8tJfZ2eNREgkOaMm9X27/7o8Mc\nARoiut90XCeYbphAphKjvvrIXh/ooBykzGvRV7mDw0kA6yo4WwujF7YfZpNi\nMOxeo1vfgAYKsDvMARW0AK+U+Lk9mi1010E9NkYnXzFPV+ThgyIDtleQ2/8b\n/FVh6aMQBG71o/2XUHMzkvgNJgrlVwpJgYuYCLvi+BI8obnGXALmLu3ynjQe\n6NkE4ZkG4N7bjqJwewMFl2A9eV+Un8T9frFizdzw9v0aVVjy4oEyHhmshFD1\ns22E\r\n=tHQO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCSQY7hhMLjMYX6TQwJGGxp9AFUscQwQznSQ8v6Y6ejgQIgLuqjAak9ldyCvlY6+IPVRM9wIO+/92TYMmW8AD5M2+A="}]},"maintainers":[{"email":"wrt+npm@thorsen.ca","name":"thorsenio"},{"email":"william@skypilot.io","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_0.12.1_1574898385403_0.27697069398721785"},"_hasShrinkwrap":false},"1.0.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"1.0.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^0.1.2","@skypilot/toolchain":"^1.0.1","bumped":"^0.12.0","bumped-changelog":"^0.3.12","bumped-finepack":"^0.3.0","bumped-terminal":"^0.7.8"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run check-types && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/*.test.ts'","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run check-types && yarn run lint --quiet && yarn test && yarn run build && yarn run generate-typings","test":"jest"},"license":"ISC","types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2019 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.0.0","dist":{"shasum":"d9d74045010fe7da7e042294ff0ee149d3117443","integrity":"sha512-FSAdW3PyRh9te5LC55Dh+pcesSjvUgLp+uoKzKku6Nn/Gz7T3uIjANYhMXlQyFYBApTScpl/PWD8y71JjmQL2Q==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.0.0.tgz","fileCount":82,"unpackedSize":35369,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd4wnwCRA9TVsSAnZWagAAtFAP/0RtNPXr9pZzA4i+5NqD\nmsMYVPQFQuCm40ZMdTMdgOoyUX0kbwYVd58VS+meDq/O5pOaRea0CliJM/V3\nvQmLzaK0+U9H5pbR2ST636TNivss3STiC3IzeUG6+dd29OX3Zmr4S2Apm8jy\nkQgM7qsRUuFD2i/Uqy3lEeJ3cI1ahMhJTYGFpRmxfBGlub/YJu+wskLYr2p6\nJbBaejKCHsIPDQWqUh66E9u55wv66iyQ0yCN2BnK3GdpDekCBad8WBcDKyLc\nx7A5JbR2tEFbImqL2ldtfWRZwETQUeY+20/ew16bVbGAg+dvXuEF1+lKmUmx\noDczOIAe9wNYShWlya52ftmxyu2YPJ69WS1UoJ0R1vgLNRxDmnzb2UsNMnlA\n/gt0IQLQqsJ6J6TiUlOOxZ+K/ctnxDHToOOxKxlnbPUxaWOv8Kgpl/CTyMq3\n6TF8mJ6aQ3YOOqJD84f1lwIGUrNexjK1zhlj3U4Jq9xe75r4utFLL57XrUeM\ngMLh4WHqgauivLH+ruHXzdz7nFderzCwnkCLBhbFisMfXXK0FOrbMG8vosd4\nxNayXbb16XYQqSDekhiXhx6Q7+PTf8F1/1VryRHC8yyfsx/gpM7x0m3kTHbL\nQu3YVDfGf/HBkt0//6j3ThAuRn2dzNxFtBioVzE5XtNf7qxUdvcOy9+RxvrD\nK7H9\r\n=0RX7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCvE/BaQkr1alAOWUQldLEpQ0LBJIOCSe78P2s7DYgKkwIgSHsDFODEzd876Vq3Ak2kaQ/e7GyfWdYJhLGDm0hGxh4="}]},"maintainers":[{"email":"wrt+npm@thorsen.ca","name":"thorsenio"},{"email":"william@skypilot.io","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.0.0_1575160303493_0.29251212636132484"},"_hasShrinkwrap":false},"1.1.0-beta":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"1.1.0-beta","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^0.1.2","@skypilot/toolchain":"^1.0.1","bumped":"^0.12.0","bumped-changelog":"^0.3.12","bumped-finepack":"^0.3.0","bumped-terminal":"^0.7.8"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run check-types && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/*.test.ts'","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run check-types && yarn run lint --quiet && yarn test && yarn run build && yarn run generate-typings","test":"jest"},"license":"ISC","types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2019 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.1.0-beta","dist":{"shasum":"7c4ed487b79e08d478160bf97c96bee4cb6d448d","integrity":"sha512-Wi6f5Fn+7hQD9MuUg0ZRUukpx2CqpDeOgK3xr4Z91CJIfH7jHt75s4k2sGgjwcD651ePXVjJk965tVK36d4/VQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.1.0-beta.tgz","fileCount":84,"unpackedSize":36948,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd5A4WCRA9TVsSAnZWagAA5PYQAKKRO+SHA/1UeWYIRCDe\nE9hwJ//c7SFUis0xKoT/9wy1jMNBSwZhNth3UnvVDGDlNMdn9d5YQibTwSde\nIO4yHw9WWDM82xopTlEAnWkq6ywJtQPwmh0bV/stFBwXnc3Uc0rh/aTOMKJm\nDKx2sqEcglCEJtXL9koANjHQRLp0IbOXIpzk25GgnSWIEdYfyd86dvQEYAWo\nqCv6dq8Vn19EqCLUqs/w7APHx5Wp6LBjDDpczExuI54fKDkL7P5fFnI4Gcg2\nCrgIQt6dYqq7tRto//nNSa24O0thL1IbL+/jqTnMyDIZuiC1W5EdP1zdTHrC\nXShiErAZlPjQfaniDwDZ+cWhx88up7w6rRrlk/uSm6RnSOiPmPxAIGR2WxDQ\nJg9J0pDP8QTRehqMRkb2exfWUJoVcw7D7WWxNNGfaT8wPg6pjIAfMmz/6dix\nvXpLyR+ntp/1Xe1oIDr/A5TEQFGICKWs45oivOTQUzNkcoHA1/4Gj6TiSgT8\nfrLaFu7fFaJ619Gt0H/QzTOIBfbikW1AcTVb/yhK85g0EZA3CkCpW3NUxOMR\n5hWrgkIl83lPqSYHlRph/03kohRLjhu3WHoZLCi/SFr5AG+uP/7kPdRq4TJI\ncaO5m3+43xalZv/j/665SHfGuVIryyax55/Vbn0fBS5iN2+OhHKsy5YEjgfM\n0+LV\r\n=VNBC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDxEWsbiJ+7r8JptqAVN8LRy0R4CJjl1zqzMs5Ta0HHSQIgblOua/R1ktXMx1VP9pGi59/VNkAXZlGG8lMplqaVS/4="}]},"maintainers":[{"email":"wrt+npm@thorsen.ca","name":"thorsenio"},{"email":"william@skypilot.io","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.1.0-beta_1575226902153_0.5873919727118597"},"_hasShrinkwrap":false},"1.0.1":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"1.0.1","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^0.3.0","@skypilot/toolchain":"^1.1.1","bumped":"^0.12.0","bumped-changelog":"^0.3.12","bumped-finepack":"^0.3.0","bumped-terminal":"^0.7.8"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run check-types && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/*.test.ts'","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run check-types && yarn run lint --quiet && yarn test && yarn run build && yarn run generate-typings","test":"jest"},"license":"ISC","types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2019 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.0.1","dist":{"shasum":"d7649bd60efed7e9596d2cee74f54c917b8a5117","integrity":"sha512-c0NDSjpptmxJ6Z6wSVIZcz8YMZwL10qYFXBmmi96sr8AH0qbGlDT1cYEdygyQqs4MkxALP6knF5gEAVcfZ3q5A==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.0.1.tgz","fileCount":82,"unpackedSize":35634,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd6uomCRA9TVsSAnZWagAAgaIQAIhcMPUKIm4RZWllppa8\nH39uZI+rJd092oi0/aWkJsQqFUeXkp/o7mTLaAfASSZ2oclyElKEiUqZWKMg\njvxCnQ6ny3vhu8L+ghOTfiFQWkRRcT29rZDG8f0QQkj2htzTsLpSaNuNKDut\nuvSefLX/27gX4vVSVpI7DWVomDDaQv1QUaLdBpxKBjR1HhPeH26EpO7RF2po\nGbX4yC5g3YHYND2cciI6UXNrMlAcZqYuz07kEIU9M+ZbEUbnLw5Z993+F5nA\nKRNZhn8q7sGGFz4aQSxH7LkuNKvxrKBVh205hy0wbMDDd4a1uGdtskp24rYt\noiWDmKJI3uhcoGHrc2ExNlw3ijL2rvxcGY9ksx2YKOddGWyFPFXBO+u2oosb\nGuJzKz1dXUd3HGsoSBCkEnOvi8TVrih63Y3UJzteocuRH2udeT3sKqWju+2u\nbr5wfHkFYABiB+y4p7XDpFbawzlpTY+hcaNJDx9YcCZRC0gBCca4LKxgUuif\n8jxo5/EG3XC1bhiRh/tgDsMlPbD9NJ/r9pghNrIlgVdMn6ziaZ3a7BbR9uRT\nlRnxSjhIt2l55vULBEm/x9pakx9lFKBDyIJo5A71DkJHB9wwxgA6P2+30InJ\njQ5dvo5ayOAWA9DFcYVc8sdf6N3nVZV4nsSMSRc4AMAqef6kky+1AQEC4BLp\nudOC\r\n=Frer\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBQQuUpl3ZpgzmyMQb2Ek5HKtTQiStz1rnPrsYF6kEMkAiBeJWYASAKqGbKixPMrHJsuc18wSDgwA7cCt1wLbW9UuQ=="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.0.1_1575676453594_0.6414505617196824"},"_hasShrinkwrap":false},"1.1.1-beta":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"1.1.1-beta","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^0.3.0","@skypilot/toolchain":"^1.4.0-beta"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/*.test.ts' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2019 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.1.1-beta","dist":{"shasum":"55ddc4a678c8fd96906cd47f4b1390381dd1cf81","integrity":"sha512-3kIZwiIRhCtnBbNWD5XWijiQt9OBJXsd0mhei7T2F0mCCN0lqE1cwHR6JwDS58q5PQ9qiKNEJsRwm1QQIfnaWw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.1.1-beta.tgz","fileCount":82,"unpackedSize":35846,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd8+3ICRA9TVsSAnZWagAAD6wP/iRWhLtCWZtrFiLOoVH/\nSPUMRjl808eDauyYBgUhaebnQEsn7oBxMkrOvazP3tRADI2rX/ALM2evA+05\nhluPvJ+CfnWqfyaJrVRGB8LQLXtXGELTfq2c6SEOrnZfiuIk2CxOMKtTk7aU\nctEZIz3vdIQJ96tzgIqnRbR/NuC+K6VHpc4W7jNQ4dyPg5bYJoykORd9OOI8\ngGGTk1BKesZxtWtBWUVzJOEOhW9XqOxiRLp5T1l9EBy/Kmq6GlX5e3FqZlBn\nfKRt/FUfkLbUzLAi9J2QI8z95Dr4jnigtMKkoD6TAFbj0IGaYidqv8OkEquc\n6l0dEZTJjqtg9RFOzDiw3fkQe/gHaI4m6pm68oAJGCynNdQ+4lDb9aJalnhT\nE+RVy+0srUMWhXzjPeGYCqGNW6+bnUNIV2RxRyMEIizgxpATMhwpPQC0yHmj\nD3f2mvGAB9ywy8ud90qByC6ySz3OlJ+nXYHRu8uMpwCpT8FajMVRm+Ig5bKj\nJqAm/Ptw2jVMZFxtFbfEdKdoSuMjjjhE2CiUy1OqpF39/p7j8+WfFz343hl9\nax3nuQx/Q4JJLp+KAxt0yJc8N3hfjUpMc2jQYgWERFcaURfxl7mes++P8ZcD\nKi7j0ngJC9n66Xk7chBELgKCsIe+e1RpIPWZKGQ1yo2f1aWi/FQVpR9mnsur\npfAS\r\n=12Uj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC+CFcIedM7UnH2j2WZL9+axomTII9SyR7YgOJqH7VUgwIhAKIrhMQla8wGyZAC3hJl/kAJmMMOGSW86hYYOoMr23wW"}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.1.1-beta_1576267208294_0.7674029144724097"},"_hasShrinkwrap":false},"1.2.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"1.2.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^0.3.0","@skypilot/toolchain":"^1.1.1","bumped":"^0.12.0","bumped-changelog":"^0.3.12","bumped-finepack":"^0.3.0","bumped-terminal":"^0.7.8"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run check-types && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/*.test.ts'","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run check-types && yarn run lint --quiet && yarn test && yarn run build && yarn run generate-typings","test":"jest"},"license":"ISC","types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2019 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.2.0","dist":{"shasum":"2c7206714175ea485c223c0d94284bfcc3a4561f","integrity":"sha512-kDwXG7/N2a48LdWBF71cYrc5vSWVk5Nk1LUgDzvkaLPf54XzlTAYh+q1IBeD0BmujzBq9/Hv19RUFB/Vr6hg2Q==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.2.0.tgz","fileCount":84,"unpackedSize":37546,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeFPH0CRA9TVsSAnZWagAAhCMP/2PRRl4x458T0huX4DW6\nMn+OOlZaPzJ3If80CzoM2nJ0rdhTTpGUsGJzihryC05VleYDjt8ObkwHtgZK\nLIIo10QR870y7vio8btNf4QFEyO5/QTcmGhDCoxgTfVVP/vt/lrvtgFuFLQf\n5oVrBXMZ8gvDXqSYQiIzqB7bx4RrjCwT0Nb2MmE+eZcnbahoAQKNhuNnSvMh\nk8JiJTLXeBMl2gT2GeO3ldwqyiQWUJ4BiwjFngs56dK3QTOrh6UZpgTAnWjS\nLj6DfTpPVi99/kAJ2LxqWI05QkHKfMUgJB1wGKYqfSECZFSgNfcX0ked1vmp\nVo/HCq6fDoRgml0A9QMzrtRgpRoDWkIwUWztXZWYektp34ffSUNcEt4EpGAM\ncdq4gym6y5OOGn9vsa/3DjRFU21k9qgAkg7QlQlshAsbVg1Db3VZnSORHYFB\nDmnrf2JdACBvbTjd9xuqcLbPrglLLuShv7aO0JLSghpeEpw7v/bs4cUtyHVo\n/GD/82wsyjA1R0uBqqGvAad+BS2f0QLFkZyksn9UlFhVm4sZLa2E/bPExW0n\nQGiijoM/UwNBrXpmUfxCWc6wDsnAzbvbZZSzbVEvbHi3R6ZWtBFColDR/abY\ngG2nIPVXikzzzPQ2rLtMx/gFBoX8HzamW1jq4aon322lnIkhmVFzqg5dsJx9\nfnwt\r\n=ccek\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDZR2QCxCqypDrar+XKzS89qRp0jiYDvHgaZmZ84HTsogIgbavSFTeoiUFGhsH7kfL2vAWJP8OwHVK4lk8qUqJU4Mw="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.2.0_1578430964082_0.5207394646490966"},"_hasShrinkwrap":false},"1.2.1":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"1.2.1","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^0.3.0","@skypilot/toolchain":"^1.1.1","bumped":"^0.12.0","bumped-changelog":"^0.3.12","bumped-finepack":"^0.3.0","bumped-terminal":"^0.7.8"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run check-types && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/*.test.ts'","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run check-types && yarn run lint --quiet && yarn test && yarn run build && yarn run generate-typings","test":"jest"},"license":"ISC","types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2019 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.2.1","dist":{"shasum":"2473b8c223cac0a6f154069c9568b42c945ee901","integrity":"sha512-nPKeo7DnoGD+Kx/udAzw9UevhRaYNCdBpQnw3kgap6v3GNHDAtjMrGGSKGtQvgbp+wuBqGFiDNhVcmI9+l3GtQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.2.1.tgz","fileCount":84,"unpackedSize":37969,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeFPOnCRA9TVsSAnZWagAA83gQAKJpgGOgfVU1s5Kol4/L\n47I2clbXyzhs60IOeTlR4zxBKxOMi8OjplGtIzCHUk2M9FbEqPMlnXe2Uqo/\npwnOV/oHPbenesaZdlA7IHD95ZmST/+r/Zx783QVvgus7m3LxqcgZv1p7LTa\nDflfL2lElg99/pVNmFllmqhwD4gKN8Uv9n8cWD0BVA8Q9vdXGhhl2SujVy37\n1090nX/ovfjiO8MEqEEyh8jty+DVReZVZ2f3IcKw4X3tslFMwB3z+HYn7iPt\ns+NRwhHgIhWJcrnD4FqzY4ILG8kUG1sDp1nYaK6Ztq63XlyzPIloEZsoKSgr\nEiIZlJT/aQzyXFSU3lUuqQhcSgLwWREULEl1pbR/UNjxfI4TKG2knfUdioKt\njjqOsPNwl82jcvYdOmrGyt0U0yYthO97/TiTJx0H4hDn9Zdbu4RhP449c4PX\nlQx7eJt1CkZD5rvmLYnSSjjQnDQ+qxGmISKV3vZysnt026W8oWZlrcJ2DX09\nc9BgJ8koi4DNFtcx4CphNf20IDKWiqcGbTGGDDI4CCK1MXC5GuQwQh4S2qUY\nqW3JOvbxVjFo+zgn4qHJuR5kg3nJV/ak9j+dvXJzUtcnWefAzv8MI+7a1O0W\n706FOJ3zqh1Kka+Zhnn7/Dk0DmYa0ECUxKXYfgcHairNfkxRM6f10gMY/f4r\nt3AC\r\n=Lq3l\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDENHGboflygHQwpra8zBzebRd+QAk51DD7h/WIKnQfvAiEAj5YIe8zQJbuI0fDL7OC6EF5289gH+f/4PfxcxkPkp+o="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.2.1_1578431399284_0.10066284866704556"},"_hasShrinkwrap":false},"1.3.0-beta":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"1.3.0-beta","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^0.3.0","@skypilot/toolchain":"^1.1.1","bumped":"^0.12.0","bumped-changelog":"^0.3.12","bumped-finepack":"^0.3.0","bumped-terminal":"^0.7.8"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run check-types && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/*.test.ts'","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run check-types && yarn run lint --quiet && yarn test && yarn run build && yarn run generate-typings","test":"jest"},"license":"ISC","types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2019 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.3.0-beta","dist":{"shasum":"4f82b06b3f0fcac7ea8dcbcd4014bbccf3e47ea0","integrity":"sha512-drfRiM9laj1fm7IY4Q6GmgBr8C6J5bEhsFyWfpfzF/NoXyW0gcKLsw9LrAtTXKlTAkKNBbUdtv7IkEoA4zt07Q==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.3.0-beta.tgz","fileCount":89,"unpackedSize":39365,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeFlqKCRA9TVsSAnZWagAAINMP/RC6+dhLWSk7pLwuEbVP\n0L7qlyXPi8rzl3hc8b47At2+RADl7FkOiOk21AZQd87CIyDMUaNwOgm2y9A2\niHM+W1YrPMAaKyFuhfdLGkJgfbiMpHIdOJ/5eoZO/iKa/3RD/BE8L6u8SDbl\nobXKoasQpsTht52/U6BFwTo15PWUsLklSE/NuZeSfAdIwDAjWgMM0COx9grz\nnK3BpgfQcyqUEsJd6f7LptLGklTEAPzvXq+0h3YFdOCEwNAA4wLHiTPiPMUF\nHIPA8b02R4rFj4tFs+BEcSzOPNGIJJEVud2MSNzFDK/S/HW4bv4FGdFVe3+j\naQ0NzJzm3s2HeFwgyg6/1wDUYOgBU5swylGZnuaTNZ7D579QrKNYIWvNd/oD\nOhAsN8XjxFtDj5/NX9S/KmIJIz7yDVNSw0AXupamjZO0noxhxRyecNbioLCH\nQl4N3Jai7XOQQ2L4QOfaTTzEkoYCQiuxc4Xr2dw8a2BW9kzOzxT87URraSNp\nnC7htuWfrSuBKyRvOq1We397XNFOcKFnu8whPeXr4EqtUmkh/hwi3BmW3WY0\nCoM5aijdC+x1LU294LSsSPJv7MsB2wHcQEE+UoDF06EARw4rvoTJMsBuF8P8\n/V+Iv9ihMpSg5T+wYQFL+vmzG3XVfahHp72XfLgRMcV6MgIn5hOO84duDYdu\n1j6k\r\n=x8VW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCtzC2Q+DiaT6v9mNCYsHWOjG5qKxP/kL7Ykb8uDFumxwIgOmwpY9+ttpJkqI1sQtCBAYHLDj+Ovk/W3EoYECnhVyY="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.3.0-beta_1578523273739_0.47757077020905747"},"_hasShrinkwrap":false},"1.3.1":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"1.3.1","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^0.3.0","@skypilot/toolchain":"^1.4.5","bumped":"^0.12.0","bumped-changelog":"^0.3.12","bumped-finepack":"^0.3.0","bumped-terminal":"^0.7.8"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2019 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.3.1","dist":{"shasum":"026a90903c639fa2bdfc1ea7ad23b4c0eb37f8f0","integrity":"sha512-mG/hyuVWVzH4pPehHe2IOQrAqfHxbsPpnt1/nQJYhqFKlBLZOyV3BHz7wmNl8Ye0p5ocSUa6IUm082LKxF2eVA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.3.1.tgz","fileCount":93,"unpackedSize":41521,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeHTykCRA9TVsSAnZWagAANFEQAIiwFYDJ1TGFv7+COZSM\nDv1m2ax4WqnDo2AnIuCgt79JHASYjZPtmfZHjXfls7JcouN2Ao3vQas7Cy37\nob1UR3T3vSpG/mlN4AK3L8YIpfjf7BCyK5SmnVySBgusajoGeSxeT2TQ1pXy\nMuas8GQRTWlqTtz3sX9rRuEqm1TvFWWdoM/IQ/n6/EQFrbyNmh9Ydr2dHJ+i\nF7neUxQknD1XhRmzpFuImy16eu0+nJ4IR5zFD50mjWbtZP9SnLnXhd7XI0b+\nweWEVOqgjb1K9XP6/UjfjaK5Zy1oZJiKKcZD8YxeJyaug13vucMPtBdDZ38K\nZpWPWJEB7MSxK0GfAosoJl7jI3V5ix1RmumS/4ZSt9Ze4X5Y2ox62U1YTI7G\niu+HD30Xod+x1JTP4LTW49Z9QNyq93JJo9uiURQ/bS5gpkx7RkPDwK9FTzkJ\nalSFsS71A2TgV4AvUy6+VOLfO3p8a2gE+kklnI4GSG6NZnzRE1zRilcZWWhn\neHmKbmxslLLbW49CJRux5R+SgnQYlCNUJbEdwy14PLTX7B2bjyn35qGCRGQt\ndaJqXU39abFClRVil7D3qywb/7Q0I/9Vv71EzXiQm3TQJfjWXy4NnwpAI8Kx\naiUCsd/x9a+Dsieh1e0UNVhmSzA92QGBv6wbmTVKs2FCH7ECLMYAwZzbINH/\nCi43\r\n=p2AB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCjaR6xKsyRmsz4FzVPZ0tqmaK0xRyEwwmvWbPkymMuZAIhALth3g+3SZASK+DJ3MowCg9/M0cvqMNkO7cP5JzdkGHA"}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.3.1_1578974371866_0.5389926176402446"},"_hasShrinkwrap":false},"1.4.1-edge":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"1.4.1-edge","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^0.3.0","@skypilot/toolchain":"^1.4.5","bumped":"^0.12.0","bumped-changelog":"^0.3.12","bumped-finepack":"^0.3.0","bumped-terminal":"^0.7.8"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n__Array functions__\n\n- `flatten`\n- `pickRandomItems`\n- `shuffle`\n- `toUniqueArray`\n\n__Date & time functions__\n\n- `isValidDate`\n- `sleep`\n\n__Filesystem functions__\n\n- `readPackageFile`\n\n__Higher-order functions__\n\n- `curry(fnToCurry: Function, ...args: any[]): Function`\n- `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n- `toMapFunction(...itemFns: Function[]): Function`\n\n__Number functions__\n\n- `isInteger(value: any): boolean`\n\n__Object functions__\n\n- `getOrDefault(obj: object, key: string, default: any)`\n- `isObject(value: any): boolean`\n- `swapKeysAndValues(obj: object): object`\n\n__String functions__\n<pre>\n<code>capitalizeAllWords(<em>stringToCapitalize: string</em>): <em>string</em></code>\n\n<code>capitalizeFirstWord(<em>stringToCapitalize: string</em>): <em>string</em></code>\n\n<code>computeHash(<em>stringToHash: string, length: Integer = 32</em>): <em>string</em></code>\n\n<code>countOccurrences(<em>str: string, substring: string</em>): <em>Integer</em></code>\n\n<code>digitsOnly(<em>stringToParse: string</em>): <em>string</em></code>\n\n<code>inflectByNumber(<em>howMany: number, singular: string, plural?: string</em>): <em>string</em></code>\n\n<code>inflectQuantity(<em>howMany: number, singular: string, plural?: string</em>): <em>string</em></code>\n\n<code>isEnclosed(<em>stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter</em>): <em>boolean</em></code>\n\n<code>nondigitsOnly(<em>stringToParse: string</em>): <em>string</em></code>\n\n<code>function parseEnclosed(<em>stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter</em>): <em>string</em></code>\n\n<code>removeExtraWhitespace(<em>str: string</em>): <em>string</em></code>\n\n<code>removeWhitespace(<em>str: string</em>): <em>string</em></code>\n\n<code>splitOnce(<em>stringToSplit: string, splitter: string</em>>): <em>string[]</em></code>\n\n<code>startsWith(<em>string: string, substring: string, startFromPosition: Integer = 0</em>): <em>boolean</em></code>\n</pre>\n\n__`String.prototype` wrappers__\n- `padEnd`\n- `padStart`\n- `toLowerCase`\n- `toUpperCase`\n- `trim`\n- `trimLeft`\n- `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2019 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.4.1-edge","dist":{"shasum":"b9dc4e0587c24e1db8f576190bb319f474f96236","integrity":"sha512-+2bDy4sLi7+6sFuH1TkyjzFRQD0DbhiT0o5EvUAtQhEd6tVikhxuq0pJUFbvRxV3NKW9Gm3Dfja3UiGWE1n10g==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.4.1-edge.tgz","fileCount":95,"unpackedSize":43748,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeHhwgCRA9TVsSAnZWagAAWZIP/1HpxzM0biOOika11pO+\naYIyFM1Yoejiy6slKMC9NX2gn4yvEJbY0G1+RQiHIOLayTQVBZMRtn5qlG6C\nwiWUOCug2pfZHhEP9FbhhNxWbikFo9C44KcLpvSnFMwenHoYC6j2ftiVMqgD\n4l/fSIZc4dXIbF30rHEGIGPs8FJ4irYZxac/3p5W+wXcPmWG60bo3PtXSLO2\nMGp9nKitQSfGdq5Bxy9a9VVq/RRDqCO3Ggl6xaH+ki3ZDtdviUYQTFDjJNSo\ngP5+cWHgdJkDqid4pCU1UnJw7tw2yxAVq9af+rBj9UCmWne/G9aDIU8x/bfJ\noa/UGAwTEgWmDFAB3Y8AkmUvsIKu/VJQJwOtiplnmCAvAf8TN7KS/t1mw2Vr\n1o1SYiXVi1ywG7yZ2MDlf/Iqql9u6jsfFyOt8g8lfeb0EQ5S1Q2JgrzZra3I\ncpn87pkZql0KcsQHVo6XSMZNhWVjMjzA7rUu9gI8gjBNyV8GVmrnb/nuTefK\nHSlJH+SFmzYiszNtHQUQ6jrLOZHYs7q+U73cEnuPdzm5bFa8OlhMYU0BZEjj\nN3mXAkQOvEF7SGzCPc++PzN2/0EG+e+71dGkEyqZLuOUw/yQwG/q8tScoX54\nDUcpptISNopzk4dOXA9+QXHtnSj0xAZ+U6nrufVmg0272wGAeKnqU8BPIJZJ\nMrng\r\n=b+1v\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDGh7j3ghbsL+IEgVP4XL0w8XAjsEHqFbalNTSC/Wb97AIhAOfbe1OGRKGs3WIvKkTIgcv7EinpAIFqN+fYe7hhW7OM"}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.4.1-edge_1579031584097_0.3680677581646541"},"_hasShrinkwrap":false},"1.4.0-next.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"1.4.0-next.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^0.3.0","@skypilot/toolchain":"^2.0.0-next.0","bumped":"^0.12.0","bumped-changelog":"^0.3.12","bumped-finepack":"^0.3.0","bumped-terminal":"^0.7.8"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n__Array functions__\n\n- `flatten`\n- `pickRandomItems`\n- `shuffle`\n- `toUniqueArray`\n\n__Date & time functions__\n\n- `isValidDate`\n- `sleep`\n\n__Filesystem functions__\n\n- `readPackageFile`\n\n__Higher-order functions__\n\n- `curry(fnToCurry: Function, ...args: any[]): Function`\n- `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n- `toMapFunction(...itemFns: Function[]): Function`\n\n__Number functions__\n\n- `isInteger(value: any): boolean`\n\n__Object functions__\n\n- `getOrDefault(obj: object, key: string, default: any)`\n- `isObject(value: any): boolean`\n- `swapKeysAndValues(obj: object): object`\n\n__String functions__\n<pre>\n<code>capitalizeAllWords(<em>stringToCapitalize: string</em>): <em>string</em></code>\n\n<code>capitalizeFirstWord(<em>stringToCapitalize: string</em>): <em>string</em></code>\n\n<code>computeHash(<em>stringToHash: string, length: Integer = 32</em>): <em>string</em></code>\n\n<code>countOccurrences(<em>str: string, substring: string</em>): <em>Integer</em></code>\n\n<code>digitsOnly(<em>stringToParse: string</em>): <em>string</em></code>\n\n<code>inflectByNumber(<em>howMany: number, singular: string, plural?: string</em>): <em>string</em></code>\n\n<code>inflectQuantity(<em>howMany: number, singular: string, plural?: string</em>): <em>string</em></code>\n\n<code>isEnclosed(<em>stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter</em>): <em>boolean</em></code>\n\n<code>nondigitsOnly(<em>stringToParse: string</em>): <em>string</em></code>\n\n<code>function parseEnclosed(<em>stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter</em>): <em>string</em></code>\n\n<code>removeExtraWhitespace(<em>str: string</em>): <em>string</em></code>\n\n<code>removeWhitespace(<em>str: string</em>): <em>string</em></code>\n\n<code>splitOnce(<em>stringToSplit: string, splitter: string</em>>): <em>string[]</em></code>\n\n<code>startsWith(<em>string: string, substring: string, startFromPosition: Integer = 0</em>): <em>boolean</em></code>\n</pre>\n\n__`String.prototype` wrappers__\n- `padEnd`\n- `padStart`\n- `toLowerCase`\n- `toUpperCase`\n- `trim`\n- `trimLeft`\n- `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2019 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.4.0-next.0","dist":{"shasum":"b314f5009b9f6ef29215b628a75ab7e9ab23d4b7","integrity":"sha512-F95MVioMtiFVm3eaXmhyvcUrWzpj8SzE4/WT5YxjKzY1qX6D5udgPzhP/BNoB8YyPC+T7G+tw2aKAmx7yQEP+Q==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.4.0-next.0.tgz","fileCount":95,"unpackedSize":43362,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeO6MyCRA9TVsSAnZWagAA4tUP+wQblV5FtUb4Ui06YVDQ\n7robZt4PzzaKnWXILWHw6/Z0B3MwnrwoWKp+PzCw5KC1u1D164gxV1DwvEGZ\na5sDdbGRfIMQPRc2tf3C9eyMoBphLapqwfGQlirS+QlubgRCJHK5Fv/rHh7Q\nK4Yolnw3qN6lDZaCE/I9D1ji/bHtxWbwaRX+/czz+Hv9wZaYjR6HxraRajDH\nIrQHKQizO03daz4ghKBe+Wcv1UrQek1HpjaqEKudZUXvI171XG82GrJp2MjA\nOcXINgyB+usUTQ7UerAe0FSmAcRB6ACVzae/SHles9C3tTJ7sAuQu3NN3b7M\nF/PKnRF0fIq0R/HrgKRr+kyDlYMnFuIDfqDpeiVkem4fzd9GGBO/xiZR6n/m\n9lrGPWtHsBOC2pSvw/dPo1v1SjJpSxktaHvxC2CykkROeb56+CoKIBvQYK7r\nAK39eyLRyjGD46BkyIAuA0gt1ZSAZiubQl2mXYg/gG9VcCxC5BcXDZXlNSdO\nOAkckWwEX92UM+SvPXV1HF6PAGtA4fc6V49Fsb8CGfLnKDoCDcZqnIMxw2Ud\nY9z1cq17KbaSPJoOYDCJPnc19eq9LO51FR0nZ3swBGmHVtDOxEcaq/fY9wu/\nvLhAJr8CCTo9iAs6xsAMUyYdaqtNW/h5T+1Nwcf79K8pL3hHvsYcuaU2/bW/\noB1o\r\n=Jw6W\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCtf5tFSXidWvwZLwf8NJ4w21n+FdniBD/v4mNhCxcEcQIhAOSIrLob4R+3rU3URCRWGjGKQzuaiRDa9dseTXWo/I/f"}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.4.0-next.0_1580966705886_0.7916823585108914"},"_hasShrinkwrap":false},"1.4.0-next.1":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"1.4.0-next.1","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^0.3.0","@skypilot/toolchain":"^2.0.0-next.0"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n__Array functions__\n\n- `flatten`\n- `pickRandomItems`\n- `shuffle`\n- `toUniqueArray`\n\n__Date & time functions__\n\n- `isValidDate`\n- `sleep`\n\n__Filesystem functions__\n\n- `readPackageFile`\n\n__Higher-order functions__\n\n- `curry(fnToCurry: Function, ...args: any[]): Function`\n- `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n- `toMapFunction(...itemFns: Function[]): Function`\n\n__Number functions__\n\n- `isInteger(value: any): boolean`\n\n__Object functions__\n\n- `getOrDefault(obj: object, key: string, default: any)`\n- `isObject(value: any): boolean`\n- `swapKeysAndValues(obj: object): object`\n\n__String functions__\n<pre>\n<code>capitalizeAllWords(<em>stringToCapitalize: string</em>): <em>string</em></code>\n\n<code>capitalizeFirstWord(<em>stringToCapitalize: string</em>): <em>string</em></code>\n\n<code>computeHash(<em>stringToHash: string, length: Integer = 32</em>): <em>string</em></code>\n\n<code>countOccurrences(<em>str: string, substring: string</em>): <em>Integer</em></code>\n\n<code>digitsOnly(<em>stringToParse: string</em>): <em>string</em></code>\n\n<code>inflectByNumber(<em>howMany: number, singular: string, plural?: string</em>): <em>string</em></code>\n\n<code>inflectQuantity(<em>howMany: number, singular: string, plural?: string</em>): <em>string</em></code>\n\n<code>isEnclosed(<em>stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter</em>): <em>boolean</em></code>\n\n<code>nondigitsOnly(<em>stringToParse: string</em>): <em>string</em></code>\n\n<code>function parseEnclosed(<em>stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter</em>): <em>string</em></code>\n\n<code>removeExtraWhitespace(<em>str: string</em>): <em>string</em></code>\n\n<code>removeWhitespace(<em>str: string</em>): <em>string</em></code>\n\n<code>splitOnce(<em>stringToSplit: string, splitter: string</em>>): <em>string[]</em></code>\n\n<code>startsWith(<em>string: string, substring: string, startFromPosition: Integer = 0</em>): <em>boolean</em></code>\n</pre>\n\n__`String.prototype` wrappers__\n- `padEnd`\n- `padStart`\n- `toLowerCase`\n- `toUpperCase`\n- `trim`\n- `trimLeft`\n- `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2019 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.4.0-next.1","dist":{"shasum":"974eef2ace03d792f8abea9274bff554e1d411f3","integrity":"sha512-sn5TrVFJNh0jQks6hRzMWUCJpQgqNEmlG4CGn2KdYYisyq5t/mBGknNiunjfY6xunQhwjnLDF25KPTAiQF86eA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.4.0-next.1.tgz","fileCount":95,"unpackedSize":43236,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeO6Y2CRA9TVsSAnZWagAA/dUP/RGToTj8YatHlVPgWcs+\nG0AoCwz7raMWTGpuPGrCjxAMRW1lM+rUHRdT/ceD/IrHooJCk/j6i6gK2p+Y\nrQien4SmwTFf3OscwqQYRtBjlMcuEz8IVv/7X1GcuovYG2IqZ4R60D5RNqkw\nB6863ARGg5geaqlXoYmCePw87Ix+P8+sQKU3Hze0EfRz4UQqMIU/69aM+mwe\nxcRrcFmpz9ylf56Xl7zfXygrpLDI99lIZnneNNnYNDBzev0W/bNjc+tciaSE\nwIZbUieJ39m7vq8sDkdhMuIXRDj5fibgC8glqU6TyGkMfJqBNBvPjjWms+kt\nIxt40stXuS0lbFOyxLML/+OYy1pP8sKKMHsH1J4ci6e9kPhcSPDqIAqTa8v7\nWq0T6DovPItfM0V/n7yX+3l9LWGX1pd2bS4M3ZT9eOmg4x685nuWdqwNKhUZ\nKfYd9FrNYwCB83mz0jwSDVcJZnNotuQS16+K4I8IoE/EIn5LxXHhHzUORu2Q\n4q9VOuGYP0sTQGN0BJvlYQ86nVfPuiiWa/K8WTpB3Fogg9UCicu7PGctUqzn\n5SkKF7b2sWw07vU84uuJeqRBdCdsjQxhvDL6GC+oCyuW9u5F+YpDMhP3Krkv\neecJBaH93q/2/OibNcrdFYr5Zf91dIuO1Vr2odlciN4MGyRSB92vGOTlH7PY\ntrG3\r\n=Js30\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFb9awCZpy4CI40mdXBK5u/QAeTaEBnOdbO9RHx3dtUtAiEAnKUYaYyy4USmQd1Vn4I7lyLstRbh7KJW2yXEVyvkdPc="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.4.0-next.1_1580967478168_0.47947554290341965"},"_hasShrinkwrap":false},"1.3.2":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"1.3.2","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^0.3.0","@skypilot/toolchain":"^2.0.0-next.0"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2019 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.3.2","dist":{"shasum":"8300acaeb5ff2ebc911eb446fcc70beb629287e9","integrity":"sha512-Lxr046aaB+k1yP0sC3WK6/YCGtUoTKGb9IFQHuA9N9E0LIhFoPptjI9NecaaPUMxTpiuncWcpCxDu+UbMqgRzQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.3.2.tgz","fileCount":95,"unpackedSize":35650,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeO6d+CRA9TVsSAnZWagAAV7MP/2iNnXY9ShEkyflld/06\nqj/Hvgn30iloYIstXXn7orknd8O7Zi2mzEUTungVd7Divem+Qrg6hpub+aJM\nutNeBhAg4pLV+3L6J2TZt1cazzM8sQzaRdTq3fz0+aEakmPvOpISHgk+lnml\n8qLxe0YW7HAZ2R3vEUlhL3ebb+P+i2GTMzTq7xLeYZt/17qIfMLUidbLUCGF\n2hPjgbfMV62izHr1o/MaWi+Vg7LwxV/MeUJ4+Yplog3JLZaNc3p9GOxJVj6R\nWNdFbBMwu6vlCYvLBb0may/15tiz4xW9mRHo2TbuzTMApD8iNrJZxKVNQyFw\nqgYsJiLP31axrWJv7bhEX5aRzXojoJBNPgVlRp/4WowiJlI7d1Ucykey84uk\nZuBebDcf/Rv0VnGOu92a209hnKWQ7RRsV0/N6cmcvCVLT9wM2GUfqA04QxLI\nDoHlnKn5I+gQxlDj+58LP05Lmz3bEdMnkECYHoEQ0pEcYWZ/J06ii7bGXtMF\nfgQjDDqZnaW2OYtjNAGqiUVnxSQ6sIiWZguQfz7kF4utWi7msRjlL51V5iE5\n90jbvtmuBeTpcL2sSVqWpTRzHi5lUJq6hKiToKdA/YT7VEoxw+HHo8hcBIwb\n1W86/CQsm0yS7F5P1pY1M+oLDtcfZpmiLJ3LxkLyiD6FIzJatgzoN/gCH2is\naNXW\r\n=7RVX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCJH7ALsPCjfQwreYt3MKJZZ/GuI7nGBBGjqqoOl+c7OgIhAJ7rImlA0dcU73gKsNSnmNBOadgXG0d+jQQHxxZ/REeg"}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.3.2_1580967805632_0.6217007038093936"},"_hasShrinkwrap":false},"1.4.2":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"1.4.2","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^0.3.0","@skypilot/toolchain":"^2.0.1"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2019 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.4.2","dist":{"shasum":"ee64bf734f56f9d6f55ee14b6a65fb20522c7883","integrity":"sha512-Oqbl/8PaBrzk3ki+vLxPnQhj6O02oTRrj0BWEuNvXaifa0p1xuHbhh+5uDIwmssdigiEKQLpDVAJfJr3cFJehg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.4.2.tgz","fileCount":95,"unpackedSize":35735,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeO9YfCRA9TVsSAnZWagAAwFoP/RntvkO7YRtakjD7bYPi\neX93fyyua5vRlnEqWHIVwmlJxEm9EIdLuZUSDxXj9s99EhU9x/tY77LZ2b7u\nMLEb8MWOvdiml8e0fcNb2YkFMzXdjlhkxTQ9uBmNIoKvxdNo5t7jUZFPL5u5\nUdV2/OHwguBISj2QIyD3XZkBtlYf8jEMusondtw414dPaJs5ellBnGYxyxgn\nhAjIR1BuPBIOSXMqWHf1DuQzRG9ZwRNgkG6yyDRclTmpOvtQc7yA37zGli50\nz3h6GV+4JJOab6c1k23hxqxngk+txRhs7vt196JelFhlnJrrSonLkTjGxKbj\nFPn5Y7TsjL60+f/V4D7/O4thtjLzggkeGIQYqS6RPmWgpDTU9aD37NpTntC8\n65whxhsJGEDWXX7jZnjJIqVa3jeZPJYZZZwTVCSI10zVuVi9EJ/5YlPU6uZ9\n9r+vJ+zgQpS3V9+zm3D9vbo5UXRBWtuNRiQlJIiosv4z9LxAiXvUIeioJWFJ\niY7E+QD9Bd8VfZqoRCXhfKzYdEQqVHVlYI829Gi9AtREfVQSqOelQvl1up6d\nJDpFtNssFOJMUUjnS//UCDGSWvrVOJbyzo9v0sgO2Ybt1kA1PiW9LrYNO0aF\nLmqnb7GMnUs7uGqdCzzUaD6BuepJXO6DtYGh/sDKRvK/INn/flxIsgEzOmQ+\nv7Nh\r\n=nh4a\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA+Xwe/wnHTcIvJs9T52LTM/n4wQ6y9p5C7wnI6VDtqGAiEA8ef6QGd0zQLY/xmB5enGJaUX4PegyENmhH/8ZgP4d8w="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.4.2_1580979742764_0.7847634540765376"},"_hasShrinkwrap":false},"1.4.2-next.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"1.4.2-next.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.0.1","@skypilot/toolchain":"^2.0.4"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![build](https://img.shields.io/github/workflow/status/skypilotcc/sugarbowl/Stable%20release?label=build)]()&nbsp;\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)&nbsp;\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)&nbsp;\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)  \n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n__Array functions__\n\n- `flatten`\n- `pickRandomItems`\n- `shuffle`\n- `toUniqueArray`\n\n__Date & time functions__\n\n- `isValidDate`\n- `sleep`\n\n__Filesystem functions__\n\n- `readPackageFile`\n\n__Higher-order functions__\n\n- `curry(fnToCurry: Function, ...args: any[]): Function`\n- `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n- `toMapFunction(...itemFns: Function[]): Function`\n\n__Number functions__\n\n- `isInteger(value: any): boolean`\n\n__Object functions__\n\n- `getOrDefault(obj: object, key: string, default: any)`\n- `isObject(value: any): boolean`\n- `swapKeysAndValues(obj: object): object`\n\n__String functions__\n<pre>\n<code>capitalizeAllWords(<em>stringToCapitalize: string</em>): <em>string</em></code>\n\n<code>capitalizeFirstWord(<em>stringToCapitalize: string</em>): <em>string</em></code>\n\n<code>computeHash(<em>stringToHash: string, length: Integer = 32</em>): <em>string</em></code>\n\n<code>countOccurrences(<em>str: string, substring: string</em>): <em>Integer</em></code>\n\n<code>digitsOnly(<em>stringToParse: string</em>): <em>string</em></code>\n\n<code>inflectByNumber(<em>howMany: number, singular: string, plural?: string</em>): <em>string</em></code>\n\n<code>inflectQuantity(<em>howMany: number, singular: string, plural?: string</em>): <em>string</em></code>\n\n<code>isEnclosed(<em>stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter</em>): <em>boolean</em></code>\n\n<code>nondigitsOnly(<em>stringToParse: string</em>): <em>string</em></code>\n\n<code>function parseEnclosed(<em>stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter</em>): <em>string</em></code>\n\n<code>removeExtraWhitespace(<em>str: string</em>): <em>string</em></code>\n\n<code>removeWhitespace(<em>str: string</em>): <em>string</em></code>\n\n<code>splitOnce(<em>stringToSplit: string, splitter: string</em>>): <em>string[]</em></code>\n\n<code>startsWith(<em>string: string, substring: string, startFromPosition: Integer = 0</em>): <em>boolean</em></code>\n</pre>\n\n__`String.prototype` wrappers__\n- `padEnd`\n- `padStart`\n- `toLowerCase`\n- `toUpperCase`\n- `trim`\n- `trimLeft`\n- `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.4.2-next.0","dist":{"shasum":"eb897fbec6359c86fa38bd0d18961264943b78dc","integrity":"sha512-n8wRmAD70SYgkDClnLW+T+t5zDN3k8xxqUAGhhrYe15qNNV0dAuhq/Ep979Q/UsVJ/o/E5su4rtqZPru4wtkNg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.4.2-next.0.tgz","fileCount":95,"unpackedSize":36241,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJePFI+CRA9TVsSAnZWagAAPA8P/1yGwtalya+JENjJG4cx\nCkuCzvlwplAh6UJ6dJdZRRpJoeL7MaqIwpuV01XxIdkNi7Ni2EzAgN3F+N4V\n2DPO8lbIRw131iU2cmqgmMHii7ttmXlynEuHZaNwxto90NRYDWKjSVm9kjvX\nFCkueENjbV8j+4oNViDIt3cAsnQ6Ad1jcbSXUx6f4QVo5/4bB8S9PIfOl3wE\n1EclOzTaMiP1jC4eDr//4tOO9PWJxcwI4WPGQVk02ybedr8ozDw9qKKJy8Nw\nc/xLAdmBD2VvZfx/FT41l9T/WIjDnSYTrCVpp8QjHflzLhAQnMZNd+7spCeS\niZOe23+HY1O7rED23X7fJ297vNAhu/+qx+07pbStcGyLVHrfh0FNaLljqFkF\nbFn9KVKS+i/4EFkSf6kTMmVWIN+OQ0FCFCNqlYQNjaCEcSUubFj9ICxjojmn\nwWydnjKjrejhXxCF6WFG4y+BmDpAY0YrlVbpM3V92KCQuCKQXmUnf/aRgcMj\nVbgyoho9dw9CWl6Qk0JgVbR9aWd5wFU4/XuojpEmkMbfPuZ64/o0fST1HHWc\nlfeRd1cE3nW9MTSUTAH3R6sy2gw+UBegJNRnjJqqNzrB2qgXGvNNFmG9UMdT\nUMROju7wtR+JFrxeIPJfjorgsyY6l6Jd6poCTQU1hhNmKPwPRqrxhCoE2J4W\nx2gp\r\n=hZuf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDZRC7YQvpshkFhxwN7rNOpeEew8CoM05jtQfGglhLAgwIgBqJeVye++Gd75MRLZPSN0VBiNEyNWG/lJ/2I/wUubIM="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.4.2-next.0_1581011517689_0.0015785742511398304"},"_hasShrinkwrap":false},"1.4.3":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"1.4.3","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.0.1","@skypilot/toolchain":"^2.0.4"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.4.3","dist":{"shasum":"e388117f32201d873778a701159f056357eb38d2","integrity":"sha512-ov2VPfsJuFOwIyfu9kqWXZOJgD4WO77MD0wt1YP+NfbGKR2aaX618V8AdDIwoEcT+fWXZ+qJ9/Icct6d8iLQaQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.4.3.tgz","fileCount":95,"unpackedSize":36439,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJePGCqCRA9TVsSAnZWagAATOAP/3XOJ7kuyr4jMrF02Bcb\nJ1rmiZZYpMU1OH/ZiMPE1O7CAfrIw4FoKqk3+PWBaxqK7iSVJ3UUi8DqZaJf\nM/6D33kNZDBIQGUQSx8A5BTHQiwIk7Mh9NBLelBd87X5NUS0bG8OXTB7hqtF\n7Qw4Ca15wi8mosNfAiIw3ym3WD05gtiJGCXKNHvWS0EULc+8lKcKDZo2e2GI\nxZnqGJ7TsusyA2i+rckIY+2JTvmEWF7o0StPIuCeCJvOZvxWU2Fo5dXMyhdn\nHxUyvpvOVfba9wDIU+9PgSNs9X3YEnkRqYhChSB1bhPEbdl1caEplgLQtPA0\ngzbPwneC2uueNyNvM6bTuZKyuEZxnrN4gdOcKsWDQckkYTHK33Y02c8R12VN\nykEGFJuy0qnB7jUmmUUKMk3REaXQdkZSbzF1zCwpefpeqP6JoiMJfLw6ZxIK\n4I375TgWumSPbgL80NEkw3l0F1kH6fEUFfezuJIOnFBkEqXyKuxvhrJb5hcV\n80qfAxOxLoaicYZ/4BFNuwwL0qaW5ufv8d9EaF/bn17Y3GmJmAsiLROexUSd\nI7t0SaKXKQz3CA5sPCRLyzLD7BN0z6vrJTNMm9UXPm3jL5TTgcvMB5cKjvjA\nY4rJ0JOJscAMj5f4G4W+/GsJuhAcS3kdGC1Kx15ulFUfEzAE8yC7XqgSuk4e\nzoo6\r\n=ghoR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCBDZbK82A4copDoU9nTkely6iP6Switk18xBa2jcYSiQIhAMRlEOGaMfZFsNDTgZH9tdOW8LgDuOLDIYnGFWJxJE9s"}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.4.3_1581015209674_0.21193384943088467"},"_hasShrinkwrap":false},"1.4.4-next.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"1.4.4-next.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.0.2","@skypilot/toolchain":"^2.1.3"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![build](https://img.shields.io/github/workflow/status/skypilotcc/sugarbowl/Stable%20release?label=build)]()&nbsp;\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)&nbsp;\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)&nbsp;\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)  \n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n__Array functions__\n\n- `flatten`\n- `pickRandomItems`\n- `shuffle`\n- `toUniqueArray`\n\n__Date & time functions__\n\n- `isValidDate`\n- `sleep`\n\n__Filesystem functions__\n\n- `readPackageFile`\n\n__Higher-order functions__\n\n- `curry(fnToCurry: Function, ...args: any[]): Function`\n- `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n- `toMapFunction(...itemFns: Function[]): Function`\n\n__Number functions__\n\n- `isInteger(value: any): boolean`\n\n__Object functions__\n\n- `getOrDefault(obj: object, key: string, default: any)`\n- `isObject(value: any): boolean`\n- `swapKeysAndValues(obj: object): object`\n\n__String functions__\n<pre>\n<code>capitalizeAllWords(<em>stringToCapitalize: string</em>): <em>string</em></code>\n\n<code>capitalizeFirstWord(<em>stringToCapitalize: string</em>): <em>string</em></code>\n\n<code>computeHash(<em>stringToHash: string, length: Integer = 32</em>): <em>string</em></code>\n\n<code>countOccurrences(<em>str: string, substring: string</em>): <em>Integer</em></code>\n\n<code>digitsOnly(<em>stringToParse: string</em>): <em>string</em></code>\n\n<code>inflectByNumber(<em>howMany: number, singular: string, plural?: string</em>): <em>string</em></code>\n\n<code>inflectQuantity(<em>howMany: number, singular: string, plural?: string</em>): <em>string</em></code>\n\n<code>isEnclosed(<em>stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter</em>): <em>boolean</em></code>\n\n<code>nondigitsOnly(<em>stringToParse: string</em>): <em>string</em></code>\n\n<code>function parseEnclosed(<em>stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter</em>): <em>string</em></code>\n\n<code>removeExtraWhitespace(<em>str: string</em>): <em>string</em></code>\n\n<code>removeWhitespace(<em>str: string</em>): <em>string</em></code>\n\n<code>splitOnce(<em>stringToSplit: string, splitter: string</em>>): <em>string[]</em></code>\n\n<code>startsWith(<em>string: string, substring: string, startFromPosition: Integer = 0</em>): <em>boolean</em></code>\n</pre>\n\n__`String.prototype` wrappers__\n- `padEnd`\n- `padStart`\n- `toLowerCase`\n- `toUpperCase`\n- `trim`\n- `trimLeft`\n- `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.4.4-next.0","dist":{"shasum":"8c5b7dba730835c9c30ad5fafebe9c562e6d1b2a","integrity":"sha512-5PQ9iagQBIxbNqSXAxL104tSLcYQ7FFrOi/Y0Sg8uAnHsYYvB8GZ1XcccXAeG9dyzyHNsXKGKnYGj8k2jmI4iA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.4.4-next.0.tgz","fileCount":95,"unpackedSize":36446,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJePIlSCRA9TVsSAnZWagAABCAP/iFCFsQAP/FNovIKhD4X\np/n+IotgZqjUUWqS08ysgn1KCUzBmWmqRZYcQVDQBu7LxoS3PYDXr9rjQA/W\nmUJCWrjfDNA91LQnwwth8dCx9L8GXfpwsFJcQckHvqWIQaXG9qcdiHEhHSb1\ns5sJ7uekzaLhuXnIgSqPZ4jXHe66eJpcVF3gxg9p4mEZlBkGf6RtUxOnxrPl\nSEcxf5FcLXHkvYmiRxHNl3UJYJc42ZJmCpvEkltu7ifq6qPfWupkaww9EWO8\nhfRPfmGsLuJ/55xwQU3FaQR3FSssAMOnh7TjA93B/x6PJiJQxdYsjHak2BlA\nAlLMwF+5b0b9uZlDRKqUVaNzkPX1cbjT13gXYDFV8Mi4tvLm0/vEZCSVhyeC\nQ/ot2gvHzR2pclrzRkikS8dkqGK7bNH3JNTLDSpMGVlV7fSYhBMwU49ePaAC\nTM0B6EtQxg08MjI+Ab6p4MbAkKsinzB2PNPoR+C8WZYXcVnAKmZ9NW5GfGRW\nB5LLbZEFkA48KvkvL3hy8xl0fz7yuGn2OZp6qk71MLS08VTiccKPKjSKjfkA\nEuh4sJU9MoV0A+CIN8E+ZXEEpbv0UpiA/IP/GSecfKCxdECqJVraFabj8r4+\nzWl9zk8pSIyw0j3oWB+8P1Jt136DCF6tjviwr8YIk6LVdLozeyWxUEkdFvOf\nWePJ\r\n=syFo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCEdIPW1PBK3iMzEBZ7zlKAxx6gHXgwPejj76DNOBc4DAIhAJs5y96WTA0SS7OjAP5QvY2dkLNKReclK1p7nHDdQfOh"}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.4.4-next.0_1581025618055_0.8146886277892516"},"_hasShrinkwrap":false},"1.4.4":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"1.4.4","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.0.2","@skypilot/toolchain":"^2.1.3"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.4.4","dist":{"shasum":"2c886b7bb8e1099927fa8d793b3230d12be1425b","integrity":"sha512-hIMvop/lFJSuTOiO1R9kOgTP5Agr9RQavKTUWBX7DAO4JLOOXCGOZb0at+4R959parsfPPgy2nvUfEwayis4xg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.4.4.tgz","fileCount":95,"unpackedSize":36644,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJePIo3CRA9TVsSAnZWagAAjRoP/AzsVPlfTISWq4ui9V/R\ne7965nnqO6lVrPtby6/gR3xcq8qFAv9bgTFyPSvSx4CC7MypxDaLnsK5J3yD\nH3TO7UHyvglgMklQ9dRc+KQrfkHu3gxqDj92ZBIn1T7jh7/vtj+wMe3dDaJz\n6CC8FOOha44esq8RUjDFs+Gkdw+9HYrJimEabPMJMcXNp0UYjNuPQbQKhwDB\nxUnUhNKDC3u+ESilWmHOH/Zh5SGKnyisgUAAXBHt3u3+oODSemAyS5kA0VcK\nrmG5vEIY3WffYi76GLwDYMcZ+rHPPz73Oo9IDUbTgmn8c3R/Ymd4d5IDUg4a\nCFIVD2OP8HQyswTKx0s1CixrOmlHmAUln2USYmYh+WsZGQzfAvulfK6wsrEd\nbc16FHZpV3PruKfoIu03dym17h2O0egLV/NEx6UlF97gjjS5EPY+OIUPTyfw\nAS9nhH4LlMQMvbUjf6QYkozcsB4Di27guaHF28hcqopVN5xX04yZKiwbQ53q\nXVc1IRb19ExmJEJfV8m5xKeMVkDd3Nhu4q/2AeWQ4ItRM8pwQRgsvmaLt0VX\n/8SaeEWAY5xeGVPzfdSQFXE9egUGsiybvDYr+wI+ihSQ5NEIaqF2VAyiBh00\nPlwrFanLLgEpaZhnOpwU0O6wSNlrdftjXdbzw9K+/FyJBan0ENS9tzaq8csK\nZOPR\r\n=BF9P\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCCSThtBrJpqyX9b1sjJ+8ltS/u0Ps1OtxqOxIp+4hAaAIhAMHrqnEsdEQQsnMpcQVEb4ZrAfDayX9gH0fOA/ng7ECV"}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.4.4_1581025846894_0.3783725235446025"},"_hasShrinkwrap":false},"1.4.5-beta.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"1.4.5-beta.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.0.5","@skypilot/toolchain":"^3.2.0"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![build](https://img.shields.io/github/workflow/status/skypilotcc/sugarbowl/Stable%20release?label=build)]()&nbsp;\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)&nbsp;\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)&nbsp;\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)  \n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n__Array functions__\n\n- `flatten`\n- `pickRandomItems`\n- `shuffle`\n- `toUniqueArray`\n\n__Date & time functions__\n\n- `isValidDate`\n- `sleep`\n\n__Filesystem functions__\n\n- `readPackageFile`\n\n__Higher-order functions__\n\n- `curry(fnToCurry: Function, ...args: any[]): Function`\n- `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n- `toMapFunction(...itemFns: Function[]): Function`\n\n__Number functions__\n\n- `isInteger(value: any): boolean`\n\n__Object functions__\n\n- `getOrDefault(obj: object, key: string, default: any)`\n- `isObject(value: any): boolean`\n- `swapKeysAndValues(obj: object): object`\n\n__String functions__\n<pre>\n<code>capitalizeAllWords(<em>stringToCapitalize: string</em>): <em>string</em></code>\n\n<code>capitalizeFirstWord(<em>stringToCapitalize: string</em>): <em>string</em></code>\n\n<code>computeHash(<em>stringToHash: string, length: Integer = 32</em>): <em>string</em></code>\n\n<code>countOccurrences(<em>str: string, substring: string</em>): <em>Integer</em></code>\n\n<code>digitsOnly(<em>stringToParse: string</em>): <em>string</em></code>\n\n<code>inflectByNumber(<em>howMany: number, singular: string, plural?: string</em>): <em>string</em></code>\n\n<code>inflectQuantity(<em>howMany: number, singular: string, plural?: string</em>): <em>string</em></code>\n\n<code>isEnclosed(<em>stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter</em>): <em>boolean</em></code>\n\n<code>nondigitsOnly(<em>stringToParse: string</em>): <em>string</em></code>\n\n<code>function parseEnclosed(<em>stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter</em>): <em>string</em></code>\n\n<code>removeExtraWhitespace(<em>str: string</em>): <em>string</em></code>\n\n<code>removeWhitespace(<em>str: string</em>): <em>string</em></code>\n\n<code>splitOnce(<em>stringToSplit: string, splitter: string</em>>): <em>string[]</em></code>\n\n<code>startsWith(<em>string: string, substring: string, startFromPosition: Integer = 0</em>): <em>boolean</em></code>\n</pre>\n\n__`String.prototype` wrappers__\n- `padEnd`\n- `padStart`\n- `toLowerCase`\n- `toUpperCase`\n- `trim`\n- `trimLeft`\n- `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.4.5-beta.0","dist":{"shasum":"089a500491215e11618450f1811df3c3c2c5261b","integrity":"sha512-N4S0zMPbvjI5/eI3HUet9QBHtQzEf6mjsrHgZX5hsq5YliLZ2gMOtcW/V3oJ/3Ca68wHRz/P0NCyCdAfQLxZFw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.4.5-beta.0.tgz","fileCount":95,"unpackedSize":36651,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeQTGXCRA9TVsSAnZWagAA+e0P/iBJyqE/z8HpJOZp7sef\nM5y9K7Yt3wmMZqlIGLXm+7nda9ycWU2Q+/Ot6W4wMSdM+x4Ega5TQ1ce4BlB\nezZFJYx6Un4OT1kxWtuOmAhB8gKC2WEQ1FmErEzkYKtFK6r1bKcFkW6sykhZ\nzPm2KiI8gAx6VKB8mJET0SrydIBrMr+3OubHSw/z+FkU4TNX8bQyNVwXEVmv\ndL70FEZh758Lzh7METqAYpSVYU+o2ciJHmWEjeYQYTAfydeyOwwaOBqQaDH4\noSmMWsI5Rc5ljgYgVSUJNGw6lem97nGvHFFGvYCvXLfoRtE0w5MRneYT9Rrj\nEBCLavPzXqYit6TWy7fSWmtTO2OH6bkImQNaOJFYRjPDcfHnyasVWks8aZdT\nDH58wR6WCv0cOQbde0C51uy4JvKEL7PCG1B0EK412JZVaGRNbqOSqYVcQe8e\nnGG8ME8/MCR/wbTi+fF1Vdh8vFriz02+8w9F/WenZD0fH2HcLqctLHIL5Wbw\ncQUbosfklGpXUdmTm1M2rPiihduL/Kzx9TUJpk20J/FGt8UCD5qDqvzlMxBO\nBR24ZF/T2D72Dho59N7+axLokMSMYuj+Rh335LK6nFmYKZTMwoPuTV2f2rfv\nJLS6zq6OOKl/KX13HQCKdhDbD6eqmblTP60sWab0ps3gLzPKkSDiakozEjdt\nPB1X\r\n=s6rz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCDdSh0VvfW2K23nVXrERo49ryiqx6v9CYyBYVfigpeiAIgVVHenmnsPsgd8aZ3Zb1czudkMKHkIAOcL1D7GONX7Sw="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.4.5-beta.0_1581330839387_0.5275297521595792"},"_hasShrinkwrap":false},"1.5.0-next.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"1.5.0-next.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.0.5","@skypilot/toolchain":"^3.2.0"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![build](https://img.shields.io/github/workflow/status/skypilotcc/sugarbowl/Stable%20release?label=build)]()&nbsp;\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)&nbsp;\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)&nbsp;\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)  \n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n__Array functions__\n\n- `flatten`\n- `pickRandomItems`\n- `shuffle`\n- `toUniqueArray`\n\n__Date & time functions__\n\n- `isValidDate`\n- `sleep`\n\n__Filesystem functions__\n\n- `findPackageFileDir`\n- `findUpTree`\n- `readPackageFile`\n- `writePackageFile`\n\n__Higher-order functions__\n\n- `curry(fnToCurry: Function, ...args: any[]): Function`\n- `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n- `toMapFunction(...itemFns: Function[]): Function`\n\n__Number functions__\n\n- `isInteger(value: any): boolean`\n\n__Object functions__\n\n- `getOrDefault(obj: object, key: string, default: any)`\n- `isObject(value: any): boolean`\n- `swapKeysAndValues(obj: object): object`\n\n__String functions__\n<pre>\n<code>capitalizeAllWords(<em>stringToCapitalize: string</em>): <em>string</em></code>\n\n<code>capitalizeFirstWord(<em>stringToCapitalize: string</em>): <em>string</em></code>\n\n<code>computeHash(<em>stringToHash: string, length: Integer = 32</em>): <em>string</em></code>\n\n<code>countOccurrences(<em>str: string, substring: string</em>): <em>Integer</em></code>\n\n<code>digitsOnly(<em>stringToParse: string</em>): <em>string</em></code>\n\n<code>inflectByNumber(<em>howMany: number, singular: string, plural?: string</em>): <em>string</em></code>\n\n<code>inflectQuantity(<em>howMany: number, singular: string, plural?: string</em>): <em>string</em></code>\n\n<code>isEnclosed(<em>stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter</em>): <em>boolean</em></code>\n\n<code>nondigitsOnly(<em>stringToParse: string</em>): <em>string</em></code>\n\n<code>function parseEnclosed(<em>stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter</em>): <em>string</em></code>\n\n<code>removeExtraWhitespace(<em>str: string</em>): <em>string</em></code>\n\n<code>removeWhitespace(<em>str: string</em>): <em>string</em></code>\n\n<code>splitOnce(<em>stringToSplit: string, splitter: string</em>>): <em>string[]</em></code>\n\n<code>startsWith(<em>string: string, substring: string, startFromPosition: Integer = 0</em>): <em>boolean</em></code>\n</pre>\n\n__`String.prototype` wrappers__\n- `padEnd`\n- `padStart`\n- `toLowerCase`\n- `toUpperCase`\n- `trim`\n- `trimLeft`\n- `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.5.0-next.0","dist":{"shasum":"bb1d5ad23ae57c91ca9d94a3877d9e9eaa8ad9d8","integrity":"sha512-4X91bHUBBpuBliio2uAdKMaOMI4SywPuPh8JVdtpyJbJc11pwKsbagWs7cNOgYxjeItm04zx5Guoy8tnWOoi7w==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.5.0-next.0.tgz","fileCount":101,"unpackedSize":41329,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeQgBVCRA9TVsSAnZWagAA/xwP/09P26S/xjXap1QwIpvS\n7MAJLW6oW0G1rYyLERvZbya2jbDRioOqqKbebEdCJFGD9qflVz34EM2hgJLF\nGhWo9+i82WN6qLwDSs3ArJOEu+HaBL8zrEe2YNncOFv61AX5/GGZQ7m157sU\npcDqq6bwU6XwcOHJYM2FsuYB9ZThCWXR9ABY13XLlmVOZN7ItMWoCuCO/pPU\nhV+IB/B8A1+xslRITy6m5yfJMQP3EjY6fszqyDiOA9lRomoxIjOZzJuz2bqz\n8RfOrdDIBgI4lDMxvAolbWo868nCIkbQafeAGFS8MnDVdwOGx6856+re3ob8\nsCNKiOSFNT0opl9Q4dGa4mnrBe2F9zO3/W06cZl9+p0/4547HCEQ7ZPDHR99\nloppuP4Ysw/ew/bQaLFlpLu/AuQusYHUl2ZMDYufLGkBX0UrPK7K6TNjFvRM\nUUZnMYmz4jgc1FlH3AfWaeWYhOiCP3IR15HETu8dbg0+HuBQ0qVEs/NXSC79\n8+7oA6O5uRQVSwPhByg0kYoK+YLNlcqpRnrV1Z1JFMSxc8dwX2IoRp3cHwkT\n9iQw5eQIpliVjiE8IYRA7Dx6/iX5Zy9uZx8VyVhh6gOHEFYxCy4v6lDowJmb\n5rUuT+IuANuONP0QikEbMh8uRM84cErZrW/XLzKP6mX1YKCXU00lFzdhUr0I\n8bqf\r\n=g8am\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDI+CX/g4aAQBvdJvXJOY7t3eu2HrNxjUvLr3Io/wwGTwIgGgTrpQnWzfA/vpv9hD1hs8yY6+2J1PB4PvPclXtXkVQ="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.5.0-next.0_1581383765054_0.16978541763715516"},"_hasShrinkwrap":false},"1.5.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"1.5.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.0.5","@skypilot/toolchain":"^3.2.0"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.5.0","dist":{"shasum":"32f728aef22e4614ec6674e2f799107a22134557","integrity":"sha512-jnCIjF6CCy2tPRXtRurgPnqr8YcWHw6zKtb8imtbU+rF37knWAsk7nP9zcS+0coG1QvemjWetDzNXl6glNgI1g==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.5.0.tgz","fileCount":101,"unpackedSize":41909,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeQgDaCRA9TVsSAnZWagAAPhYQAJQxVzIwnAsPa75Dc6iH\n7d4Al7nsQ1/trXAuXMnMeYM7Qt9zbn/jT9FgEm/CCEsdqTVH1BHeKGyRH5hr\nmwmQMH1ydOwbwkE6ZJNStx4XSPTAxgqgYVGBtNtm1e+ePocu6H0+oNmE73xZ\n8eAxLLA0QVOy6Yz2HqOoKLc8bIsxMCRK8dJ1if2VGoY12DanU8BP1mZmzJNv\nHl0z6W30fw8FeTfzzT6DLOAYs+Go0+gG5hMTQakYm5pqQHuCN7p7rubik7UB\nflgoc5Na2PEFjBguIff7pRbwfYojqFoTJn1FrqCAgXJenLeMaKErCMNabZdO\nGVDWS5MIyXXWZCPlPVej/FwRaPRQa3ZggH6twbgjPdQg+NRcD8Cyw2PJKC91\n6vtlziHiqwppGMhgC+v5kTSTwOsk64/nKaZbSV5e2qSLG9f6vnw7KDdatk2Z\nTEaaVTNEl1j2xGy50sDP57QeMsAhnubJJthptDdtthYzwVUWzLc5uCWUMvYh\nRHQGjLS5kAgL+us4Mlq/DRsuH+lMNcHR/GmPbFGO57M9oFjA8ORmAA9ukAak\n37iRuovkKJuEhFC3v0UOP5EgDgDEI/LJfMzQ4Fk1icQLIDKoEPZcxyzEnWGw\n1u464XyjaZPtcNABLykIOZrOXC5h8X04aRxUIkpBvL5MTK3UvWCPync/cHti\nOC+i\r\n=PbFH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAHhyTYsbsnYxX0CP8DkcH95tt6nlxnGmlP5WVq9OgnDAiEA2YRWsJv2Q1raOZ6OwWWlDmhP2iBVMzyGYi9tSRNnfwI="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.5.0_1581383897985_0.14143765145749443"},"_hasShrinkwrap":false},"1.5.1-next.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"1.5.1-next.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.4.0","@skypilot/toolchain":"^3.5.2"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilotcc/sugarbowl/Stable%20release?label=stable%20build)  \n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilotcc/sugarbowl/Prerelease?branch=next&label=next%20build)  \n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n### Array functions\n\n-   `flatten`\n-   `pickRandomItems`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string</code>`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `function parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.5.1-next.0","dist":{"shasum":"c28777e9ae98e9bed3465d4116f70181e47448a0","integrity":"sha512-wBOJ1nRiOKdbcn2aYadb1unVTSbppO2wF2VWORQHlmTOnjqzHBFULhBxgRNQVIovyypcG3rCrm+hN8IqUGgpvg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.5.1-next.0.tgz","fileCount":101,"unpackedSize":41873,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeaa0XCRA9TVsSAnZWagAARnQP/3d65JDM+3xRRKCDKVme\n4pJ+N/9O+yey0vgDNS1K+rZ+lh6/c0n/jktbKNxihQ0kWTB6xwRn+0RJa2Mg\nTtj5UnDq8kNeCLOBOm3UpQGj6Zvc5lM0wh/3jL8wfDEYw2W7NOsUU5ok8J8F\ne8SBz9BxZ89sBZsrn1552IrXfoJ7P2UHhGBB5w8F1/WR0CC3GYR2q4AQdLCv\nZokb/trO/VtkL9XP+c/9Wj6kcZOWoFeHQPCFQPLFT8N0H2zY5nULWccWKVuT\nlybzKFSW4Bl24AyiKP/QAPVKnIXAdJmivkpRSfWw537dYdch4i/B4Umj2+pe\nzZPOzxUTROyiStJwL809vf/Akge2fjGq1SR1BY6Y+4c4dyQrkgHCnI5z0vXk\nFf4rfqI2Rxzr1J5XPNIV/NSaIkgk8ZfOTlQZuNwD9AqUmgD5/v3/mjQ4HbmI\n+cS2QlYzwkErKw72jCqlV91bW/8/UNXDmipIY2HJ+ii1iN2HYQKazYa0xrTb\nqNErmkJ16IkhHTHl1XsfTHr3agtEUSYXxC1OJf9CPNiuDY7g0mNjkBkyzSpG\nmLEFxBII2MRgmBiry+w6T4B07D8zZlxS+oirDTNFv2ePxZIPHicaTgRyG98s\nMl3pVziBDpZy6Um2FUQx+XL6sqghr9cpbK4HJ2R3oT94rNwr05AalOmBn1xy\nCon0\r\n=Uyna\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICejtJ1Hg0otao2AR7gkrB/AkNpVuHkENW6h6UtoFa74AiBaInlgVyi79jADaEhAERCOWv/77kTUD+mtMjynlxBqDw=="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.5.1-next.0_1583983895018_0.5710965688102718"},"_hasShrinkwrap":false},"1.5.1":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"1.5.1","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.4.0","@skypilot/toolchain":"^3.5.2"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.5.1","dist":{"shasum":"75c5669919507fdf17cba4c8c0c58b24da7d0302","integrity":"sha512-by1X+zt7RgtlCSFplmKOBfVrPwcbgqvXFDWHsuVJDt51GvC6jsn+fmz139YurAcjB5bzyCqnIDZAzaJT0kOpTA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.5.1.tgz","fileCount":101,"unpackedSize":41841,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeabFxCRA9TVsSAnZWagAAaF4QAJaLKj+k1/1CZnuT3ATU\n2+/HE33MP8dcMTEXE18H5/dg/M+ScNim+ljACGl28rbcDlUsC9jHfrLlmxRz\nXVUQ0Ggp4MV6/aZB5jeZ3ePqMCHffTsYExaQU9/TQzYac7nHz4eSIaMyWrBm\nXqZbanYz/gJaJTZtCar2rau45lBu5po6wLqlzZ/bP+FD4VIHVfVYWqlk8FD1\n+1/Bt1J34P+w3zT8qiQSAavKY8YOzDK5WhArQNItHzk8ThvGT5+1ewKwfJfu\n9jvH+DhcKMTUKsQrFEvfnDHnSS5O5SVR7tbW1u+3P9LNnLV87HWUfNUTMKob\n3C+U7EQw5blwItai2/aHp4Gm+vGaqkSVsuEJpMuPPJ6ah24qV8IjWk4i/ctu\ni2et3HII8HCqRch/RBVxoIal3GM4S+4I3IRV8oJ7ZlDnz5vYJsHdFzHNmkbJ\ncRWk7YQsDaN/caDlo1sm7BxeYLZzpSswMrLD8cRFMcs7o4L+qUhbJrBkdhul\nV9jMB8bD9CieMQYOtRFFgUBIS+B+C2q5SzMaocU/l4CfrcpzSUzFQAegXIYT\ny+atorRk/GEWOPVKqC2CZYUjk/QvbwpUGxG7UzHZVQhaeKrivJl/F4MlsB9t\necdnU9tbwX5M6ZplmVWK9srAC2GDF6h4jBC2hkhL49lSRWAhA/HPP3knqS1R\nQM6U\r\n=27lB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCQuGDgHU3apkgttmsh0YaI8I7XqVaYLism16FVXDt5fQIhAILaFVahh191rXNXNXbO1G3vVhVRcdrjENRsY9QrT5P3"}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.5.1_1583985008866_0.9816539388563001"},"_hasShrinkwrap":false},"1.5.2-next.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"1.5.2-next.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.4.0","@skypilot/toolchain":"^3.5.2"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilotcc/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilotcc/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `pickRandomItems`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string</code>`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `function parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.5.2-next.0","dist":{"shasum":"2ae4e1d2efe1dbc36ba921e59fc193e7fa7c5a51","integrity":"sha512-+DIa35+PLoe603Q5ptFeorFv11//vFDA/KzH5gv2DTdPFa4llpW/z8nXPbjiUpHqT4hdfX8BiIISYY2P+ylWwg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.5.2-next.0.tgz","fileCount":101,"unpackedSize":41860,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJebQVnCRA9TVsSAnZWagAAHGQP/3NbZsDhccvp3djXGrG4\n07milnNDYqW4Wc+p7DIZJ/h0v3/5fPV9YSOG4r0owLkqP1vQFDGD9DSF6EQC\nP2JY4nFKdgWIkWRNE3HRBWo5tT4vwPGpSa6yjEnOvw8BiHseblRXtdgWEsQB\nPRIXq+rKgukVIlpPXBGdK2ISVdzCyLDyOT3OeQhwfTJDGFhWChObVN4bv/s/\n8o79TGD/qG+vG2yxZoFzIMdR0rBZjewk7OxIIqt8cERx4fmy/Toyi7qQDl4S\n0HN7puja0u2apii/+Nv3HmYxWaCl85me4HwKhUSrH9PIIVkINg2JLmq5qYuV\nEtr9Jk+7p5GuKFVCsGiPlw+sOfOoq4vEuUFKFbG/CmiLyJVVlKCJPQlCXasi\nCLsiGHRtTKrKM6R2tZcQYHlXPg5om9TsxwEKjMxzZQMDUL8Nvat0Dcsn+vhq\ne3zJ4qmzFvYSykAvrg4Ytknwso5IwcsAUtVj5+Dl1oFZiKiSpZJlLk7bPq4R\nAgsUiX8WTePBOARVZHqD6hPO/60+N9X5iVzuD9SGvvXR8HoNRy1i3eiwyCOM\nEaThGaEgUCCy7If870+KDDSqATSWldQz+hHs/wUAMIJ7w5cUh95RHfAtRHKw\nz0o48U+o1V86AR6mYYYbeD/fxbnvNHTZMuRl8CLnd63MUyDuWvtiCYfbkfEl\n/CPu\r\n=4eiJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDdK0FztqYN63UHSaATq70PupJUfBXBTLcF0r0er45W1AIgD+300VZp1oxm/SDXjc/H3n/qSz1yEv2NyCwVlkClhvY="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.5.2-next.0_1584203110792_0.9535773721587597"},"_hasShrinkwrap":false},"1.5.2-next.1":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"1.5.2-next.1","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.4.2","@skypilot/toolchain":"^3.5.4"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilotcc/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilotcc/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `pickRandomItems`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string</code>`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `function parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.5.2-next.1","dist":{"shasum":"3fece9dfc3df5794a84d80e1dac782e033f9aa74","integrity":"sha512-pMTvuI+uYQER2FCnGj9BXWxvXPob230FZx0UHQ/YYB8PYi4vfHdBOY641/yA2QeR1eyreq6YUmHdA66aCfDGuA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.5.2-next.1.tgz","fileCount":101,"unpackedSize":41860,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJebQXHCRA9TVsSAnZWagAAdokP/0kF3UcZ0L6s4AcYXqn4\noMGtOdAxACN0w+D3J+UvqL17swZ0sM467zj0P1mnVrVrMDBPqfbQ7+dCRqkL\n74RtbO5a3Bt7Bg/RFM9Z2U9s8czqAslS7DeoEshHbDfEnNL2huBp3KxjlNgZ\nZ/yrXIw1VLC7LqCVLfT6/LUlJTKzfIBuAUTXlNbvOP1lfishLLngFm1bvHU/\nOK6JWTh7e9SZAHueRNWRZswoKYtLmu3Xfw6IXdw0m7LYnhi5KEYDAjywDMrJ\nqaA+ccUHTCTBvZEGlUrUwKFkz3x1gI5Mu09pxYYJg1Vyx1rO5s6kdk5wyMp7\nkWifyKHkk2fEVijsyNjRebul0X6zD2j2VCQmeq23BwC6ehohxIY3NrOs+DBu\nCOk6FjX0rFE2Csk6jSqkwhkgULWAUr8BWK/gUtOzPr3OiJF5DGa8GNxJ/nf3\nrmF1FaZLjRych/x5PPSwYEiEvzIFssXrsmrX/7h0PNjOdR9su4FqqbKTUw5i\npfit0eMZ7fct4fcr/4uN4tTZOJ2DcIgq0nnSFpSc8qZ1tSvM7P/bZ9Ggagf4\nzWQ73PQay91FXvuqLXrDSKOwlf62noeyHhYiY/91tAYwfoXo50AYvPogYByg\nc56iQ9VnyLfugNYDbuJl+shznkHhfqr8CfALwPixr5bAV7OSJj3mX3/ouck4\ne7OB\r\n=QdAw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD/8KHc86jzkmJ7DY30Qpg5i83M6UVgP9B2+hGdGtQifQIhAItr04vqh2jhfPDZ/hjP7nlcZb4Qcu68JEB9X/IeRyAw"}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.5.2-next.1_1584203206394_0.1780404752078968"},"_hasShrinkwrap":false},"1.5.2":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"1.5.2","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.4.2","@skypilot/toolchain":"^3.5.4"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.5.2","dist":{"shasum":"9540b5a222e5792200650051d2d5bc31dfc42289","integrity":"sha512-7sS8BF1Bxi04WhgkU8kM9UIwYMbQHpDByQU8gEQdrzDR1xkGJHRjaumZ/0tzlvdcpFbCZ41eFbQJALMk1Z28yg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.5.2.tgz","fileCount":101,"unpackedSize":42065,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJebQZMCRA9TVsSAnZWagAANmEP/Ay5u1ZCPEXUw4+gE6AS\n+seOtI9oJkO7+MpMWhUfBEAwr4WL1fHu9GwQyTG7PAEz3rn5Eb1qmGxs26z7\nLtEy4fN+5nV8EVFRBJ1UqZ3U8F889pR9mMTNX1zZOHtjxk7y/2oO+8xpBOjx\n6w1magvFiWNL/CkdyaU2kJC3bkITi3JwvZsQr7/6PNUGUrCR9uxD9GT68IwB\n1+napfAWQap3rzQmiRvuRZEcBxJvfxCcATi31HBW68EtyupjoQHdwdKqhmWI\nr0vPLwutOQwolBlTBNhIViPbpW7IM6/DbLxCOtM7rA5z+Yd0LphEH+SsvqPA\nIqSspatdl/xZiPU2jQIY/dugZpj664APC3uMTDoq/vKh/iPTJE21eUQRxk6t\nmKFh7Q0hINYSEku5KfL3H3Ell5L0x3IIbgj0p8Q3ub4GmX9wMcS3F33nBqZv\nYRoXPb+L0pPHXJXy3VErJhE4zpRqGcW2/K6EEfPmqVO51/0MzZ31A/fSP6K6\nOSEVCRMBj7m9UEPColNiBMbsoFOJOQMODlNDIgpRZxaLBpcud+cYXuT2YSy9\noqglDMTTCG72c9v0Z8GRinw2uWjFszQl+wAxPYNUGjtlNfwZOqA9Fgsxfe29\ncWScex8BoCg5TOVRJ5R7pgr+FVH6QcnWeHl/E1eK9EOLDMnD0uorAASNrehL\nTZfc\r\n=nJMj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD/fUou3Wbr3dDe4cfIp2tOw6htCXYibpt5776pdsz/aAIhAOZEhVHa0IHEJpVtonYcmbf12wjwSNcbVKcgORjq8Jl5"}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.5.2_1584203339629_0.24407425115108583"},"_hasShrinkwrap":false},"1.6.0-next.0":{"name":"@skypilot/sugarbowl","version":"1.6.0-next.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilotcc/sugarbowl#readme","bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.4.5","@skypilot/toolchain":"^3.5.11"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilotcc/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilotcc/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `omitSequentialDuplicateItems`\n-   `pickRandomItems`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitUndefinedEntries(obj: object): object`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string</code>`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `function parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.6.0-next.0","dist":{"shasum":"488581795a83e05b8bc2dcc348ceca09a3dad0ff","integrity":"sha512-JP+RwatWY9zs90MBjG1adB60g7WwyO+7p6DCpMMvFbdG6pgoxaWWvhk7U9gin9hyM3O/70jLF6SygCzMIp9Jog==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.6.0-next.0.tgz","fileCount":105,"unpackedSize":44829,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJefoPXCRA9TVsSAnZWagAAnZoQAIc76IAalC7H34YifRRk\nfMHRRjIBYJxnIxuyORzVT/rrEKraHJVVmKFRiaRZPq62/znOGZjQGAwibMmX\nZrufkKffIjEFMjjlDCkA7KTiRkeh9Op7wu+Yd8khuiL7v2cgxRKXt14NRRX4\nlqkGam6Ycwo5ohkLxEou4AlZeJnbkpd53awcINwzNn8lutnDNrWEnqQnhmo6\nxRep26Y8/BNiK4V11nkAVej6KzMbQIDmRdIslz8+qaiiCK7aD+ZCdcJH4oIH\n/qMAl/3AllKOdWUWjaNrOWlQ2UbNIKUujd6WFGG0T4pTDTfhobHV4eH8oD81\ntKlbCN4mzMQfFbdf8yqc3hMXO27xtW4RrKbLg3qNZVhjVaZul+wi4bZ3E3+V\nsHuzlJVNrzbLiI5PmkU6c0v2qQpd6BM+Hm5/q9j5Vds1WSi615b/zkYs0TaW\nTC1q/2ILEeJs7TgoQ4GJuC9TZALAVzzYlhnlrp0e0pp5WWza/0jD/FZe3f2S\nfmffqC8EhKYk+SrPQN+BQv7SnkL7Cc9G8wcIxy1vybbzAp9hOL8SC0CFQriO\nQmyeJUv0ZBtNwQ0mMw0Ya3ajUVMIO/NN94Ed1mKz3nhzG3veDkuMTDzBTpju\nB6WKMlToulIf/O3SNUvH1zVVsl70EzGpyl5iaqvfVH5tcRIXpzHSKbTUtCes\nbUOL\r\n=BCW8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG1RJGjMx+by214O3Vfb5tpzad1ywIRQwIvJLD0B32hEAiBcJjQhiq0XEkfLh/Noq1SEZblBuhLuxVBagMbJfm9LNQ=="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.6.0-next.0_1585349591059_0.05327677391273977"},"_hasShrinkwrap":false},"1.6.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"1.6.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.4.5","@skypilot/toolchain":"^3.5.11"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.6.0","dist":{"shasum":"9555888c3eef6594a8c56043a7ee5f14aa034e56","integrity":"sha512-2sTbPeK4nbY3OABWwiMk1I67ifz2Nw3rK0ql/hd0ZfS/wWRqGFSe1YixxPjVAyCuIGk0vaDSUcsvaYaX4khYDw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.6.0.tgz","fileCount":105,"unpackedSize":45362,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJefoTkCRA9TVsSAnZWagAA8zUP/3qirbACCUafuLk28kCG\nOpyTxHjHrLGMEsxNhpIfgahEULsQ4QF6pCgr4IDiUqAGDS3/+1p6Z2OXtxjK\nTVElqvapZZ+zPAQc8E6i6S6nxIjgEx1gfgybSMkA8FJCSNkEyw2gFTtDIcZE\ng9DdqxTChkLaGrjhU0bSebNs590dsKD+IFGu11cyik/jAxV5FeDr/Isxl7H0\ngmhxmd/7FZGrCKrJE6bU1B5PX7iOLEcm27+BpFGPphlydNPOYRtBppnwldpT\nuVz2VUECS7wOw4nKkfNwRNm/3hs+Z4ipVeCqj6IV64b0kVm2Pgs1R+wdC8q6\nWFCiJNKbkvh8hmY7fTQQhIZReKzBsBoeBWdcubFLcwunm0Lt0Vx0eEeoy/lR\npNlLxypmp+I86dAtEm//ZunOF5QDUC3kFVT2eZxqh2IryZdllmWuOrGDRTTV\nf2iAW5d3r2lEhlA8CBQEAlizEG5+MwKXMBxcAadIsNcPO1F+sR1+uJp5Hkle\ndTXjobLrwoubT+ydoXdj6YdFnhVguzXax46VUvsRgIEX+7n2sI3q7M+EKSgT\n99c7skFHTaaWebUw5LDiTn2wED00Pgl8Q0YT5YgHR2YwFECksHnX6EPNrEhN\nzSAzk+E5Pa6gkop8BM+j4XTtvEAp8d8Sb8wGhPaYbvTNvOJ09SoxxfY9TFQ/\nwH/W\r\n=md3e\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFydGWmTAQ6nv6cU+iv8GXSeV5oN/ouAnNGgtqm2S6/kAiEA7yfl/hJFZ2NETgdAlDF7dN/2gxe0QBNzAQ+oYhVMpVg="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.6.0_1585349859814_0.48372780544764393"},"_hasShrinkwrap":false},"1.7.0-next.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"1.7.0-next.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.5.0","@skypilot/toolchain":"^3.5.13"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilotcc/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilotcc/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `omitSequentialDuplicateItems`\n-   `pickRandomItems`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string</code>`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `function parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.7.0-next.0","dist":{"shasum":"95d7555143d983fa36dd7e1f5c8faedf4b84076b","integrity":"sha512-+jVIwu+qnmROeyEFWWsn4tcRrprzTecwv8jqrvTQwLG2+5rkeRTx6dPEeZXYU8cG3P8A7d6y50iGOGeqpftfgA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.7.0-next.0.tgz","fileCount":107,"unpackedSize":47250,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeieL3CRA9TVsSAnZWagAAbBwP/RI/9Gy44V7oQQ8gwvja\nL1cHD/HJcAfAY74ZeOH6pFOW0vTnwhV/SsywCdhaiamhra/OoJxuetwDMjyr\nhpKmJpKnq0X79HJ+dC9XaqoHSaT9K9gQQ0awQ2KWEiYN/pMrZ2gJIj8SUhND\nSvl/9TRj+8mJ41xY9YMvhmEZ6roG6YmuD+Chzv118SlI800hTGUHIZHLCwL8\nRuXYCURYKZSatZ6n91jNCMlZnRXsb89GQxrTmG0n3XpLb96CO6U/M++w+EzF\nKQQ4bvjhQDXfIPJRzDfNiIXpgD8GjcReltJk8w+MbPAeu+q6ppvKXJSeIIKx\nSkifEqjwxR23Qrofbqpqf57CLd1sno5OgBECfN9RI9LHVuUlT/PDRi3eqE+w\n3/RhfXcApXYBr7EhU7fT54i3ql23uDqRZh3cY+C+UAMw2dOFcoU4UdefGoSz\n+lzys6C9kfCU/Bo6iI7ze9uRr7B3wgwD2GPgdyZ7Lc9NVkF0paBCLlgoO2e6\nJ+pwl13YbeV0z/UVpDlRVje9F9qZnftKBRBR/jrmtH8lIrua5VT6fLfzOBuO\nBpyVCWr2xLnMOkC/o/kTnKQPqx7wmZmLU10O9rJaD/KYi5Dhaivoqf5wKnQg\nMsqI4X3WejLiNjuevh8dpS+3cYrr06tv3jKsgMBRb0cAppkJuRFMoCnfLJHV\nseq2\r\n=1h2g\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDncdwyvKTot4ZlYZGZa7KGWzTGQihY0s6y9UOShEe9/wIgNhVUJ2WD7hFoJSM124G/Hwl0Gzzw7E2WVyVr+STuvQo="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.7.0-next.0_1586094838615_0.1401017436891121"},"_hasShrinkwrap":false},"1.7.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"1.7.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.5.0","@skypilot/toolchain":"^3.5.13"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.7.0","dist":{"shasum":"27e966c33cc6a8812468e6a9f87b0faec6b85a90","integrity":"sha512-Gwyksx9IvBv83TSjjw8J9IGM9HhLV96+DhiHgktG30XDveZWgDSWVH9JDGkZl1KfvHjOABAIoz1rsYr2nHcG7A==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.7.0.tgz","fileCount":107,"unpackedSize":47623,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeiePRCRA9TVsSAnZWagAABdwP/04AuKDIULQzG2zVJrM+\nXN3I41DRWJTUel371tNkcLtSnNaOVvoCiDwki9zAXaiVS0RcmT00qPmn4t3q\n/qjWpSaRBC+M0uEMToF77yyPKYMvhfZxSjyfebdxIqTAE9cp+p9Gam68XE4x\nDA7qyviZ5ihMXhjLt6Yq8hm8wxV6tinu1pk7v0p6gHemf5bwa0IqFvYNqnDx\nkeBisbjhMWHLj8noEkr6No0Vk1JFHgRHFX9DQI1K1fqUNIdYhClL2Bav8L0z\n6+EyuzJ7RXg23eVAcT55donXd4bUerK9NVh2GTZs7U517IwxHYfKmsTAoVe0\n4p7nB49YjywdaDSYSWhg0udAxAXe9yXAjCI0NaKA39F4KH8N4uh2rKhPe+K9\nxIxnl/hL1N5d2LAGfIU9RRAj3TC0/MqERhLQtht5PIGLDLqZ6b8ZJPpqg3XA\nuDGpIvkE/rz/fjhDLFwt7+9Oox0UZ5FxUjNM6wSSrXb+0Sx+M0vPlTqQAl6g\nkf+KCA8Ceo02Nt8lWkq7qGtDZjoivXGYR5x8jbSJALjQh0FbqZLy2Wj8grKD\nJ8l1uqWgkyMMhHgdJ/l8Ba6okZP+x2hDTjAVWevzYnt5W9Ys2LnlRL696Wsr\nAXbNaq+KbVsWsvtP0Rk16SAu65BGpXZjARl4q3WDn21JJ0ybmAlfjVm1U/LN\nbfBJ\r\n=OR8E\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHhyKc4XDGMZ7riRmcKogXiG3kFdhfbBcpH+Am5vac4mAiANWeSVg5qcJQI60A+PP+QM0YtYWPEkDPetuwYzwRkVcg=="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.7.0_1586095056847_0.07732958009170687"},"_hasShrinkwrap":false},"1.7.1-next.0":{"name":"@skypilot/sugarbowl","version":"1.7.1-next.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilotcc/sugarbowl#readme","bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.5.0","@skypilot/toolchain":"^3.6.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilotcc/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilotcc/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `omitSequentialDuplicateItems`\n-   `pickRandomItems`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string</code>`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `function parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.7.1-next.0","dist":{"shasum":"3146933c88aeeb8eb76fa6540262d7e612800066","integrity":"sha512-l1JtUGtP0SGABM9MKSvZ51TvQvE2Oooktaz7LGidujcDVPfPr6MCqVur9QgHeCJzq6GtCD++GbnIVrprtG1HLQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.7.1-next.0.tgz","fileCount":107,"unpackedSize":47629,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJem8cpCRA9TVsSAnZWagAA+AkP/jTriC+0OAAmAXjbNn/1\nT6jE/bdWd+HKr6RLn76IJoL4V627n4mjlWAnw1NEQScbZXhA5Bh/l0vX0LIm\nJ97+TfHQPgKM0QKCw6cuNSF7dYma9MqSNbbV7qLWGmLDHUJeXv4giBdnSmUw\nL5mo+XwkLmlA6X9UaX4bicBcFhNUXOhwYeFUUzMUT+rJ1wYig/VLu/VauhwI\n7tBFWazD8XY0m298mW0W6EUyTsqGIoD2gyKCy7pV5+RcpsoacpP9bwacsa2u\nZ8uaI8ershDwPIAK61K7A6SrkQdg1e6su9bV8A3eq0O6E7GtioevOWqmh6nv\n7TmJmwrRdLOGNKTDtP2b6R8To/Y3OO9jpBdvS3Oa8t3NWyhbwLydMr1nxCYv\n0UC3T0fSdBMaI1gVOCLGc4ELpyBBmf3g23MWkHjoCrhW46AKkM6kALoMh0df\nDFtlCVYDq3eTdo4s7wDZI1t+IgKsVhNaCZlWQGVrDR43Gc/YBVTOacOBMCrC\n/56bO4Jro3CpMVAjiwuIsKHCqU2S2MBmyzyEuqNptQi0Uq/iQB8rx0AMODnP\nPDhyc3yj2Z94qI6vm716p087f0YUTyHHXB/DmUi4dRSHlKicQbg621z0QDv1\naWzi+PGkizxDSxlq5p3SjDNkz6LvopGgyUpKPgWo71UupEYKsOq+JC3rGFud\nXcvh\r\n=eUC4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDUgZeLj50B5aGjG8D50UfwqLpgALwP71pNFR18I6yEzAiBnq0EUVjU2MGz1eTBFjfM0PLCLy+BUi/nyw7wZ1Ymbsg=="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.7.1-next.0_1587267368481_0.45401899661999967"},"_hasShrinkwrap":false},"1.7.1":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilotcc/sugarbowl#readme","version":"1.7.1","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilotcc/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilotcc/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.5.0","@skypilot/toolchain":"^3.6.0"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.7.1","dist":{"shasum":"e40bffc5181efa06db7f7576acc01cbddb6a0e51","integrity":"sha512-3XkhUZwMdT2XsId6CI3vniXEhb0a84FHHRG10FhDppUcyaTXGi4ETLrrqmThBOcNOK1jcwGJqHhXHlW07YOuBg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.7.1.tgz","fileCount":107,"unpackedSize":47827,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJem8yYCRA9TVsSAnZWagAAbS0P/3D/Ink4BsVM/B+FOhDL\nL/IPuzSIbJH3nuecZ87rPx3SrK8uTWVJAhXbH28iNVJLWzJx9d5FJZSHa/D7\nEndyvWm4VwBur6hpL2mrHLAsqUaozQlq9n2aomQ0/JwtuYdmMQtfHKUqsh1m\nYhH5PApv7675vPh9DCiiVoQ5be8i5WVPXgwYdcwpJ324LUZJDGG9NeH+8DMA\nUaG5NYtQc7NxMUGvhTseE8GjIphQgsEUNSevsEl/tRwlt+d1osby/kbHK/Cb\nWZQEdiW+U1mFmEXUUlmHotxerLu5nIgPd+PhLdZupm/Yy6PbdsVQs8R4GfsF\nc9D2prS6h21078pNv8J3ZyhXmTD6lgUEslvU7GqRioOq/PT6BTlqohz6m8gw\neEiuQnHld/ulHwJP2IyivhBCcBIuh/QKt3aJgWLcfj6G9dTjRO4bC4Lt6XVn\n0vCyvvPdtzqPxKeGtQpuR2mYPyCXREzb8o/usS8T4XIMmuAXAuex/7JcJdS/\nUTbQqaUPY16BJTync1o6y13Jriew8P4y+h+hHSNw1kj+yhW2Bt57MdptxXTz\nofys65vmLKVy9yjH2mJPXeUB8NjOoKCcAVv9qMLE54w+6rPNHdYGOCyL8gDL\nLIDXxq6/N4kI3iHnSfejN/hCALkMXRMgBrYB7I419yWrEV1nbjyDUvB9ne8I\n8e5R\r\n=6eHQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC4KcIaMmP0w5puA6rGjp+/jNMTx1X7gYLe1XeZ7dGPPAiBeuk9C/1zpJ8DXqO9P125yYzVwrYwMTO2HyaUkdpC9+w=="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.7.1_1587268759879_0.01281591992999509"},"_hasShrinkwrap":false},"1.8.0-next.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilot-dev/sugarbowl#readme","version":"1.8.0-next.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.5.0","@skypilot/toolchain":"^3.6.1"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `omitSequentialDuplicateItems`\n-   `pickRandomItems`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string</code>`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `function parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.8.0-next.0","dist":{"shasum":"51ea1130c2af330ea1038d457eb8f86ebbc4eb30","integrity":"sha512-Rn5sVKVu2Me0I+6Jz1RBYdDM/0zpq9D1bc2QwAw+QYErdTujn7yJ1LiN8BM7twyWQNUvQX+upcJzzDdXNMR+hg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.8.0-next.0.tgz","fileCount":109,"unpackedSize":48447,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJenUtACRA9TVsSAnZWagAAdAQQAKJD6scbWV4vWsT9vikC\nQFjqEPl0cZJUDBqxieRusEerirpSTs29MgGnL1XhtftMAFVWZhcGIu8cTlhv\nPDFtGwrpwROnBOjYX0H8/7VSj7AzcQGAMnSZNPP882IzGlNmtr+Ww2yR9Nqz\nLcMwvyG87X1K3TyAo8J6YbREgi7Luiit+ZzX1Ud3sMWHfbfnhh70kzKCwAqI\nLDr03G2QEuWfe29/APQJWuJNr0t8MxTfzABYa4WltBOO1JZ3luSikuee3BIA\nFY3/83wAcJQvfW5yjj/Pky02j59WyNOYKPUPhS2btPvyHmDgqEauzecJ/AnW\negsXz07br/s3xzMRp3wqnDEwf2U8f8drhtevdylnuyYG79Ui+QkuaS6h9SLs\nrcIxDPPVnWgxKEnAOk4J2w1x2mT32AFK8jYlTlRIxzAWOCAsjz/uljYZ44BW\nOEBY/XfTTupKeVLZFX3VChR4cRpet9sTeU9VC+E0ehmV/u5TXxHOeCK/Nt+g\nEuB+rYb76TvBBKL80OpZutosReosVEoeTg50f5lhx8nmaaLRKzTuLb+RHVxH\nxWZeCaKr39MFXJUFlDrf7j2LM1nCr7Y5HBiQnEbwM41z40Ty0CeDCUPhdX9X\n8V1F29PLjPHTDwyA3lLHQcdq2x/ph1ID2h6DpbwChnR4JO7ai70e/ZVBiWjH\nBGNb\r\n=4wP7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCGM5FCRH7qz6N+UKp7VFCWX87rqdrQfWqyhiPfkjKs7QIhAN7eCy0TjiiMbdSRZ4/8JpR2X5oVbiW81EDfTanTuNi7"}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.8.0-next.0_1587366720266_0.015777426274570017"},"_hasShrinkwrap":false},"1.8.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilot-dev/sugarbowl#readme","version":"1.8.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.5.0","@skypilot/toolchain":"^3.6.1"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.8.0","dist":{"shasum":"f9431f380522bd0751aa9531e0a9be1f145bde71","integrity":"sha512-mZIla9JIRwskomFZQRg4YEwqd1Cn1YEYoFgIsuYgmv2USVsJEjXEST0O9J4cRuLhFhkOJReAuweTrdWUk7lipQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.8.0.tgz","fileCount":109,"unpackedSize":48800,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJenUxcCRA9TVsSAnZWagAAFogQAJSJRdUpTddOiombP5O1\n+lrPFluIb7eFMdIKAv8XN4m6RWnUs0CnXCXuqThUqnxhuOOCg+PZ6/GgLaPR\nGmg7XYtVOTDRkeQHvBtYuzY+JupU7jaZy0IQ64+tSGjdPHBhd3CI8E8Ha8LW\nVj5hQymxhogsZuvtdP62OVd10vwOZ19eAe/TU6y88x2XhvBg2OIyB2A3pL3G\nwG99MRzphY+lM1rq6Vo74LNtZNwc8WaFGxKmUgiHr6eN5tye06OTVj+4o5QD\nAYg1bD6qIkeyXSYo3G690aRECU9zWFm4Rl/QuqPbVLhG08WN9Lstv53mAgnF\n47rr1O6dGxjtfM8IVf5b0+t3mEy1NN3dNdD4P0ggxA5p0RcklNXsQO+hRcxB\navnMd22OYoWV5MR+4VQbWf1T84yWWsh/fC9DSHVjpumRtGFudWqn910eorAb\n6JCCQhJpIIfyfjnQRpaqV2rqt/J6iv+YYqEj+naqiV6tljwun4AT50FTG7/V\nu+y7llF0/pqsNwHIpdHQuSUDeT3Z8aask3lDzt9PGdG/3zPGB/e0nz2beNuA\nRMtcuhtvjo+56D4wWCMWaQq1owMDhboajL+x3CwuziM7SIWUsWGB3k80F/Vs\n2scGSvjd17hsQUc6kpLPjO5FrrGS1Okbj3d8X9WvkKLhYKEmAS2IhlPa/HsN\nUUAT\r\n=xHRo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE7LpC5wRNNSf6oeVMybL966GlyZEVUaSAXZMra/nyvXAiB68+QKHjaqwJmJTw17QmrygqH8RzhoBOtwTwuptQWDxA=="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.8.0_1587367004254_0.15223667275591501"},"_hasShrinkwrap":false},"1.9.0-next.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilot-dev/sugarbowl#readme","version":"1.9.0-next.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.5.0","@skypilot/toolchain":"^3.6.1"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `omitSequentialDuplicateItems`\n-   `pickRandomItems`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string</code>`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.9.0-next.0","dist":{"shasum":"d14bc249264c49a208f2b9eae356318508cea025","integrity":"sha512-j6aJASLPXqPv3gYA83R3BEb94+n8C+zFvnC5RexB3wu6UwUPZazk6a9+xntNmXV2xt5C/9LyjNwkyAlSvXm7xQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.9.0-next.0.tgz","fileCount":111,"unpackedSize":49621,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeqMNrCRA9TVsSAnZWagAACToQAIEmOhipu1VfihqYa+Ix\nYXlO0l4/IGL3yV8V0D2MxG+nShR5ITtBFaHVv/KyLa3a2St6UKGJB/gRQwbB\nP/7LGLFCJ7upyWdNcGwArsGhjG4GxIM4nqDxdirPMPe3739cqF+I0DPAfh66\ntNBm+gWYraHcCJY0CMA7GTY2wlWXwyRzuKfIl5MAJcg+BpOFyygNl+l9YFQP\nZ5m3xiCOPiBpco5GIMnlp0zxETIAOnzf84cYXCijNWOOwEIp/Mkqh8llWEA9\nAgyQDMnBcULVpB09YNKGldWr6IIMUsxO2CNzNeB6CQHhNwz8R47FGQCKbt0E\nNatPsJ/SwBtodsOg+FfSrDmQ+AV+et/gIAoDJKAeeV1ftIGqv+83l7cpbBsk\nhvSMI7YyUtJYwklZfTA0AUhqaKxu49qu/6L80SZJ2y4hscwhzzYkxggX+rCu\nwzgtAS7q94TNXBQvc/0XyapqTRaLwIWPQXDDxLhgrUM6TX4JQVxtozE/KdKi\nvgUp0yjPB2xsrvbsGhpyL9wKhm6p/9lXVxnxY5cKcHV4S4SS7BF+F0iwIXMm\nxJzqgYmuSzLuwHtLssfCHwbwVRHvJ28v6FdFD3KvSF5F6JfJpek2mThsYH+s\nc+qAUPPzmikhzUciM2fnIjQp3dhPh4OfihSMFIRfoOu9hBoNvYBJKDQ8NsEH\nqMfD\r\n=ruos\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBI9mZZdQ9e9Zsk2bI/O7HYlJtazshNUxbz5jyksP0ApAiEAxKuEI508jgD33gs6SUKj9hn6BcfixXIt2wrpigNsviE="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.9.0-next.0_1588118379032_0.8107898587318851"},"_hasShrinkwrap":false},"1.9.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilot-dev/sugarbowl#readme","version":"1.9.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.5.0","@skypilot/toolchain":"^3.6.1"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.9.0","dist":{"shasum":"2731f6ee1d8c0c71ad8ce65e305c07e8b173989f","integrity":"sha512-uPGCADfVMhbl67ItdJu0w4wB/l96k7Cwt0rV2A1FdeABu0GFFF2G3su3kXuIhZMgbNfuPDaVx7UFPPtJA4d/lQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.9.0.tgz","fileCount":111,"unpackedSize":49984,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeqMR6CRA9TVsSAnZWagAA020P/ix+iwcRk9myNGvONMNk\ncIIKPHnvppJ1/T1OMp4I4OwBbYqxfvKHtGv/sAF/pNUne4BE/ML4W3Z2sDVh\n/clRgsVu/ITi5Rp14pCtqJHVfUpip8BrqfjwWC4qC67D0yMxM+PFkkY00Mnm\nPft8WG4QeG+DljHfOjnQv/PDBs7fveoHR2rTqhoZVNIixO+GHKMIKr+ls8xu\n9rQjsO+C6GSCWlkijT/+Ox1aLZWXLkznXzeYsskNcfpLiBHcBe0VpQEY3/Ip\n5TYE7nZgPnr582tKUIF1Yfrghp5C0HekOUaoqQO1tY74safEuvkgGh1AVusp\ngadge2myvayl/I8ZMrn4+qlr4DC684DretW2ZzkVMxvY0z9KRq2P/LsrzQA6\nAFqqOuyXFkLQYZXMvogHBuhlL87mB9qigyPAlSjrWBpzjicVVoHUe9tnt1Tr\nExiWjZ1tv4l0bB8ec7iqaKmWcO2ltfXcXxduxdHfQFu/Rh7QzZnh72wxtjbK\nTVREPSbybk0VTYlf6ZUpAPSv3Aw4WyiuUi5xNet5+cQf56ZZI6drsVH121FY\nZ1noetZyHYBCcfiwqqiGdjjMuOQxhMxF2BVMG0zQ9Fm9t0WDp6FvFfiAmrUw\nKfboU6n/1uStIcWt29iZG9qn4S6K7qTsEmtqV3w/9PO5BC/8qaWSZ3UHPL0K\n/AXb\r\n=WhKb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDeC8/wKtYbNRozhsbXZW8Q3C01pXGkbt0SKt3AUxA1IQIgZoW5ysmSWCQ1PG/DINUpEDfbIBQdpeqA9tbKwx7MYuY="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.9.0_1588118649986_0.3630472969251517"},"_hasShrinkwrap":false},"1.10.0-next.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilot-dev/sugarbowl#readme","version":"1.10.0-next.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.6.0","@skypilot/toolchain":"^3.6.1"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `omitSequentialDuplicateItems`\n-   `pickRandomItems`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string</code>`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.10.0-next.0","dist":{"shasum":"64a56dd7146d3d37ac950a1215567febf5022b4e","integrity":"sha512-mfGNA1eDO1zSCQG29F5/Ofq3QpRH2Os0oqvpJdpX4iCQndUpLaXTTyoOzuuA2u4ySZGBLQWmwGN7FF1brL8E5A==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.10.0-next.0.tgz","fileCount":115,"unpackedSize":51055,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeqhzHCRA9TVsSAnZWagAAWMUQAIRDAMDkafKcEqL8ecsj\nQGGfshpDVeFMr63MLB1Jh7ttdpNo7Vnkul4TmHbZiKORe0TXldDr8LvbliSo\nf2Qf9/0PXGaHMh46TZf8Hl/APfm6qckB3b+WlfGaob3qTeb+LYqlTO1K+PZN\n56f5pFa2/xD13Ve9tKy6QyJnlHICgcC1q4IDJrNz1amlu7Na6tQuyyA6OwjF\nib76YTtr1+7YLGXae9r2MqgGaM4j+j7jpyhgfpCP/tTUwLqmj+vyB7QS2SdB\nDfPmVzoFaw3LZK0LAVaJOBsXU1HaQJnk+QeApi64Yg00K0X2N0+oXyVNwvdZ\nPD921m9IzywimRfezSXP2kCV1EHrNOO6AQ7CdKTY/7oxQMsII+1YeNsmbD9B\n2eu5sj9RNv/LeVNzs9r3gxru38p9I76qx/ckeWmk0KpYRmQ/OzJEoo3AbHux\nAhjLCIdMunzEWRiqSZlCGS58dQJOzzD7CFqNn4/JrHakfe7aYCOTviR8xRh9\n6ZezbeIG+yJwYfPnHq25uoE+pQVzPTdfqWINk+ObuE6qpJ+aQDfTeJESVddi\n9e9W9QXnzASaYaTVOSGC7ia3UJjtHTRaJnZhGF6+uyZx3shzjcm4zX5rG+qs\nCXRLbl7bTd22KraN+g3ouWO0dwk1R5GpPxGpKGJAkd3pABKytBTaMAfQP6ez\n8yeo\r\n=rUl1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD58mXNd6EpuLURqmRvRipZStlMO3v0fQR1TLHlOYzjzwIgKjWzjlwHrVqNIoL3IAOj/zZeLrTMDvWYXjHcaYZ8ZPk="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.10.0-next.0_1588206790932_0.011121604085557957"},"_hasShrinkwrap":false},"1.10.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilot-dev/sugarbowl#readme","version":"1.10.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.6.0","@skypilot/toolchain":"^3.6.1"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.10.0","dist":{"shasum":"fd7e9261aaf18623b634f7324db174895c8560b6","integrity":"sha512-f3VyJbOQUKczkNsJLkwdZywAo4Nt1NPflqWp2kJSHTRLLshmlL0MO0D2PRkDkcOtNBXBiZgT7W3JCEYpWU0Qfw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.10.0.tgz","fileCount":115,"unpackedSize":51570,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeqh3nCRA9TVsSAnZWagAAXgQP/2bO2I8XKC90NNG2iUDF\nNOYHIRaG+Hy187I8Lwn997eVLUFUM3x2k652IyTfxQndQyBbz5eSTehrC9Ld\nEH7i7cLm0ETLH5A6wLyxKIKqNE6wqoWDQS3IDiZ8hEBkWJI7DYGrVuuLS+5b\nuEI5P9vimFM5gXQwCqOXsTQRjIG1Oy7zzgXj42VZNYOY5EbR4KaW9fRUpHca\nPm2xCzrSTdSTnjf2QNpg7byUobwewgZiDLwgBU5INHQ+XWUC75B5bggheVxf\nXj23OM+zF/OlPklSB/Ig2Smeaz9ndGKyIIeS7uCoVQVm7fW1bGA/QzkzpmOV\nEMUrGXCdEEEAzMGNKgV12RbpPhSlBURr8uSP5ZBnASO+tAZH3cMuv3yrKSyi\nfwr8scxn5QMsxeIM/hxQHM5rOdW58yafGuhKRummvU8VrnH6eLLzhhZOdO1k\n2YONrcJ68zQkhgS2BhRGGu0JneJID9IIu6dNwPxhNhk9yLenw3H4yQ4tj7r9\n0wPCsLt3qNId4DgWH1SUi68nEwqbCLyU9qJ872qm6OPDF/kzLGAXSSeQCWRW\nX2YVTF94ptN0Nff+BjGIBIMRLgvKQ/hjQ+yhHc3XBDiGXDrIlXyL1eeouTQX\n7XnqIDs5qexS6gRewtz307DtFp2pH0sSqZKf9AgVkn8eSEvd5yQ6dSfdTEPz\nFhWV\r\n=Ab06\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDebZ0cJilo0fOdPAP6XwQWd+GN7H/o6dyywinC5CPuCwIhAKBHiABmFEzS5pCwpxKawHP5VNGZheDIbu4mh/Z32rCV"}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.10.0_1588207079494_0.6496060860761963"},"_hasShrinkwrap":false},"1.10.1-next.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilot-dev/sugarbowl#readme","version":"1.10.1-next.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.6.0","@skypilot/toolchain":"^3.6.1"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `omitSequentialDuplicateItems`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string</code>`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.10.1-next.0","dist":{"shasum":"0ed80f566e4caa771b860daa297dfdf12a0d5af3","integrity":"sha512-ZJaJsJkLo+QAcSJtHo+eCZ9LcS7dbzTp1+mFQ6//NL5d0xWshKPy0S/LoPnEzdci7YXDqbFS7N9f1bhAEitu+Q==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.10.1-next.0.tgz","fileCount":115,"unpackedSize":51844,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeqiH/CRA9TVsSAnZWagAAwnMQAJ6LjfLSVdimR0KvHkch\nvLzelLkqubZ5xXPYebmivT+XodX2pyWBDrkqOkHN0r8RBAUlSNDOvw4oWP/v\nKvBZAuUwoVydvNZdepYjhBietnd7oKXOlSQTEeI4Ub60edShrD7FiT7j6IcI\nqu5ODXLLO/viYZRcwhnq7YAQB3OpAnYDICa2oINMblISqdU//B1JRgmkSsK/\n36kDnqYMBoWeEMuK0IUO96joUijX5Mjdk639YTsEnScYZBaGQ5nvK9gYoKHo\nxf5oEpNhl/cfJAtNPAELVJdBtclTO99lFZWcTagtDTzwMae/cQrmFK8luCRy\n15RDq3zeZh2N62Izt6jtH3UT0jY4mp8qrL3CXGMzt5qeTksOHQfSkXfQuXqw\nhGBFoGGWEyCo9Jcmo8aJsWxlWOCB2cRm11Zfdb2Qm43tRbTGYrYW91linvMQ\nw/PtFUcgXBjUs3FG2YUU7aXgUK7jd9q6n/Avtr9hImGvngJQSv73q9+MOQsX\nvr1Tq83LpbeAImYW33t8BgBPqf3SZzis+ZhaKv2yF4qrjYbBrAxwhn6nZ0ON\nLmUkFA/FNKMcw4Gobzj28fBvDJbSXme9B43VJaE/CpzN0psSVvQ5bKznX09Z\nEG3ce9aerbAE3THZEsaXUae9OfiFlbRyw2V7gEJb4pJMfx55vEa+M7Wop0s/\nG91T\r\n=BQAa\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAulrnmGmb4NBEGfnygovftHyE7R1icqpEelUE9eegVjAiEAvKztIquSX/CbVQaCILlq9WWWkApIBcNbWMuzZkWqV0M="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.10.1-next.0_1588208127206_0.5660503750022134"},"_hasShrinkwrap":false},"1.10.1":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilot-dev/sugarbowl#readme","version":"1.10.1","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.6.0","@skypilot/toolchain":"^3.6.1"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.10.1","dist":{"shasum":"8722bd73466c3505f7ca36dbc71724127697bb9c","integrity":"sha512-/19/X6Q48gxrNl0rKlnenyxZ5izlHZ0NxXLcl1TBhUhhO/CqmDH8GZKWf6pjDZjG1dtZPy9dRzwJljn2hyvWJA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.10.1.tgz","fileCount":115,"unpackedSize":52215,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeqiJuCRA9TVsSAnZWagAAIj0P/0QjX1LF4oINN65RWmEc\nKQqtdSUXIuQx1aZ/oQaK0MF0UjQwsVrI8y/o/nh5FA91dQ4cYtHRt2nRqKhr\ngqjJ8a/rZ23wx1n1ZmZl7QfgAW0YiBHJrFVRl8/R8htJ4D6Qk1ndLNu01V9l\nIw353o40ENoWslbZhHlacVgQ1286Y0dyuN/+cXV+wjYvFCw6al82Cz9+bpO6\nTwmLQGTDHCsKYKC2iQtZvOQoXUPtSzF09xjD1GwRKkMt4RI7boopCxxGdsvs\nLvn4YcEWf80EeVQJx5q+jURGdmT7dsjBUDYcF36Uv0rgOE+25aY+Y+kx7qzL\n4xvkgJBi/ZNFzcxc9JNXhVWvhCGqf8Ec819zJjB9lVYeba4pniFZCZXwvNRq\nIGBKmN/JO2jYDWVFiyayi/r7iv55QADT4ExFVnSpolcQyj/bCkbZEDfUlWgE\n74kmP0dDzMwVqN0WgSGStHp/ES6hWaXbFRTnY9tfSMAorpARD6Jnf6kUyi09\nXi/SYd9E76/6V2/soJgdSFmTSInNEriyQ44ZbtEgtT0Wa6U8m6OXVkPzr67w\nBgZ/HwGPUlS9tmPuZodyQ8NjxP8k7h4KV6g6TyTCF+1ysuXTmDqEiPZs+xsY\nivPN2e2e8q2GUB8JeRva74KLBEzTxLwEm8BKQeucsKK5dcwC7VEMKyCf/nMp\nAKA9\r\n=PROG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICfPM0S1cUFCSVQtk3cqxDWqvTUjKgI6Ng9Fl7kXfJIaAiEAqBekTFk9Ppr7aHafAQNbZsHhgMDJlhQWigKlCPhvzfU="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.10.1_1588208238136_0.025488588398013157"},"_hasShrinkwrap":false},"1.11.0-next.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilot-dev/sugarbowl#readme","version":"1.11.0-next.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.6.0","@skypilot/toolchain":"^3.6.1"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `omitSequentialDuplicateItems`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string</code>`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.11.0-next.0","dist":{"shasum":"8a940665f25b0ccb268d105288b9f99038b69929","integrity":"sha512-N46Lpl777ul5kxuQBIqkfNQ9rr86I+cIOm4c5LWF0esuN1m2CAcg3+/vb+dquLyo7wgcTV3ysqAGTOKpcW0nRQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.11.0-next.0.tgz","fileCount":117,"unpackedSize":53781,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeqvjzCRA9TVsSAnZWagAAwmUP/1NwGktVTyxdStXsGLze\nQfzIu78h1lHo+KKnjQbZ+FvAMo/dfpN+SJby2VMM558Mao9dlCoq4kmlbRqe\nxTY01pjYHKz/iY07ckfm/1BKwUEDiPrm17uMH37Uz4+k0Mb6N6VwBNt3+qmH\nCPpaeULaHkxvxJUfwlB4vAxc/TGWKc0zk+R2fEuNt0nxuXvqyUrhd8yZHarT\n1KezsWKAz3YTFKCNsCl4jLJ6xlyIWr4zQRCwTs+rjpWF7VakAXeiSU17IUO5\nts1WZuSQfqYBJqv0WUKbAq2HJs1tLNWRz32PSDFukFA+UNmI4T74ijQrDzjg\nX4EamwbbyxA4XuBTdZkKIasonhO+l3k6wZINY9LfszFCOdr9Y8wLIXUFv/Bt\nfNMxePgpOuqZr91D4UJ7eQFdWkxURbXcjEELkeB5cyh6l+0wPoB4FISTf2t+\nidCs9E3Cz50/mrLLKBdLy5l6Q14THzl4SzOuUaJeuIVsi7bTalLuQ2MCzrP/\n0UJ/N+ipKqGjEFIArg3hrA7j4/+EJt9Csv9uNdusvDTCW0zwDV/ZjMAj3OMC\nWtb122DnjSFzhTdvu6ssg85apefovQmxbII5lHJKYuNeTC9gGiy0LgadjwSc\n/xir/OxYMh3TUJfposqeQ4Y8gxXmuWJFK7YBknAhtzZvTD8oxuRopRHpd89p\n0tp1\r\n=mHkG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCS3ekmnX2kHpuYdhQPFyDLNOj804YNQ7TQP2n25ctTWgIhANMtFg3vatqpS9ttIdblyLgr6LhC5n7MEvpIe95Oz4Gi"}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.11.0-next.0_1588263155138_0.35880132127199804"},"_hasShrinkwrap":false},"1.11.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilot-dev/sugarbowl#readme","version":"1.11.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.6.0","@skypilot/toolchain":"^3.6.1"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.11.0","dist":{"shasum":"af8afc017b22477e0963cb1ade7a4f798f1a64ae","integrity":"sha512-1im8+1zYZza2VSwThZLDXgiHr+acxv1XpW+Usj7Up6Q6LdTACkENwXk2Qyshojq4giCaNxISXlBrVuedjSlAbA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.11.0.tgz","fileCount":117,"unpackedSize":54152,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeqvmVCRA9TVsSAnZWagAAEuoP/Azan6N8WzylVFO+K46e\nDBfgh4WLLLHDGHsvlDyLkGhdanFThUV/NBwgPoX8ymGAQcQDFNlzG3ScnAKl\nBf12DhqtkzfZWiIPhQ3h+8DeLqXCLcgqbrs/N7Sg40jHGPir3kkIpGXxzOdJ\neu7C+5fYrnt7d/fSk7835SKZ0++zM0FH7XVqE8+IkZmCQdVnbxXi36nGJkhi\n/cE5IfLOYlGzca4N2UP4EU/BSIFBxENeAWkMnS0YNAxSznNhYBMEWhzv283t\nWH3SLFX3nIyYRpRBUfMf//TnicNflH+Zz+UDv0ZsAX8JM6OWq5IVoT1adnkW\nXUb1ZSKssal7kit26MGrB1wvO2ITVEf0P7LXIIbhOy6etWpG+Qad5M/N/tLV\nBKt1dBFFvp+8LeKU3PFKKnuU8q8x9m58hIt7YCLPRZghNY9laXv8vwpu5R14\nErCBmgX/oDHI1BE6JMCHwL/BCTaECJnrSaLmOr7r9KkXXoINnRlFhzvAgmtZ\nBXFVb7ng2CTe5TDS96Wy0FXAsImFYiIzNV9FwlGjtbiQrR2UMXxqKPkR00g1\nCwaB14VtPGktdLw/WbzWv+Diz9jzW4Eny12oqkuAiFM+KOduwHebvwoRF8WI\n6R6xhUhqr9CFkBFunzYBQYBEv2NhmH41SrH4g4E3EJJULQ2MSAIuz9xlkWMK\nygpL\r\n=I7Jx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBoAmGkrZvlij3MecBv6B8hj4eCiweuH6PNQwaoGwqdyAiEArACAYSHNLu78zXWX5gDkPLwuBA7RWpbhYzYpmUbSl4g="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.11.0_1588263317078_0.25426520807358943"},"_hasShrinkwrap":false},"1.12.0-next.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilot-dev/sugarbowl#readme","version":"1.12.0-next.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.6.0","@skypilot/toolchain":"^3.6.1"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `omitSequentialDuplicateItems`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string</code>`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.12.0-next.0","dist":{"shasum":"e58ec2d9930804c78214d5d694652bdc52c86904","integrity":"sha512-8WAIvMFPdmGCoSS+QQUfaY7dckjksdo7+ny1BMV183sy2kX5UNwt7AdhKqki6KMdgMYzvrOkiBo18PzPU1HEwg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.12.0-next.0.tgz","fileCount":119,"unpackedSize":54769,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeqwhDCRA9TVsSAnZWagAA70oQAKEoy8atGvF+RxzycYSH\nFX33CJyL7UGKuBUqT9S4zkwcojpO3HHyVmepKu4VWhqtGgplYFXqsuxVW3zZ\nhE/ek91YfE5twObNAOWIMtsnVK4/eyz+OkId3rjy3IPLeMGrZ+zGQQs4KWGg\nTUqlAAzP+AcFrNNQVIcqh5uubhsvlpQdwiMVdqho8bNw6wNGerqmShySqWx/\n7EebIRBTBI4wXQnBhC04SDRgEqgWMIyJqgWKPOjzYBVyDW8S6F3h6NExteiW\ntd8nt1Oj3lhoKJ47ZQxhJFwKaj1nzZm+SFJHpNVSlaM90wR53Fn2JrOXeEfx\nKlyn6fMlfB2jIBnBvQg0tettJzANAGgsasCUyIhj3diR6+66uG7bpaaWy7Hv\nzixpg8fy6pHeRqnSyIyZT9IB6j8cTh5/CgdhX38dzKn6Wx4bDD2o4/udI50a\n9VCGqWJZuLVQ+y4COFgJN3hFq+HXQeQQEbs6GFoRfo8WQMrkwWsJ4H6iuz/Y\nYdH1REGZU6aknLreSmuV1VYESHasfJdZQUN4B4Je9AqFoRCy3K34s6KT5rML\naQp3knFpAJwoSK67rLwugz+LODssPTN2kvBqjK5WA0IzR4+skYrkaJEtdL7U\ndZ3UX9t9ThvEp5GCSeAs4v23YkLjpnQTzmzT9MlLurUcN9sdNbzUV0621Avl\noWZ+\r\n=jbb2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICQkYDrWuL3hDdIrCljrnE611xgg7k/bTQjoMMivYy7XAiEA1/Z4f7b5/iji1HECgwbH5bw82f1wpbC7Uu709XIzyMI="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.12.0-next.0_1588267075167_0.5291126671269282"},"_hasShrinkwrap":false},"1.12.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilot-dev/sugarbowl#readme","version":"1.12.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.6.0","@skypilot/toolchain":"^3.6.1"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.12.0","dist":{"shasum":"3edc7a335cb03380ad451fd79c242bbd72620ab7","integrity":"sha512-FeKdQUEwTZI1LDx6SVFVzwWISTzUP/SEZnQyCUAjISa/YFWYFhCnN3TytKKsRz47uuWj2u9ejF42WPYbJDFLSA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.12.0.tgz","fileCount":119,"unpackedSize":55127,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeqwlECRA9TVsSAnZWagAAS1IQAJem5AlUKOD27fPukg74\n2suP5LZCyUy3rg0QzvfS5WIg6ix2tzY/9NWrPD2MhDpgNR2A+ge3obxXvitt\n6vMtqfZ1csQekLe9LW2q2pOTGj/+z0CJcpqKIZBuN3lj9fuje6wExIWgOkbh\nOSHATu5/ramG0FXQCYVwRezi+8mIunit34WbP/s47NJCzTZ82sKUpMI1Unvw\n2AIWxq/IxoTKh3HNzu6Qzh1RAP6Zo+oExQvJedSjYB9Z9K6rrYQaAoJtD6E9\n3Judr7i0XYYVOWFgeium9s2tRgxHBb1+o7DWkwE+tCJfYzamgcVwbFDMSE5A\nhs+nldrv6/RPZI7PfeZXWjipzsHBKVp7usDIfsnicQcSqI6cO0EVwgOaVODE\nn1TraceyL6D5GTelwmn6boWli8Zu1lcmjX0KWLFgvBZIO2vq5RVZHWP8jgc/\nTMXB9ZiyUEmeBLjJ5/zbRsxcklO8zZ948VsDJWERLTLU4s0aM6XdWxhoDBqT\n54f4kn/hy5OmNhi6HRoeAqLPys+R0GVjQtNEoUw83CocFXd21C7UGeBGO/Yk\nThGddP88M4T01A26dgv0CLa7Wzl/+QvFN+uGYAN7pF9HCnnDUZZslFZwU49S\n5NXKrTRKSmff+a8nujA1SxvOppEZqP7HpZl7va4DrM6MqtdFzp+x+jq5zBrn\n9B60\r\n=4nK6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCLLZhqGog6AfuHWH0j/aMlyNGTbGbbcyN5hiNsSkWQAgIgCTCfPh+kb78qmruMN0kAOD6/CItNJuI0TSfvl4DhTEw="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.12.0_1588267331498_0.5008173471636335"},"_hasShrinkwrap":false},"1.12.1-next.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilot-dev/sugarbowl#readme","version":"1.12.1-next.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.6.0","@skypilot/toolchain":"^3.6.3"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `omitSequentialDuplicateItems`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.12.1-next.0","dist":{"shasum":"840183f42c4b7c2d5c15b4655bad89d4a1808feb","integrity":"sha512-owdOFsR30hR9QqtzC3qOV8TEzNmIMkNtI9yLHX5P7mxu4AmS4LaOG2LCDjAMSEeLDQAgHRX3T2k3T4KsJdEbKg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.12.1-next.0.tgz","fileCount":119,"unpackedSize":55184,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJerGN9CRA9TVsSAnZWagAAZc8P/jDANNIWLyOk7JLgLjlb\n3zIidO7I8oinkLZnaOgpeMCwS1prbCpMy3e5d5kxtlmw3NRKPJdzHAy/ujrl\noGby0RaQyIOOqAaPESEzrnSNi6thquJfZG1TAyanFagog1qhhVzIRWUioNgw\nyw8K3kasshyL9Z7gHFtuwrqjTc4+Ce1LZFtVIID1OnhVhJ0NGu35qZ52/ADR\nDOlMjrxLDn6kP0VhEHs16FXeZY0eM9CeNreZbZy93zfwClQnZhP4ORNd56+f\nHRfNXNWjXfZnRCSGR8FFRMrg5jKt/MT91Yn94CzTBTwel0RLy2krZqE7n9hw\n7dYVNDj4+5QB7R8VeveBSIfkfdtgm/aQ6PG/IXimAoAEpjylTeYmItbL7NGA\n2zxWIedIdP1I3L+yJx4LHRgBuDWJRPmuPgaiy5ya2F5sVQ2oJDTeeObODzhO\nlmhHkdrbNw5bPixf566BXQvenVKxOPAvvjkqiLWvV6/axQ3s8txRYNEVrwQQ\nsxMeimfYVF9fvCsgJZbNgX4B2l+hyXDd0wYstz/FKhYOcCiJ223y8Ths9OBd\nGkTP3KZ7XNbG/sH83EDUZuub9F09vTe8yrWI/lP4csXFTgkwyVN9NSu6Jt8J\ny6kWxmg3ipsazTB/3L7t/BnIDhdXtFYvTJWLLX/VkG3YjciZW0y5X7ByjKtI\n0uY/\r\n=oHda\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCQABn+jz28XAiVwAMtyC54ztxWxJMZASj/4EQqeXp3AwIgMP/OKXfVjCiuKFFIuXOF7gWcqMuhHZXSGE2Eysh48h0="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.12.1-next.0_1588355965453_0.7353609105695336"},"_hasShrinkwrap":false},"1.12.1":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilot-dev/sugarbowl#readme","version":"1.12.1","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.6.0","@skypilot/toolchain":"^3.6.3"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.12.1","dist":{"shasum":"d2eea323b348f57bde6c8cd3a6b68d1a5af5e812","integrity":"sha512-ZpRoTgDlMpxfPREtqtu2C1ILQB2pRDcCglx/rJSQjVhPRYCExYIaxK4FUSRnf+ldWL+bnjqNwyTBjiLUdYKohA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.12.1.tgz","fileCount":119,"unpackedSize":55392,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJerGQoCRA9TVsSAnZWagAAoKIQAI+bt5KC+xUEi6+Pw8zD\ndPStPA0STUBpg8shzDxuhO9j89iFQQQibokjiII7HGQushQC3Zix/UBHfaf8\nEUGYlzPLhEQLkA2AjOAlok0CvQiDCaKPWbW1VGYW5Mw2bL5RHpUQuepTQrU5\nwa2M2UTpoEYoGclaxue6thkUwZOmNPfwhJ+jtQMtvT82tXMk3HP/jdePl9ej\n99SdULbwjobw8qik5ZV2jcaau6uSHU7tcSht0wWJCELpcvnDki7m1Ha4QlNI\nZ7WUqswa6767EKoMGashgbqyDk5pDylhBHJ6mcW2IZTcCk+xy7zSel1wxw8O\nmisMnoY+eDxooJ1mvKgHEa55flcy+OTXcFzCCwXDL0bXX3/VMJz1WZtHw8rV\nZpKlqlGjR4A25YCLaKpARwjkIcV5CFVuRPSeKrhg7gotoeCMQIJmh4KkaCZC\nXZiFRp9uzxdgxCl12grQci8bXnx9g2JmcDvLv8k5GFpBP4D/YJQesc6RdsbF\niW4owTWLQrausZBT63Q0vMKkVg/wCKr+TB84v5sovKxq/fUQHLITpoQBQJX9\n+aM/zjXhc434YlaPsl1Pt4XKuZHCj0f4cekpU9w4ef/85w4EJzJvlzvBSLHi\neh9DoEUOl1cFSKDGf11iKjYuGqP10ynDGrMxaAltKBvrlLrxKY+7+/ycfo06\n9311\r\n=G4HG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCIXRgxAdNqgYycuMM8rqbf1Ldzf4LZ4gAhsW9uTopxpQIgfM4VkFzqqWUy7syn9MB8B1aIS62cBNLp+65GK7Mo5zE="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.12.1_1588356136177_0.9381414374761243"},"_hasShrinkwrap":false},"1.13.0-next.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilot-dev/sugarbowl#readme","version":"1.13.0-next.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.6.0","@skypilot/toolchain":"^3.6.3"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `omitSequentialDuplicateItems`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.13.0-next.0","dist":{"shasum":"4c143d0adfe811ee98f8fcdc5167e0b0a028ad5e","integrity":"sha512-9Bhr5BAFR7J47eOCQRaV6nWD3m1RQ1cuQmZJmuPVeSR1BaEuN93MKGkGzub201YlwKJ6guJ91J6iw1c2mv7f1w==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.13.0-next.0.tgz","fileCount":119,"unpackedSize":55572,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJerZPdCRA9TVsSAnZWagAAF0AP/RfDt+gZbjMiVOHCWb0C\nuYFdEuhd1cRbAUiCmGmEH+fpKpGU1f2DSpzDHGZ35alQz616ttpip/7RFhqW\nZp2Ybf4us/OK55/DviJK2Uk6jRnwpf4Nr55rPjfRTaD+QkOokh3x7n8kV3P5\nhvMXg9h/cXQNtgk7Y3DmBB0SXW8nvxcg71DuSKS1+43u6Jju+eaC6mHCpyZB\nbZHm+JHi4pb2GnXjtig0He3xjf0JTxQ7CFWyopRDfWdPPzOPvDEpvBFAG8H8\nQUUaDHtUBZ5a0SGsWXSUgPH/mL/YCv8Px1Vn9FCZv7DB49VKWnCexmZmavqb\nM3/bS+CH97bleGZN4FfwV3y9k5/9rLMnoLk21vW6Ddwgdf9w94yB6bqKq/2k\nku6fNNE10UcqPCU1Ei+c8XgE/Psl9d6kRa1aTkJpHTojgIwGiuOTvc1U1mK2\nJLo3D4g0wZBHRhigw6OcxqWCGA6VBay9vwcuorBuzPb99Rf7ZPyjKHb7gsJ0\nOxD0QEnCquwEmK66jqdHHTt4BZ3UUPwx1NYTmRPpMR3fxkSBZYc0zSiNerQg\nzCd0y0cAeK7RdBBRUSLQ/ebp4LB87g3k64hf17WO9IXTLGV8SdX+1RKUCmCK\n8k3cvTvVSTCscy4AxuGzVLg2T5GjWVKqFdvPcTjpAxeKwNGtp8f8SvpwAW7/\nc6AP\r\n=Akyp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBq2Z1G8XQRxVNhE/NVigGpoIcQjXtf/VDEJSv2p8zwuAiEA0lFWZJSMnLY45h4lbyu7sWQvtQkbbaOv1Nwemd4+m2k="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.13.0-next.0_1588433885105_0.5964650109813168"},"_hasShrinkwrap":false},"1.13.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilot-dev/sugarbowl#readme","version":"1.13.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.6.0","@skypilot/toolchain":"^3.6.3"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.13.0","dist":{"shasum":"c5dca38e8620dca12f16ecdc5b9fd38aa34ce241","integrity":"sha512-4EB3KbC8psWifp/mg9JOgA6vvYRZ0+LNJVMC19lLPK+IDc7th910jjNswoiPHrII4pJdMd+txJpc63GzoE20yA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.13.0.tgz","fileCount":119,"unpackedSize":55778,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJerZ/YCRA9TVsSAnZWagAAPAoP/2BTRqxnUSDN8h4osMD8\n4hZkkLhPIsC1sSgNIA1rCJrvdypXyMgGBVcuM1jLt7QiyHlsVq+FKIQvg6qf\nj+jyuxequGwYQTmhQre2I+UL6eNAr/zSQdLIDqLiPwvw7JezMdx05GhoDsQY\nZefrjIfwZwAUFJqgOJW4YRqR6bZXTq2u8D0QK6vCTO+AIte5EFD8ZW7mcF47\nDgdhWjMJPS/17KMSbRQ0LEY/tbsyTztbAdOCUsW5XU/cIJMcrUGxvR2wrdzC\nCfHw+j27zpk8Hv6ViByqRabfFlv9inKLIzkrwNp6E4rof2dW3cOMbDqZsB7l\nLRrqSfDUINTdY9cajwZ6nonACG+Wp6zk/mCQS61ykY8t0YuAxrCH6HOj18rw\n0E2XFFHhOPgksuX9W3W8OYco9u3H72f2kK+8GFP0QG+Q0e3VDcMuzqmW6Tkf\nrpHiAisJYRVnel4S0IBHtDq6gc+eXPt5WwKY9Ec/+vfpgTBSbgLYrZHPKoMh\nOsc0LukdN+bOh5gaVExKrlu92SvzYOm53a821STIeToqcYGUUuEaJrOhmENQ\nYZ5XvGR/NosjNEXy45vAW1so04VNgQ6m0YznfdxdSEG94iubFsS9KiuY/dOK\ns+DcAroaVOg+BNECDaeIMsjW+xyjmbpdqLdeKOu4ZQkbdjAdCMbeQDh8Nm8l\nYlPx\r\n=BaDs\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIETlobn2intVsjDHNH9HcqcXRcUPhuaqXeIlnM4Ip8l8AiBG2fanVJVhJt4HeFSuclDs6E855nf7xam++M2zNR0agQ=="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.13.0_1588436951981_0.46924929157562434"},"_hasShrinkwrap":false},"1.13.1-next.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilot-dev/sugarbowl#readme","version":"1.13.1-next.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.6.0","@skypilot/toolchain":"^3.6.3"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `omitSequentialDuplicateItems`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.13.1-next.0","dist":{"shasum":"6619f0c30d74140898a6e8f890ec1c29c3e55e85","integrity":"sha512-mOj7Er2DHitOlu2eja05B3POFy+IyDlT0wDRMfT9juZiHC6mJbGathwewaHzYlRIv7RlHmsRVM4wkyG7VcCNBQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.13.1-next.0.tgz","fileCount":119,"unpackedSize":55907,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeraOiCRA9TVsSAnZWagAAUYIP/iMOOeLR0/8fvAt2JMlh\nIHhHDYApAWZb5RLzR3EXG/arOHBX4/AjvOdUBG2dRKSMhSs8kucgZ+Ie/9OW\nJ3+zIqNNynfnb08SDEvGISHiCmU+7ESgIG4MR0LbbnAJtr8YmblikKh92P+d\n8UUqsnzpQJ+HLnEQqj6rS0IGSmS6JLTAXaCfONHLAh4pW1kb0kg8k/MwAtGG\nvt74vt8//Wmnp+FWwEv+JVyWmmyIcf645aS7PmaALSQC9OAG9QcFJFYja5oL\na4Wd28vY2p3Nsrl+4oCEdTeI/oo82B1nEce4Z+ToGeJD/tINp1S6rYzxYUlV\nkvJGsOn8FRWZQRw5FaLzqTLscAbMFMP8+g9NZ2q338oJ0zejVS9IebOXY0nv\ni8UQN5zXp2y4dSimhVVVvv8mDI/3/+X+Qm+UarktyAoBvHtszK9Aueq/8V1i\nKuWUecp66U2hgU3xH644fajbrUDut4G6dINW1JMNwrBCpalDjVMZrwl3Qe0K\nVpoBa9KcCC2UgmtmlRU+Iije2NqtvPrlaB5LEhTOgKdjZ9rRxx/qTY7wO6Bf\nyz2a6QfMn7e7KnOwZr2yBEsQVOPRMGhnd9LFWOfVmyxA7yaymM3BRLodKtQH\nCXMQfG8S8MG6yIIgB3nTAGmz9JPnm8FrqK7F4nTEP4MKANYU/orN5WMJn43D\nNGqK\r\n=bVDm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDRc21IX33jyLFSMOW+KNcZ/KMb1BktqFZ7QlziUbuDwQIhAMCZymgxCxRkVFJU+h/EjBCq6vDxNCy+THPou8TvlYKJ"}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.13.1-next.0_1588437922302_0.5419424539683488"},"_hasShrinkwrap":false},"1.13.1":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilot-dev/sugarbowl#readme","version":"1.13.1","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.6.0","@skypilot/toolchain":"^3.6.3"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.13.1","dist":{"shasum":"136a065b1e86d617fdcfdedf105aa89b373a9a81","integrity":"sha512-C/RVAGetsvpeClnLo7Nt7SEZM32tGmOsE0f1t+YQx4NYHBr9Utp8eif8w4BRUJJIsWy+s7j7MI91wu45SCU1MA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.13.1.tgz","fileCount":119,"unpackedSize":56115,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeraT5CRA9TVsSAnZWagAAawEP/jsWrpmj9viOnUFuKHHV\nrkhEgOKgGtAiVahydMOxxyo4J7cT6uDlHxSMCvhGOYJXyH5nLn/QEBPQXby+\nNUaL1HRVuhhh2tzZHNAtEHSFYNfp+T+Obk77fQwu0y/5JPf55czV9a/lGz87\nj5vzgnMVW11sZgCHA+As0vq8gpE/qgpQ+o9FcSwcVkjvt1u/TEL4WVQIK5So\nk5l3Hx7Kg0uIU0NGD3A/ART62H6/p1Oujb7CkxROCWbQyA45raBI2oBBqSti\nvMhvhQhtWN3beBrB4PajdcDjZ7le3IPFJOZzBY0wF7i5Q+BqPbaC/lsCXqJY\nMxe8Jw1g/nag3hW0RwShDt5OSeGrqJNDNF+aXKvYsJSP7MPB/7jLdiYeL/fH\n0YfwD3LVRMkOMnrWWeRsrbHB157sb8goAZ8mif56ehRSHQT3CbSYefgnYUZz\n2mdokWo19lgJEC02sDWjkbM14ZbGI4bx5I5/BpaoFVJL1Uup2dnnEisLoYQU\neyn6zeMb+qsdMqkqqu55XskAXZao4oovL6ux/EIV67PX5gXhlwZPzuYkDhN2\n7Acq3gsOOdod90kVPJuMcy2ppmUBYygdAIGw94nYOQQ4m0ZSmhCobpzNoNQ9\nEIoj27Ye5y8fOIldvRj6bFF0QwptumonFAbWkbUUYXcvC1fMkk+RC++5lSZP\nqTVS\r\n=rgq3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCIeKSaGImRmdMPl5XcrGXSr5IJ+v5Xf0snmP69ORRZZQIhAJQT2a6osOcrDC3xjiRQYFjEQXL8U3IehUuQu0s7QCsB"}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.13.1_1588438264561_0.7500855659469698"},"_hasShrinkwrap":false},"1.14.0-next.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilot-dev/sugarbowl#readme","version":"1.14.0-next.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.7.0","@skypilot/toolchain":"^3.6.3"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `omitSequentialDuplicateItems`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.14.0-next.0","dist":{"shasum":"eaac3723441acb8082ea60f0719dec1b4190536b","integrity":"sha512-WKwoH4lUT1guDLlcSbJDFmVDj4qUaqwvGt2bmlGdb6kWtPg/n+rqvJ7ljFYRwFIeLTSSUC3AJy8ZINF26B4iLg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.14.0-next.0.tgz","fileCount":127,"unpackedSize":62511,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJesX6mCRA9TVsSAnZWagAAyd8P/3coZ0PtJzIsfxM7CptB\nDbEVfS/H0uzlZu6da10cV6xPa3wxeEjDc+UEnALOObI8rY/YBqR0ZMN04CRW\n2JTb1BXESPoWXrqm67SYSOUsBsdFIA+TlL0FMyioufZ9Edq+gKiMK//jzyII\n5x1jOOtozOmQoivu03Ow8KH4I/jhStZjzg0OvgOQfK98w7r52rciKzlwEcfw\noKyKzsw/Bnsr1tqfr6bxBrrFUHJ+sPI/QV9ofbZUnLZGmEXJmArsQ5/AEfRO\nuQttSFyAHkPEGblbVOfGupXfw/h0WGgbp5z956Q1IzAU3QFh6Y8H9wgsOdEX\n1mBKBdMyolfG1FQwdcfdTuoNtDvzcgzFLTu8voc4Z6FduoOERvj+nVR5fd+T\ng0tTMHXoWYY3T7J6Xc8vWuI5ihUzjV3iDRweRJB/3GH9ZnDOmt+lbRZ8Bi0O\nC3O5L1mXrsZfK7mu9mu1kYMriACeGtKeVsKf6shM6HTldsy5T+5ZUGOWEAZn\nqNxx073QX4+A703Z2d1/wNaCBAnekTxQhXe2ll+Kmrq+Z+E2gNrvtFwoXXU8\noQAXow5o6CDmIPvzARqiruoRwfWBasZPe6WjIelzOzBPi95yOU/5iW9iIuj/\nNE+B/JcbPIisc5KpB+Jmh1ElZP6tm5+nN7lsM2ypWTzZ6lt//STZx9HuVYGI\n5M61\r\n=mUhr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEu/lOQNPVNk7iMYXHp/qQiwQ3TwSbV8Rnad/iY7xOiWAiEA59gon1hqaJfPw2UvWkLS6Wh6IDykUYuHmTzjcIQMdKM="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.14.0-next.0_1588690597827_0.860936718043964"},"_hasShrinkwrap":false},"1.14.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilot-dev/sugarbowl#readme","version":"1.14.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.7.0","@skypilot/toolchain":"^3.6.3"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.14.0","dist":{"shasum":"ae0fdb1fea5a00bf86ff97d64ffa1a282340e04b","integrity":"sha512-FpLN8Pn8OtEvrSLiwr+o5hwmUBFsNkMl1p1MeUXnc6XQ0BSHGclvWSsgBoTiY974nvs0SivcwbdR6uXfreSVUQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.14.0.tgz","fileCount":127,"unpackedSize":63189,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJesYA/CRA9TVsSAnZWagAAuHIQAJ4w0MNkUmxkUe8DYIQ+\nVgiLW7piD6S5aRDSSDfglfvrjTcIReQEAgwckbW5Su/oi3zXadSX86JQVEjW\nK26NjG/RQ1qorzxjvkmx4spzpBK0Mx2GelB5vE1DVrEsnvA1QdceVShh/a13\ntt75ORT+8fqAMZ5b0giURDLFkNpXtQqMwo9UoJCiT2IezUhCRM88hViTAIln\n0SkvpzdxhPKfmfbGULsegXBOatydZmSU8fh3quv+C/xZDWNU1eqmt/pXv6ZI\nQ1/gZQ62gnNRZc13t2IrWwyxKtmUZcKgMw+Zi2KcJNXo1UkWNiPUEEJxMFxm\n3JxdfyrK2rsj8iVVo+Zbh0DTNCUDZL6K14nv9HrV6uDld9OwQPNFvAmhebF6\nYYLq2PD0zVzdcq1kppnhyRXjiAJ/Tj3AZ9XSPeXOu9e8aJ9DRjteosuBgCJb\nld1lSoXkg1C3pKOZtSpgwosuh5aOAWO8+JJTxkyRjlAzVDhbVExS09UMN7n5\nbfIh8pCF3gBg74XVSezBvFDWwjZT8oryVititFi/dTdIQAlS2wXxYSLGAYWc\naA4RWvsNxFOLrpJUx34Sx9+/HfrQHV7xoOTefOAkUmZ+Pl6mIMT27a7CM3Cy\nmlmKAGFCwWwPy90UESMM0G+f1Dg0+8oB02lPVRSfuCYQUJcz+iI7FPVBU1GZ\nqu9j\r\n=GLo5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGPCODT68jMnNJAsrkGcl3NfHwNrHsRxJW2RvPyfFXjCAiEA6YocXwPqwfYDYF2myUXiwIFvc4Hd6azQeSPHbLLGgI4="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.14.0_1588691006690_0.6399118113024758"},"_hasShrinkwrap":false},"1.15.0-next.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilot-dev/sugarbowl#readme","version":"1.15.0-next.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.7.0","@skypilot/toolchain":"^3.6.3"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `omitSequentialDuplicateItems`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.15.0-next.0","dist":{"shasum":"b01b98964cb4f74d1838d7f5d29f31ca86398a4b","integrity":"sha512-ebp4W7zRXFdlAJ2kmyd4l1XrDObQumAwazUV+XrBdJRJ9/LvqCLZEs3Wv5UDKLoWzE+Wp4ofiQIThRMekjv7aw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.15.0-next.0.tgz","fileCount":127,"unpackedSize":63195,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJesY5aCRA9TVsSAnZWagAAoRMQAKHh23JFPpOcqpAzn4T0\nDf9Gj/XnhtTTH8E8sJ2rArxgQUTKKv3Zm3FnJI9GNPlrBAPtItMO6dU9QUNg\n9YYGhOL/0f+uLmod8eL/cUQT6fIH+ipz8sm/hLFVw6o44HcikoTEPDM/cHVe\nbt7A/cf4+dzxlnsX7essgRE3+h0Pz1g4nzK+Z1KHNejakamO8tdaZaYZNbRn\nOd6ggBdXbk2gJKE0VI2zHbT8ZhdaYmxPwBTmb3z+m24lqekOH0uvRO3+VfDM\n94lV1H+2QPF9QXj7icTCQTjQBHDdnnCl9X+YG1cig2q615XHcVgEUStaUknJ\n9KWkM6DHOlRuLTEHFRGvHpxzsg9AaYL74eucE/Z8CJfPL5loJPZNj3A89x9Q\nGGw6P9e1c9vUMYPjydI5nusuTQTbvZbQ7BKICshiG2jLcO/tVcNYx473Ot7i\nQRRZmy60KHXUhICU/y5VbqrjzsWNPc1s67dpJ8vUjzHWs5an1l7q+J6FRn4n\nib78Clb+N/tapJtWQggKNbUCfddoZP0AdtEMeJckhnhUpKT1QXIItp2tcXVR\nB/R8hEKXsDksmHU0pGCqr71BjpF8qsuWN4TgfJrCCu15vfa54jjbfX/8pqJw\nnVP46FLQMD3mH8FXkkIRC5tNheUtEMTVJtd9z3rwxSHuwNzY++K+u7BCrqAR\ngbx6\r\n=1oU/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCYskL9B+LwH13eYf+h5IGrrG+Dpg1zMO4OT6LNqxJ5hgIgNCEG77ZidCasxpJZ9mLRKsZnxNJbtLifcK8jLXyqS9k="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.15.0-next.0_1588694617499_0.20399670332629216"},"_hasShrinkwrap":false},"1.15.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilot-dev/sugarbowl#readme","version":"1.15.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.7.0","@skypilot/toolchain":"^3.6.3"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.15.0","dist":{"shasum":"75a9803a01aa0f6adeda689c0bf0bff79612dc43","integrity":"sha512-wOE0XMY5PsFdymGXULHjjM032PGN2UnfdxC7yw3Qw4xuVgJWSvYCMf4hDbbhGvyzXC8TfRVxVD0NT6eKKxrSZA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.15.0.tgz","fileCount":127,"unpackedSize":63401,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJesY9pCRA9TVsSAnZWagAAEksP/i0zzLGkta96t2+Khj6l\naKZrxooC0LTw1IcjUhRQsOSpQDMKYuBqXKzuXsRJWme3U8G/aozJMqrcT43E\nBlBzmxqYFf2hwpSIt5C8YDoE2+YN56/XTv0TqdK+nY8u1mXyCtpNsmyLycER\nEVAly7CZ1aXFxtw74F6DMAQ6vXyS24kMa/VIwX59glzYqXofd3rBe2fge6Jj\nN7iFJh9U/2E4YHvi0up9Yb89KpO5mJPF082BfQbNwOKyop+kmB9TPGqw9GMk\ne4YjCMa7j9lPys7/+m6VT6BxqU54SrJ+fj6d3USVH6OCyjSQZ+sif/wWwE54\n49jSalQiQNT7XDz66EOBeRIzeki+2IDgqfwZJ0e2J0uixBM3TjQ44CFpdE1h\nBXWJanoR5m35Tsh8P+Xrtrw5SiJLdjERX9K81QycAVVivdr5u6XtHBCGsTF0\nH4h4udYyGI+HFcSzesFZlq7/54/RwqNeiH5EJfb7mhVqAULA+u8png4Wf3LP\nvvDVsxlCLkFb+8nCYMpeJVeINlsaBVDWcydgRVcEDLrpqOz+wdMAvSBZvygg\nQ7cyrJA6FxB1JNTfYDp04BFqhPHsnelfNyHvygTvk0zj3p/2pf9VcNmevbX9\nJa6qahEA2ok5/n0mJRVjWHCr4+9yjLVPuFontP44yF+Ag8G/YcqdslveK/Vf\nnCUo\r\n=3r2I\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDhBg42dKwVHlRHMqo3iZPmVdmJWB6wbPHO+gD08uDlsAiA8jBl/K5FNeXOhzguNKPRMPpsxBdhG6TS40M0jX1/77Q=="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.15.0_1588694888799_0.10276432415279535"},"_hasShrinkwrap":false},"1.15.1-next.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilot-dev/sugarbowl#readme","version":"1.15.1-next.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.7.0","@skypilot/toolchain":"^4.0.0"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `omitSequentialDuplicateItems`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.15.1-next.0","dist":{"shasum":"1e9c4a6329a97ae93f37a099e325309a3aa98c0b","integrity":"sha512-6YbVJEd66/ygiLsseVolDYtJCXYCozLgEJ7dhrsYxABbUeWqhQS39qfGlg8XP5qG2dbriZEnylxSDwprQy6mQw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.15.1-next.0.tgz","fileCount":127,"unpackedSize":63408,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJetBs8CRA9TVsSAnZWagAA4X0QAJtbnGLbYVoSgUGkSYLR\n1OdcwplD1JgI/rhWrTzXFSloq28siRxC7p4GWEJnxTUem4tcEFQNukMPDCoR\n0cY/Scr+K2sjovK2j/qMHpQaJwZWQoBGvdldkts8P27LVSgJZI/lZRGSS7YT\njZIZMT5HKrSFGLoh7jz9WyPN773AtNT0ca76p7i3BrifiROskw9Ww5JfwHcU\nrdmrvhObK/1NeWLZb2awcszDkKGezXdk7WAo2dMu2iSc/u0tBjb8t+AMw1CY\nh/n7mvpayU58DD2xcOYsKKApbaR1fjZaDXs4E6N1vgzhVI8prCyN2737q9X6\nz1acHtzOfQSyBxs9mYWFSgQclzoyacqkk3h2XyCiJ4pu+uPJbml+uhNIr7Bc\nf2zH8wcrZfb3r1pDcwkEQPqLiVQ0wuhToPn368aFNBTMeo4WRptynacDIpZt\nPf65hu39wVi1qafEfpx4/V2rIMrtE2Qewa/Ho6JbL0zWJdJMrrdC/m7HaV5p\n5z4Mz3SRDyqUlTeJ98ZHaTBTL9IhBg2dA5Gu41MLgDvBu5OfU/mOKjSMuPNl\nzBHa91mYK/3tV3zm/o9IBJpvcWoka3beiX2WUVwSlJhUtoywxPSGNCPOO8Km\nECg//bwSQT80Qp6osrq0JsfpN4lh11H4Vx1EcIBcGg55YQl6zXwzpHy6YklA\nXdPp\r\n=Wdle\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCCMd4P/JK+XOgPSuzbjtI8kmx4coCBJtxB3iy7/IOuAQIgPYg1G+8Mc2PSommeP1oGWg0G/gPukwGrENdTDiy9tjU="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.15.1-next.0_1588861755902_0.19155363996760633"},"_hasShrinkwrap":false},"1.15.1":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilot-dev/sugarbowl#readme","version":"1.15.1","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.7.0","@skypilot/toolchain":"^4.0.0"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.15.1","dist":{"shasum":"b5137c4ad9f469b2dddb4328caece5f2f790fc6f","integrity":"sha512-X5YzyqMoM7l/CiPi8/5hjJmLfgQs3GTcqap6xDTI8acF+KpqRaYU34rTVwnGU5aP+2uJSoYZ/qtKj7HsmcoK1w==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.15.1.tgz","fileCount":127,"unpackedSize":63616,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJetBvYCRA9TVsSAnZWagAAvqwP/0JQpVCwWTc5vU/R6jqE\nMSkCK5A7hdOsIC67F2vZYqg/buI1MAQ/ZmSpy+jPtigowNI30un8iBA32nUd\nwBKtTCpg6S5UugK6N0NuXEy0+5weyTJHha27wWx5R/on3P6+/OOxuJbKRA9d\n3f9KLljjkEl5VyXcBEmqnfCoUCvmldKVGFUS83ORkjKLF+5i7S/FHXR9OWEy\n7i6Jw48xdxyWvq2MZtcrUN2TZFgmB3DKyVhg+bspfMYX03QOyMHryI67iPB9\nDylMDJoGMj/fmuEy7oAb5MlBu2oGyXak1kjKnXAdgpAxm2qH/hehk08ANkh2\n0z/YVTCSd1uC78FrfnOIcqvDlSuj4Rn9SjNWTnQ0wADTMDLFK8stz24Nv6UU\ndMz9X0hB7Udw6/Q0RLY5oKO58UiAJuCnSJxSLKx1B2Wi/Omd02V6BK56VI5g\nLSUaylcyznmgPZNLVAmzvWLX5Fr200CQt1wof+N/CBcqq+cD7FaRZg8oQ5pE\n+hrhAFiCE3pGTaoB9ckRQUXdg3Zx2LyWucrdvqIf0kecaJU+tIwhfnIV23qF\n8I0h6YOATvb0c+pR+7gj9Kg8BUJd+08Y12XkOmjcsrG4+msuUdVjKZWwq49b\nDQIYMrkchatjRSJuKMctfjhXiEWUcLNkv2QSIgt3yZKsWAnhe7FHTd6ybrdl\nSf0i\r\n=+mJU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGnITO+oMi3uQ9lj/n3tiEDE50iwJ/NBFcwxagbqa+VHAiBH8sM8CAgTw/pocU08T+nwSDMOfUt8LpvfFOTN2sNYkA=="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.15.1_1588861911572_0.2618016684189941"},"_hasShrinkwrap":false},"1.15.2-next.0":{"name":"@skypilot/sugarbowl","description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilot-dev/sugarbowl#readme","version":"1.15.2-next.0","main":"lib/index.js","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.7.2","@skypilot/toolchain":"^4.0.3"},"scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"license":"ISC","publishConfig":{"access":"public"},"types":"lib/index.d.ts","readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `omitSequentialDuplicateItems`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.15.2-next.0","dist":{"shasum":"f69bc8c3e6247b155bf2517546ae5b6769296fb3","integrity":"sha512-BKGpxC49+Go18nX/fQ/5PiaTKHtAN9FMzx4K7HkgoN5ZVPslcEHZ4spHyW9T5q747e7l0rT7HlxeQA+aam/mXA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.15.2-next.0.tgz","fileCount":127,"unpackedSize":63623,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJetLIyCRA9TVsSAnZWagAAcRkP/3BYlu/J7xrS/P6+EJ6Z\nt0g7IesnkBDDss1t1pK2h7NnOjdMwCqYGTkbr2+hNuK72n9GThRD89BuZlPW\nFoELiyaJ1A8i98Y+nozxgeqoS+jMYzjTmHdct3snm9qWC9Xb4x55or6PLYq2\nCP0Q8Bhc3kFnZNZIvGYpQz0ehP8nBpxWu85uyq1akfCJoYic8frKnmwUC0mt\n9/ymyORiwO6shZqDVQ3lR8L9u2JG+gd03Pkta6j6o7Ze92s4hdptx2ExnmQq\nxD8F41cSeGWIKuoGf3BsjNLYFMrve0YvPN+EjuSliibwLnv+zCfGnrEdY+RX\n3mNy8+TqxdIEU7IjyR61n1pBLlLNCmspIfdOGDIEN1bmN3ihDZG/YlkB4H2W\nc/C1Rtdfb5oi5Dvp3iAdtchMz1tcTHmjwQtpw2GPhxA2k2qkGppveq+4an5B\nxFowEbJdslM9idmZBI6iiqnZWKLVUeSxv7lA20yndNDV7BVOtblPRIjP173j\n5S720kgRkc2yELihRnrRZuyMo6cWnDxXpMcBL2GN3X0uenKGpvYpl113mpzr\nLsYr7blzW93nDwb8Qj9gsIV1IvGAYgeu/c9EFycryO3eNiMhpTOFxxjW8pa8\nYxjliEgs0eb1K7crRSl+8hQC0E2IsOkrrtPnSh6kZ1MKj8pErhWmLpuXbMcD\nTuEL\r\n=q3z4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDVWMS1zTnIncxnRwvAe/mJQ/uxZkT0AbBr0Z7YWl+VSAiEAqS7IJKtlX8zOZqSv/Ai+HJ16/gptmRI43wE3fRMfiSI="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.15.2-next.0_1588900402315_0.3709027232542683"},"_hasShrinkwrap":false},"1.15.2":{"name":"@skypilot/sugarbowl","version":"1.15.2","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.7.2","@skypilot/toolchain":"^4.0.3"},"publishConfig":{"access":"public"},"licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.15.2","dist":{"shasum":"962e2e01da88f7781de03a747f983d1296507ce6","integrity":"sha512-zcyk1oZe/b1D5WpVNYfsvs52suil2AO+QrD5V5wegoq/SbQECWzQmcLsIeJvW3c2eyZoJ8zUaiaSO7gh2033zw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.15.2.tgz","fileCount":127,"unpackedSize":63831,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJetLQPCRA9TVsSAnZWagAAvuMP/1VeGJUXxt/pi7PSX2Yg\npCjz5h13jQgbb3AS1R+mbI5F1QCUwtzTd6HKUvGcBJ108EQobbA2nKoiXrTq\n8giRPeH1t6NBOQV05GAqsscLNSI+oNJ9DHqTJVhpokDeJw//JnuiorhPyVbM\nLwsWIgUmYE0mmuzLm6LXbKVEb8KoxSbcHwY7IPB/xknPsyMVoDBd5WuhKCZf\n7GxSWFZgyFZOoZOI6g3HNhT+nvNwUnlTk1sxX/x0ujUMyg+MKm7Tdvthxvz4\nligBfsLUpnTzUSchqmONe2C0bgKKw+ZkSWusqkeHdTwOjmlVLEAoaRKnjb4P\nIqnByaCszr9wtECG2pFlp78hkwGOqhsw1+0MJLtBO1W9X3LTK0XiUyr+AGKy\nJdjGRXZ2I1L8x+vcGuJc6p1qf07ZGEeMGCowmt16IUcnPhZ/i+Dkm+qxDnrB\nRiLlgRi1JjsHnfqYUziTwAJkngPH36xqU2rDGOkoXS+9rJhdLI7xt3BGyxP4\nPV80Ay+FkN6Yel+2ygzSj0sA7ksYg4X4JJSNC7rFZQtqZBqHmQ3aW/gMvfTg\nVSztnlmuPoO4U2PiRfUFIZR/4UMwe+wIZBIeiarUMkSoPHUex0ZXbiZr1Efq\nYDZa/XC1x0a5BCprLYeEjZofpd3HkjDJGt41hfLlJwHoVDVo2tzlCBIboxWQ\ns1Lc\r\n=sGkT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAE8cOxx2rcMKQhBMV17NprTG2QYneCaRsmZKVyX43l+AiBIbfsrwVWCD60WwkpVkanIMPzlzSUZhUkgF1h1tGEaGQ=="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.15.2_1588900879388_0.563776629784833"},"_hasShrinkwrap":false},"1.16.0-next.0":{"name":"@skypilot/sugarbowl","version":"1.16.0-next.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.7.2","@skypilot/toolchain":"^4.0.3"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `omitSequentialDuplicateItems`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.16.0-next.0","dist":{"shasum":"4a09fd075172e3b09006c2de60e8496b0e8d7f7f","integrity":"sha512-PKvw1tTfals3kMKNgxFTdwtRS+IsT7kRDHCuLHOtPhamQLmIrSMGIne5mn+g6C3eGYpib9T65qA3Kc8Xljg9nw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.16.0-next.0.tgz","fileCount":129,"unpackedSize":66211,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJetZWuCRA9TVsSAnZWagAAxeAP/jcMeu0jQ25dj5lw/HwJ\nBtKTGl+kge4PLb0uyXWsx3K7gO9Q4EAMgVfe/rPaDlqf6z4D1Dgq8HFmzoML\nFqFug+ZHG/sHoms1OHu5YeorBS5QFJ4WIj+Y/q32IZbHFQRrHZv11hTtOyrI\nct19iyrgwejsljmNz3v+DpJCJIhsmPRmcPStuqp3e4iGkykmaXK3A0ph1LvK\ni8ieLLS7pvkAMT3uHpNTakzAJFMzzlSiTHIsdquDepDQdjjaEWqZWM3bV1JA\nwjh7bNmBHcACyY4tblUcsATHdhYjpyVZqe3bs/CEZJlJRpcyo3K24++Fh+FC\nKrqO4rYQe1DEshaLOlD1R+ZM2P+QkQGLiuemXi8LJCC+1QMfotS00GxlhnZb\nIgNyXFXsVEcNs2AfdxrUmJ61ZN0BMRTB8px2ox1J7U5Htg00RWRKSj+A/8LT\nNrtFSQzi//Zo7vndpUaxCmpx0fUsgh8lNObaY0rtuZaQEwUUqUU5SrWVJx6/\n4PfI/WxvNdrGCVJj+BX/gj+VM9wHfv2Bs6cAA8XbtxXrvgP8tG6g2shtLF7i\nJKF3oogknU8hiRlKF+9b5DcVfGdu1yS6oRsu/Q340x2fWVJDU2ULR6bg47EF\n6VjkX4o8CtQBhEBdgICWFoIxp6/vFV5sCt1UMoOSTPNBkIxgboTCEuq++i5T\nm2w0\r\n=0ix6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCba0DSDunu95Vwj5lSwsuXr752lSXWuH6+BpmdwDR3UAIgHRmf6PIbCDP2mVfWQKjXhoUDKDcor4v7Sb8nIxOdr8k="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.16.0-next.0_1588958638361_0.27873728494956906"},"_hasShrinkwrap":false},"1.16.0-next.1":{"name":"@skypilot/sugarbowl","version":"1.16.0-next.1","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.7.2","@skypilot/toolchain":"^4.0.3"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `omitSequentialDuplicateItems`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.16.0-next.1","dist":{"shasum":"eb7fffc9743840c015125c633bc2733136f5421c","integrity":"sha512-X3WcgLeZVdoDXW9hP07Qw0CcNGEnh7glsIK6wChiCc4oi5vaEuDJN8mDvQjvgK1miAW7pDROJxPfT1Le+0BBsg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.16.0-next.1.tgz","fileCount":129,"unpackedSize":66959,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJetduYCRA9TVsSAnZWagAApIUP/AqcCe4pBlgNEyBeoSav\n1SO+rJWgsXTVTNXIZq/N9csOOyWdppKEbHqRP20cdGZj5RGtiRj6nwZhKln5\nzusMc84qpktiwPcsRh2IVa4uTolTGkmux0utYEUY58LsmUJu876QOAtPuAyE\nSuuY8BMEvT5K6d2Zf3UZbwpxyQ1Dx7iJCn9PcB8rkNt5awR4f+jG2pxVQ1k0\nwRP3aWiwRQ5M+3Fc5KHYEp6+DwraN+hNhy4pzBA+Al0ijmmseGElW5QdpmeG\nMpKR7rzjHAwBFME0dYKG+YxDl1vxjESVOuxi9Ri9Mb+avdVeORMYt9eMAtkz\nMe2G7dKFCzn8n96iTzy3RhaPpB1mEBxxHfHIpxzOqUKdupI3W1EKzI6hrBT2\niWio1auC7/uZQ2U+DGZuDExZyBvNkiXf7VGHCmYiuwcY3wrSX1FKau0iWBA8\ndVzZHgtIi4q45yS3K91+wZjWeBYgQpJjJzB3QDuE7kKAYMvEuRg6bIaXh6nX\nQ4NpyRMcGnxNX2cbulzZLGlYeKieCu5DordMRcD3yK3sHH0lvlHSM2nsmKWm\ncAqhIUae1P/BlsdolGe9/ip0ghG+Lp0ZYufBLUMUVBwPhMsNlV3yNAqRTnyG\n/ZieC6+OgZMBfad8Oa2CPcSiOXo5YlFq5KmQ5lzKAjke0J5v9FhzwjlbGr+E\nodsm\r\n=qh7Y\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICWnXdsk9B+uLqeCJ1L4uzRvRfdAI8N+LKG45ok37Uz2AiEAjAu0fwgT3KIZ0GdEo34aarbYXY9rFskInctJD/XRvYc="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.16.0-next.1_1588976535758_0.07246154610013633"},"_hasShrinkwrap":false},"1.16.0":{"name":"@skypilot/sugarbowl","version":"1.16.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.7.2","@skypilot/toolchain":"^4.0.3"},"publishConfig":{"access":"public"},"licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.16.0","dist":{"shasum":"86efbf4c74dd7ab60a1d86416bf06f631917b9c3","integrity":"sha512-BCOYgV62w6g3Xk/svausMNJ1Lo3B/jmcR7IPfVX28x+3rolg2+zBwW5byoSfOHNu+Cxak77uWwFbTCfwngFa/w==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.16.0.tgz","fileCount":129,"unpackedSize":67974,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeucK2CRA9TVsSAnZWagAApnUP/isf9PQNxdJ2Adgs2uBS\nficv+YkFWF/YGaXxa+73gg8Hl5YPgtdAyw62xmjhgBz+dmpfqJfh4nwG8+X6\nbUSLFwUtKSp8/QbEx4+OWGBLJDJeTOxKIWDUcDWKMv9o3xf78gdssXSkQKZo\ncDNKki7pxDwNmJLZFjfjy2pBN8QtQRjzWATDIdwCtfFiIbA94x2D1wB4q3ih\nsMf1kyJoCBN8R9/dWOKYz9k37/9Ko/DzDsAKAcu7nOZUqGee8yHVVDtZcHbq\nen6wKJdAE9mXo+3pH7/8o3ilNrEABjYjbgOF8qKh9GOvaccPINCsERJ72Crl\nY/nlQ5OlpF3N9MqAKLH0EDB58+zxnIlMnvRuVv3OEo3tZ/5HMP2W0TD0o55C\nHw46hxluKS3T75aaYlTs2HDUmCb51TUXiGn3LFAreIqiZcaSAxadUQanoDB7\nNjXt0kQlMkW5RyOlaP4ZUe50xz7fB/rmwbyegvgfAqwH8bysL6hoEm0/Rudl\nVWQ3QjRArx3YWeA+d0+3ns0f09CxgF+2cuj+5t2Q+S1Xkna+8Lxbh/3vaZG8\nvxNc0Z1piwl8k9orhB/5vq2v2CCHsjHgUvtj5NSTKT5vwwJDhLQrMnC3eu1x\nuGAfHEL1/TCJz+FWxeKdAsT8B4kfWU1Ur4xsAao7xsbIMz53LYrEAw85VakM\nhI1G\r\n=8dI5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDdlQgVCINZX5puz9nyXZPEtslhAEI/eS2XLYqfdwW80AiBIVYiSH5ES3Zjg8G2kZkkgtGHVQ8oNTc47h1OQEypmnw=="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.16.0_1589232310221_0.4640760360924432"},"_hasShrinkwrap":false},"1.17.0-next.0":{"name":"@skypilot/sugarbowl","version":"1.17.0-next.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.7.2","@skypilot/toolchain":"^4.0.3"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `omitSequentialDuplicateItems`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.17.0-next.0","dist":{"shasum":"d66507f1f5c05bb6653a84ca6a24ef598023493a","integrity":"sha512-/4o1mPO03GPJfRQe/1aIPfSB2LxvI7aIZPidJlQGOQZI0HBmTF4ij9RXB6Z7Gr1mGn0ELE/vU3vC4DdH2ED8Hw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.17.0-next.0.tgz","fileCount":131,"unpackedSize":70803,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeu1ReCRA9TVsSAnZWagAAv/AP/0jzvyzBVm58VVzKXhqf\nTrUkKFJABgjah6nkkH1b/mOHdXZyn8Ovr1FaKnhd7akGj8e0y1AghQvDQKyT\ncsxmICFeHndtoKGUkqf7WInEKRM5W5ZajOlhMC0KRBMrXfgHHgXrUILtFFcz\nHzboN09P09Cm2/z6K2HDujTCPnVBZqyBhU6Ddnsz8j7LGPL95QhwRgbhatNV\nyrPBpHt+dnlCiBJGA7/oORRdMmRN8Z3ytd1BFyc33sfkJnkfFEnU97Nv1m+G\nyq+PNbBlJ9o3EU5OG3PSlQTBcyxl0bBhKloa5P5WM5i8O+bHFCVdGsml4XPH\np8X7yOyelzhJBa2H1wB4HuPINFz3ft7sHN4GQGo+B3zZZZOcXT1+HmMSyWUx\ncKGF+f5FFveLgebTCP06LSWOlg+g1VsLICLb4jr3DeNLSA4cPZ/IT6YxQsQ3\n1AicBCtLr94101IqwhkXBo+NJE7jUQgLCS9aLBS0YLv2Eq7CsDyblgTe0yOX\nfHeeIN2jemKSRxWXv0xfIgdSY1X8IPgLZ3l7MOQv2tNKqKEUox8lQ/ZkxVlI\ni0XGax/SXwyZ5xh+yu1tsa0bICBxE+elwb2GkId5cgPp5LWOooIDsBYBF1ZH\ngUEmL6g9xG8y09pwXIO/2VCOJhLKv1ZbWi8LnpuHFnQUCCyKUPV+GuEEwqGN\nj7h/\r\n=lGRF\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDl4tb75T8Aa4Jfi33tc6tPVZOeu6qeciUWwyL3hu/zrAIhALmlrIhimKskmDnUDgcAxjxNL48i4ydQOOkPqBXlZpaF"}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.17.0-next.0_1589335133610_0.4734360414486356"},"_hasShrinkwrap":false},"1.17.0-alpha.0":{"name":"@skypilot/sugarbowl","version":"1.17.0-alpha.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.7.2","@skypilot/toolchain":"^4.0.3"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `omitSequentialDuplicateItems`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.17.0-alpha.0","dist":{"shasum":"36322984c71a0dc5c5c3a334921ae75af4702334","integrity":"sha512-mpMZMF+XGlzpCppxGMhGlCC0p4gVJulE4kwE+soBewoUlspw9jym2AiVggKer9VIDOsWCIPpI3ivGiBbLOiKxw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.17.0-alpha.0.tgz","fileCount":135,"unpackedSize":73079,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJewKD9CRA9TVsSAnZWagAAETcP/2BGxzXyN7eGLka0ULq3\nX4qUFEgokqSzOJAAwm7dnotI4Ez+28KQHCQljzbVMl++kh8zssT6GlkBlACY\nHTkcjEJ3D5OE0GPDZ6XaDyOkom7yX0SWaqnnSPK6MBvoVBELce8F+P/M/CO7\nxkVMn2IvCuoOtkvPk6YwOBtKrVjXMuhNBwraOw4ekKAGIpYZ48IaB+RZIkvv\nCwKOCfTTTRd5Men5EXbBZ77wJ0ZJKVJMWMC6+Fzs9fnwTS52xlGXv+ara8Hx\nZ5z6scRXTJ9qRibqPUg62CydAVVIMLk/E3qTM+IJLTd2AUfU/ozRY8/fHrWE\nkyyKBjXpj1695wBdd0jlHe4n5yyu3h9CjAvP5kAoahE77efHqA3u/mBj0ijk\n7HX1WetnG6Axz71IKkydbSS9lvKtdQuVkrlqunYLvsFi7emdmY+Fc7RJ7UXJ\nM+Gv97BytxjAN0AiQY9wC2EcSIn7sUxmK4EN1B6egn3UaD7Vr+tR7XUjvNzq\n7Rrn/8sUnYsoGwTVkvrPpV/EoVfgEaeYhGSH3sWEyx9CLiAbKgOdQnGZwxr6\n4t8RAaWcUMjSBFkIBIYhHJHR3pCSuTOeX3itxesHae5m0Hnl93eM2N7G/dcq\nYHiMvZFQ7WPYdv7Jf07ZHPt0RwmeE7ij31Q+Jcms34d2Wm9NUpyrWg8mNhuO\nHANy\r\n=VV5S\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBVDpzaoJMpxKw5WZvMSKIytoET8dYNYcAGBKeaUE/bPAiB+fAiHtfNadMUUBNo6veLSQRgKmYO6XK26M3D59sgatQ=="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.17.0-alpha.0_1589682429145_0.7811500974353689"},"_hasShrinkwrap":false},"1.17.0-alpha.1":{"name":"@skypilot/sugarbowl","version":"1.17.0-alpha.1","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.7.2","@skypilot/toolchain":"^4.0.3"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `omitSequentialDuplicateItems`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.17.0-alpha.1","dist":{"shasum":"3fc22d3a0b875542914513daa0bd00b129470578","integrity":"sha512-ZshXPT/zY8oibXNeqj8Xq8rGe5TnPUpqmuGf4SK4yi97SVup9mwxZexatolZ25FzqlRZndJvet4dz4uf+JczoA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.17.0-alpha.1.tgz","fileCount":137,"unpackedSize":73794,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJewYkKCRA9TVsSAnZWagAAtB4QAI7N0DUefGznylDTQchH\n3WO6en+CVeVUVD2FPDV0zyi5G3BnPOVKWDIcOQIonmGQMz60jC4lo3Fg2woF\nNa589j/+qV86bdSroJ+aTePLgykCsVn1fm1D5AiacO8HrlLPTslGdF1MTbuS\nklFQoa7ySEGbV1ETLJZEWD6dwanqJIvymxGYB9Cp/5h5Oy//46/Ey9zVraIL\ns2+lLZYR1tZnpXeMM52M9sa5U94LnpyNz6iSFMEjmrVcDfLHouV4qP9u8CU1\nP8pQ4PWtcwtIo5kjiXdH3Nkh9sDKm16FKN5xhLSYXYg5OD7ORF434S/R2ICI\ndZI0e3aeScreOW4QQuQ/uVVpRy9E6xkd0Ur/JTneMySCmFBql3zmaAyryRhs\nH9+a/XfFmEgrUMAHKEdhh1U4ZXquGCmtfenK2xFLctu29uY5oeNW56+Yy2QT\nBWsr7+/unLy1YVwpAay0x42KzqLN3Mz6UYYDfh/rsnjvEMOH9qxK+Nip2pOK\ncI2lYCu2o8QhPnIgLRTwF0uxYwQy3hpNbA+R86iZch7dp3jzAAZLCPFfnQlx\nzojIz1HJAfr3MwWdGsg9jsnlqxR8dMol/ilbmzSoPGxLYVNPb375RFqQ7LcI\nHIS77axHZj8FdX1e11zSLjvRlJoXB8njd0ajl47yJOi/SfR+eoCwiL39Wa41\n3OKE\r\n=KhVY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDDgWRK3IIQiAvSvk8h+wI5w8VHhutl+rw3YxVX/VhOXAiEA961L6Qt/TAaqU5CffX6iBGPMQLmOQ5PLYFpFAJ953hs="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.17.0-alpha.1_1589741834217_0.04240237947790826"},"_hasShrinkwrap":false},"1.17.0-next.1":{"name":"@skypilot/sugarbowl","version":"1.17.0-next.1","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.7.2","@skypilot/toolchain":"^4.0.3"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `omitSequentialDuplicateItems`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.17.0-next.1","dist":{"shasum":"66a5441b7eb86f28cba18d814d91a132e34c537c","integrity":"sha512-bpRBk0rLHfCrF0ssyorHBaiGRgxG8SDgSZ+iz13bzHHArpQ6KMqpJuW2m/oAmR/bJjVJTj+SR4/74NwgLptaaA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.17.0-next.1.tgz","fileCount":137,"unpackedSize":73793,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJewalQCRA9TVsSAnZWagAA+OQQAIPaq9tpytT4m3dQov50\nq7SNuJAI3lwHlmkKx8heI3ZQk64fbrg9RJATfLejj/5UCfK0hDXdETOqK3UK\n3bwurGOA/XMt8WsX5dla5jfCP3VCbWEAO4WcSdfwfKzmSGNgI1nyEGv9y4J7\nLWjFjiUx0/+ixjjpH16kmUijFf7usXkwz3MESBpTGOVpHKcBxWmW7BzGzRan\nLmOCbUJSPOEN142zEoKQIPzDgvpqd0EK6lhcKNjdR0OkkvmWqc60uPtfQaIY\nE9lsgBe/X0OxoAVAbe0Nu5EZVdJS0SyaVqbR8eGXQaDZcociEANapHKdaOVz\ntQfMi+/x6uA1NIvT7FpyW79JtT2mg3K9FJ7LO7LMq9SXpvjz7zkiFucFlth+\nff6rKgmOn8Keg9V2m4TjAUpuqIAvfLSg3pG0VVfC3efCE3WSkzCqzIRmVNuh\nuEuUV5JrYm0TVCODhmBTFG8aZeq25cxrq+P4z3E9mA2agJIg9bB/Mk9Mdtwn\ntwBHXrLGxpifthpxnGPCEvbutjx0/x7ZiF4W9rsbB0C4s81N3YDSHhmYEIGF\nJWUNHqSuKqiIGlIMchQ2JySkjMpo9NWYVE4Dyw1H58TtpTCozPzgYbWUDiCq\nP+Soj797VmXRsHur75jPMtfWBCrPgKnqybQ59ds5qw3ZpTLjTucgAD+O41BU\n6qkp\r\n=Z1e+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDiiZdJGsNOTvHgJry5CCQDjD+0irrb7u7ItU6C+9um7AIhAIgWVgdf2LZ96+PDKif2IhFxC5qVgdCCFPpRc3KjoHD/"}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.17.0-next.1_1589750095697_0.2905746634388995"},"_hasShrinkwrap":false},"1.17.0":{"name":"@skypilot/sugarbowl","version":"1.17.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.7.2","@skypilot/toolchain":"^4.0.3"},"publishConfig":{"access":"public"},"licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.17.0","dist":{"shasum":"77377a37e75a1d680b5faf4bb902693c69a017ff","integrity":"sha512-oTN+4STrFXUkjiuWX0ObiPMf6Ra72mZyQB37U1JYPDFEvjmAdNExRjHAb57oYi5VbNGQZZ5T5Zsdp828z/7/Dg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.17.0.tgz","fileCount":137,"unpackedSize":75017,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJewap4CRA9TVsSAnZWagAAHZkP/1xJSqpfLKNwX6ZPeq9I\nJ3GX2VO3Z8IosO0iyLA/GaM8HrzLMt/wYfIRqNIqJ5sCc8GhaKWhmng8e8Ih\nwhHqZ/bxAFboJjspd1Dcz4y2dvV0Ip9UD+pZIuf1/MsG1Q+hZ64qmml4S6wH\nVZdT+4hfBe+JeVhdrFgcvro16o7CpFB2//EI1NI3x6sLhKIDMppre4K4mz6p\naRIlb0xMAyeE1G0RdbZH7Fs2v4hGvxXfBlokG4n1O+RSgm+veFKQ8QJ7MggP\n1dCNAlYYsB5pofT5eNUh7jJ0xzF/7Nv2nENu2hm1vRTWznV/lCQWFe/aNZl+\nB9D5Tu8AS/PiF/n+OhllCod39jt1pCMqXxnID4xxfh8W9RwISXbsDi3wCqzl\nIkXCabDHgLKjkMCHPBfbLJSP0OO8zMr2qEf61HjVNTo+Kp9FgGXWLiWLxbrT\nLxcjMp7WXFhzKY/bXm4+wmky3URYQYi2a240qBR9103kAn66uAHPBtiPvPvW\nPSMNpFLZ8Driok0nmmf7DJxja2fxgJb5mB+EggFKApuju45sOy4xDIbwIb6R\nyjGhxTxlourNqr9iKk7H5a6apax7L2Ke+ONX6GVYpBB6eRpToyUYFkM115ad\nRO3U6pDh20HcY+OUNLvLvMk6Q8gjNg+IybMhGw6KeN1QpMRvGYz2t/lv4KBj\nfILp\r\n=AQ/M\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCLMvwTnriUF4fp/31sh36KKZ/0xpuh+bT1maCwowmCIgIhAP1hp6+ks58iAWnCEv1tJx1unexzFMCfYLWEYaFb44vg"}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.17.0_1589750391592_0.20696501310959925"},"_hasShrinkwrap":false},"1.18.0-next.0":{"name":"@skypilot/sugarbowl","version":"1.18.0-next.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.7.2","@skypilot/toolchain":"^4.0.3"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `omitSequentialDuplicateItems`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.18.0-next.0","dist":{"shasum":"51289f15465396892f495dfe5b2332faf4cde336","integrity":"sha512-mPRJLb0u0ldBjbElr3AhvlXd7AUbbTr1Z3c85MdT7M/00LRjdDlJnAa6/roB9zwwp6CRIoRf+w75VIGd/OstuQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.18.0-next.0.tgz","fileCount":139,"unpackedSize":75925,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJexLjoCRA9TVsSAnZWagAAhBgP/2YF+Ceu6QGPp41dCz1j\nzzxL2/zBROCc16yFhUew2rI1EmhlbKoShwOGQ1xIfkGdq7ALY+lPOLD8k+UJ\nRa70J1I9rAkDopp1xIXPTPESz1yGLz6rjjIguZxT/VwU6HSSz3klwbd8CU4W\nJZkC+8cKe8C5lRYiNbaykb0HwmVsHbtH/VSZjiq+m6NwNYVLc/XbQxxivJwL\n+RS3JelX3m430kMe1g5zYrrLRhblLtYzt5oGPmyeNLn/9oCsOtW3hQoUsKSn\nNbppsL6viZNhaw+H+DnvUkblCRmvz++EN5vfbafVYRTWoajP49NaddD+LXsD\nugP6ZCmPMerHFbyVuTc9PLPUbZl3caBY/nyZD+tNrFTu6hhYPxanerX0DG2w\nnQ0d9FW/AMMMFL2jOxZsS3Hh1uCw/SG8A33vn2sba6XEEz4u7rmUfaMRWIKp\naOzNJ3gEgeWh1+CJVsS7Vy56EPKp59dy0ZGG/w98vcgLEcFKUIuaTKOdl4iv\nPz1AGO88Wii12zMP6VPmCVhMN7Gj5vT2ehFZSX8UZ7NdbhVBmMv2lNNUBusg\n0m2JlW7opPhLjPPR/XHcKLPJ+iL2LkHmHypM3mLNO511UY6kLyPCBZEpXcz7\nTyXR8ZeEm00NhMQ556qA0NEMxkiUSUBFo6QoMQAR+pSO3EhhAVVdR7GliVyD\nWeCa\r\n=2v3f\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAah/2kHt7TctDf7OSyDNzj20ir9f+Q7mIDqGVs+5iXSAiA7EShPgUuF8e2kjZ0hPGcqGut1gXPIEX9OdDlH7G8/1w=="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.18.0-next.0_1589950695770_0.15141288288576615"},"_hasShrinkwrap":false},"1.18.0-next.1":{"name":"@skypilot/sugarbowl","version":"1.18.0-next.1","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.7.3","@skypilot/toolchain":"^4.0.4"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `omitSequentialDuplicateItems`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.18.0-next.1","dist":{"shasum":"d4126116e1167b184e1ab4e616d69c66e1f469ff","integrity":"sha512-2ixeuHC57vQDXNBrZi9TsaC58BQnjRQDyPjPbMFou+FpwaXtgPzPVTVkLtjpGCQniYUAVhvVWKe93hdMCzTz8w==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.18.0-next.1.tgz","fileCount":139,"unpackedSize":75925,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe0pyyCRA9TVsSAnZWagAATmcP/i+wFal9B8LqF9QVKqqZ\nXmNuLoI8gZp+/SgXDBkLSxTQiYz7pGleTlMSeVh2SsfZx6yaUv/FvKySPvHz\nVBy0T3jtY3qU7DgLdyw84blmbLtMGZumaeT6g020aZ33AK5wZU2svzTWrMN7\n4Bk1Oa7mCieoxymCi+wzkr5HUNaZEdx66KSP5gwvUtjYWa7t+sCZXH1qunrx\nE5Gt98Xwun3zy8JEpTMBxVtK4WUPXL4kS+Ln9XKOqDfhpMpstK8HrR0yc9Vh\nMC9DQRzJP3b8r8pRelLtGg00aWWXnwB0Aj1GuUAtTmxuPhim4JkwBgCe1by0\n1e6cCJO5wJ1eo/MIX6f0+LkVhez2ECofmYU5G9NzZAXqLXSaPmPwoaOZqL9C\nP00/2MyVND2tbOAuS+OiPLU+hg4U84/P667MDiJnnIWlaRG2p8Ps/pIjWeYf\nI78sMtzFf1mvo2djAVWzCZgdnibGs14+UIcHRjzUm96SyWOBYdWyXmjn8rX2\n/wPLMWE8XZs2LMHCAqoJp8DeM8aPWhEAEeEbMz0VD6/Bes0uDtkbEvzOei1i\noL3EZfrz7cTNBDAYzpv2ZcOi1buESdJvqHQojkL1k65eajp07E8R0yA1CAc8\nXJibxtoI8fMudmo22IGnlp7Hds1CmBECKU9INyq3YWFa2y/iK4BGOEo6j7/s\nzmPM\r\n=Oq0E\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGGvmhEOro2YGLmY04lCUmJZixkMGvXYL4nj98YT1XmOAiEA6lLWz9GTKGz4cOl6+RlV0wFkPXeetlDb7CsfNmachjA="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.18.0-next.1_1590860978026_0.17856620702188097"},"_hasShrinkwrap":false},"1.18.0":{"name":"@skypilot/sugarbowl","version":"1.18.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.7.3","@skypilot/toolchain":"^4.0.4"},"publishConfig":{"access":"public"},"licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.18.0","dist":{"shasum":"e0c11d6d15eff5221a743d7fd53981ec7162623e","integrity":"sha512-2JKPfrEU74P1VSlOFbWweXyLlXKEnq4TpCbdwxJuJakllZ4nJ+SzK7vrVnXK7XZFfhUSw4KNE6lrd730XQ0nyw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.18.0.tgz","fileCount":139,"unpackedSize":76414,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe0qwJCRA9TVsSAnZWagAAoWMP/A4CTrVBi/Q6Jfu/Lbtg\nsrJAiiXPupF8w/Az4N2N1qtIXblWnz7Mbz7wv2skDDX4orczSkU1krwDwwlk\nbyH5BCsPSRc4toJHC61azh0L/TqsDeShhAY8EUwZl83U2pZGVtSJqS2+ifZb\nH1S9/oKRx3R38O694wB5rW+tPU0j9owRzUELa4OQtfeshnpjxySZp0wCewOP\ngwb+WLuL3iAN4on8l3pbXoAitFxfhzG1HzvZMIJMhjHznPwUTKnq5xyDJZR7\n5JJCHdTmqMV4s5oJaCAaQHYldQdZnydbCugngPDSxpF9YCHH65uVfE6EdLuW\nhw8+V2FcfbSMpG6MeIUnS2YFv9W4FqwG2nXd6f24DluEUZNjtzeMHuI2oojG\nxeoBD8reSPR7RPERByu+Xl4qrNH2EYQeRX32XhsNriT9iFWJAbIR1S6pQgc7\nc/OHlWvzjjtWFb+qz0kJeS/Kbm2e2u2UixuqqaRS7zCs+JO6/d1w/V0HdreW\nHpwavoEjRNP9+gH4LgCeTu/dKsd2sr2Ex7XoeTGCZ/JY/q/ipmxXQpOKRN2V\nZrsvSBlVzJJ9q7srRmq3Pr11Qo/3IP5nBpY84t1xcyzq+ayQZTQvFrOoJC1+\nHEr4KyZqXeJLQm84rehI8EGUINjqMSutsJqNEQQ0xW+mQQ9uDZt/xq53N0sv\nENWL\r\n=LkCU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDPiCyKdpozGy6put69IBl4j647ypPtFIWTH/SQgNptFwIgEV+forEX6JDIO5xaqTo8juWa7iu9445S+Dwi9Wubwik="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.18.0_1590864904307_0.9653760245953342"},"_hasShrinkwrap":false},"1.19.0-next.0":{"name":"@skypilot/sugarbowl","version":"1.19.0-next.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^1.7.3","@skypilot/toolchain":"^4.0.4"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `omitSequentialDuplicateItems`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.19.0-next.0","dist":{"shasum":"1088c4ecbfc93a3c5be98534b16bccb34fd17f5e","integrity":"sha512-B7iPL/cAyzUOqJr8dpXsD8z4xoN5AOtKX0UWzILTnmLezKy1GEo14hU4Z4oxmTi1thN3vtXe0oFakqp09P6sUA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.19.0-next.0.tgz","fileCount":143,"unpackedSize":78039,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe1bftCRA9TVsSAnZWagAARnYP/R0bsMhZWtY4bGZLiDJG\nOVR/2PV9XNHFre8POtsM0azB5B1dtGZNVNnW1ZB8xdBP/lkX5ozJMmJwk7IR\n/ba4ET9fE5Kv7bjjpPf6KiEkFgHdfblHd3w7uQnxyHedMoBXXlu3tgcr0iw5\ngDlCOPukz2H2fpcSxt5a2e21CWLpUdGzX8o2ObYl/leYn1UiaugduXrrGbE5\ngzZWF+0MDDKXScZTSgEAMF240+9QFKSQvpsTvwp8w0DJfE0ze/ejaM4D22Y/\nGhg7xneVwFC1tZQKMidVIDBjiFA/lkjOmRiQKu801tqf58cpA8ggzon/RIHk\nppgrg2qrJOyPHADy9VaWm/Za8cgPKq6YApGwT8131NdvLnsbyJrO5R4HrxJU\ncgj2RD4GoJQnQJ35hJlVP52sconI97wENHS88U+y7M9MD/pC3g8k7EddnslA\nZvOzFNSbb8OWFR71Hqux1wner9yf4xIGQod1Ef0a9CHV6gKO88xqaQU1RIon\nD0japcBacPXbmJopEW46vqlan3u6Os8kl8Bam+ydgPA/y+2ZXew99yPo0z+J\nSggCDB32SYa75IdF09ruon8nd11ra8yVFSjFXSSz2I3Fqk/D4r30SS8+x/3H\nN3tlnjqzMNxFCNsxYAdaTmvl2LR+5+sktG9JrumarzP27bHZJCiXKe4HQAM/\nxZgf\r\n=eQkt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAqLrsOb4mgNB1j09j3Jc0zHAuLjy/aNga8EeJaKNxIsAiAzZ8seLZ3yE+nxpl1XfSw1C70LbE02PIe4Qt8rTfBmUw=="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.19.0-next.0_1591064556349_0.026875562035884704"},"_hasShrinkwrap":false},"1.19.0-alpha.0":{"name":"@skypilot/sugarbowl","version":"1.19.0-alpha.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.0.0-alpha.1","@skypilot/toolchain":"^4.0.5-alpha.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `omitSequentialDuplicateItems`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.19.0-alpha.0","dist":{"shasum":"1c67c82c573d04af96559c15c3d3d18311165646","integrity":"sha512-Jl9maTYgfcAT/mxEWOLOg6wYehvBX6nI3uH6uZLwF0iEFLwuQAdxbbT56aXdWKFPxX9+/wtGD53q1Ia/INgR9A==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.19.0-alpha.0.tgz","fileCount":147,"unpackedSize":79777,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe3wvUCRA9TVsSAnZWagAARXMP/3qw3AKqD4I65DX4+XMV\nY/T6qvIHgLzByzj3szc892pr47sZuZ8DNgGF6E7e8xxVnYpblI4dsffJowGE\nCBuiVvA3BJgV/P8V/3pc5ltNwFJN/xms59U0PTiAnw8LbO4t03rk5mYoD8yD\n9ywXxcX6vX1LExLEuh9hfe+pduHNDYo9QEGph7AhPL7VncX9bPuMdSSZvA6s\nNG25K1RPC4zYDHyqK/TC8scx/pM2aGjK7FDt/yfEqMnobWH6o5a7RaIduFaO\nMZsK59MzNvaE15DvDiJicRbT2Jo3i7EgDG9NLxml/zx8VLhEOKvLNWuHPfXs\nkCJ6q3C7sWQN7jJAqwZv7uug9il2PSM3HJmPCRHvDBeNone/vNpD2/3sv8G+\nmTvAiZL120XLPSgv4SMe1ESe9GQp0yF2GetO05fBGEYpHoFny5jkYomMys4w\nnRiaQYocKlNjIMTiFGmliG5dEM8gRuvuDca6C1qjXUcmUicwcc3xo7YlGWH3\nGZ1NPggrnUgPAe8VbgeFjGkOUvKn4NP22BlKNKIDje5JoTis0xHikpgapwAC\nZ+rdyyjGgSabHfwTaYGYB9FeqVoiMbiSrbDJKiKJfG35aIC+2Np8T0pH63m3\nY0GhlyIe0MavQHNyi9TLaa5f3Aj3bhXKr1vNhS1FvGMkjE9EEdE9KgrVgMdY\nmzlT\r\n=/5je\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCakiucoqJ+Z0x2+OfS38JufLjfJ6OgnQrQW0ejO7U5TAIgOphntTl+M9az2QTuNj7CI1dVtWtQzgIyr9JjOxhKZMA="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.19.0-alpha.0_1591675860029_0.06683222451353665"},"_hasShrinkwrap":false},"1.19.0-alpha.1":{"name":"@skypilot/sugarbowl","version":"1.19.0-alpha.1","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.0.0","@skypilot/toolchain":"^4.0.5"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `omitSequentialDuplicateItems`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.19.0-alpha.1","dist":{"shasum":"2b1f855f3a0f610adce862eacf4d8f57bc704cf3","integrity":"sha512-i2fkcCop31wnCneOW5snndyMCYqrr6ym51i3ItDv4USIb/NiErr0GxNKMN7O+dGAsHX+3ZI6QyG7Wdi+ldXPhg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.19.0-alpha.1.tgz","fileCount":147,"unpackedSize":79800,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe6V0GCRA9TVsSAnZWagAAZRcP/3q1b+Y7FyVeBdxop9Dr\n+lf3MEDhOHvV6mJWf2JQu5gBH24zX+aik+Kqno4rE1ZrXMHgQM7WIm/Agcmd\nsNweQeQ6wtX+zg0h566tNngmHNZnEXGWL5eroJsMrejQa2VcM0H3YBYPJZcB\nborQWt8i+qEJ4j9C7WqRpIvYPak7MFrb51L8422cjo8SMxPoX5gpuxNAq3PL\nYj6cRqiyd6TrD5QyDUIDcRw6MSnkJPbEtFzkfTLkWS/kEjPrXgbemZMCaVaX\nXyynl9po5d4+Xg4kZPXIKdye1UqNi/uWpglzpoZGDqpN90SnUivV7IMBCAHO\n2ody5Q5zkll+1i5XvdTzlluYpi6EHcMrbX4uiTaVmCZhinZHs0dVnbcrVpEj\nWqtuWlovyNGbZkgFG7wfsSTgBXP64NWlnBQhOEx20KXaB3bHNvLs9kw0ffqF\nC7epqglA0at3zONE1G2qb/DMIQm8XhWGOsLvBKBUcHr3rzaYKAxaqeXzlrbk\nUckldut4l3yB2ssFEfAi4dVFbuc1I02gGP+pp3q0X5bRUbJuK1dpgC1EXSGK\nP3BL80CEps2Cn3y2QfUcIyt0wQhml4YwuBXJ2PZCHt/dsHEizlWQMDMVy0Ou\nnj1D19hDreRpVwZgRs4njtxabK/eS89rDLGpD9axLxZg4DE3YAGpM/XBRdaS\nftgS\r\n=4o4G\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBAlvLJZaHl2FRmQhUnEDQXsXeDWjuQJdgp3kz/eN+E3AiEA0GzFd1TEWdom2ZuvxdxLeS82LV0V82tpDgyzJGWetDo="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.19.0-alpha.1_1592352005760_0.44559213899534345"},"_hasShrinkwrap":false},"1.19.0-alpha.2":{"name":"@skypilot/sugarbowl","version":"1.19.0-alpha.2","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.0.0","@skypilot/toolchain":"^4.1.1"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `omitSequentialDuplicateItems`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.19.0-alpha.2","dist":{"shasum":"7041d7f2df62ea95ea9649ebc0444b9ad3d89bf5","integrity":"sha512-+TZ2+GBN1IZxYZZPV2GtgO9XWlZk+DU3Idb+07vzpBw+HlDfo2PGuSjsjfzH7aaIkICFji+h4shMozSkV2fDLg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.19.0-alpha.2.tgz","fileCount":147,"unpackedSize":79800,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfI9O5CRA9TVsSAnZWagAAgSQP/21RJCCECJb4GzOKveu7\nlOTeABElQ8vgepPqWaGvTBBovum0sbSWHlOWB59zG9zQcHiivUEu+0NrSgWe\nrUpm82c8WbNqWfl43mllSmWtvxgZTP6YMglPGNuU6U+8EF0rLDfgKFprdeCp\naYCudS9WY0bOjTL48JVOtjaD9TbQ09gxRPojbfrMcn6t4T68MddytR6PAjvp\nPydTbYVpwFPPFIfQ56RkZ7KPO/KDO0x/Z8y+dKeguxY3boPj9k26Tbh1xO0o\ndgxkbCCqccpHHomns3kWnFDHFvkvWw3K+1BYsnUzr146blxCqop+T5Zi0/6L\nABKx4NSp5VUaQXN9Hsp4Knp37CMMhE4+25ZLj2BonWB9C2IX8X5X8jhseoNj\n1XMoWfyOY2UVUA8aFUol6UXbO823EfOWTykNavYEbf2AIuUl3kbXkRXcDEOi\nIajzRpHWimc/aRmbxe1vZmSK75TsguJEPir/U6Ojp07Myz+GLyinInUjMXJ/\nXLhKeeKFldUL/Qbw/E0l90N93h+xbWYRT3sbaKz6OWjohuHWf0YLasVQNt5E\n9VAVZzetkExZW2Vqc3cjuqKj0rC4WPwvJ0i8tI873l9n0sA8O+bkkKngkgqt\n7Asbole+KrfqHpP0myE6scBCUxmlkxHCm47wu3ydj7S7VOrc86KKdgwYnSZg\nWCp0\r\n=fUxC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDYOK3c0/YyA04LcxoiVq+FzrBQKK5ejKaqLvSIaKb1ZAIhALkaSCUxPAiJ76lh1SmtOvkc5amKHNYWupq0A7P8ml6j"}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.19.0-alpha.2_1596183481376_0.7295435837419451"},"_hasShrinkwrap":false},"1.19.0-next.1":{"name":"@skypilot/sugarbowl","version":"1.19.0-next.1","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.0.0","@skypilot/toolchain":"^4.1.1"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `omitSequentialDuplicateItems`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.19.0-next.1","dist":{"shasum":"7f220cd905ee7026f045c0b10189ee9a84eefd67","integrity":"sha512-MG6acWjDK1MX+WUdDwwoUHAukL3o5eSwPkhBbm63vylZjmr9Y+SsufG0VXup5nudaW9JgT9DkyHjZYp52gGYuQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.19.0-next.1.tgz","fileCount":147,"unpackedSize":79799,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfI9UvCRA9TVsSAnZWagAAvZkP/1YbXmmHYkZ+KsTErSWY\n1pnsFo0+nv3R4q4ehk0lyWZnSExFtYgjw+ktULvL21WA5TIZJYs9b3VRFPb6\nSGBS0qxecvzLHbYkLrqw22OQ79/9gSZd2RT6uU3qamIpa44GcqAGcjZ+2Ugo\niAntAJ25V7qDX5r8XdwZbEyl6yQT5hDuyzQzFZsFrmwm9JZoEfRbJgGFfKre\nbvk6pFfXZhN7EnwYRtaL7zZwkXyrLtmSxhhSgCfJ0kPq40FPbQAcQW9Fd+/r\nI7D58Vl+YpL7GvEx++yG4dAYDVyiv5mMJUdJYAZ0SXTqTckMytG+1Cg6IhbR\nVKlN+biSlw0JFEraQ5j+KRskHkB42+rlHRolvTOaqAhIkp/L93sjzWJJkQcH\nNbihi7ckMhWh5qgNUK2DQlpn7WPWMK0aU92XOFsHY0sICwdiOae6MgTTj7B9\npW4yqjHoHYtmGmA2dqq0PLGUWgTEzwvTOd5wucr5FV4hgdKs1mZZ0O9lfIsr\nf+s8mPaxOVkggu1WYVNLQfDHB0c7SPFRszTrqhfmCbuVBWHgvx4YO4cQ6/tl\nDvvVSk+FSIDkxtFNNzP3LCkpXQB6WiBaN2U532asbh16PiM67T72DDbneVI3\n94Ri/bWpZ07Ku/DNH/8cxH+ZXOrxCCM2ILLq7ksLiug1zxoKGWiRuDw1hTX2\npoLE\r\n=KCAR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDze5pkLWjQZc6x09Y1Qu2bopkOc+XeOG28O4ZoCjleswIhAJigngv9/IojGuSWBLuuNe2UWMsHVnAt5leNxDxVm4gr"}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.19.0-next.1_1596183855561_0.9553826325786237"},"_hasShrinkwrap":false},"1.19.0":{"name":"@skypilot/sugarbowl","version":"1.19.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.0.0","@skypilot/toolchain":"^4.1.1"},"publishConfig":{"access":"public"},"licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.19.0","dist":{"shasum":"d8f67723e8bf55e79eb642a977413133b244cec2","integrity":"sha512-orAiLbcmxTxQY3FWmbtGUWocGVYVWiSTH/4owWW0YpNGr6i2MA+9Gd4H46rvacSNig+Spl4WWNFh7d7E0jaC0g==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.19.0.tgz","fileCount":147,"unpackedSize":80931,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfI9X6CRA9TVsSAnZWagAAPZcP+wSIYaJjAnHoZF09yvK7\nLyTUpeqmdUUHOFBffhqZTIYZ3VJNEpzVzLQmKMz/EsY8LnhfWs6XkzWIQqS3\nWQeuRqiD4hN+BQ5a/MOAhYs32/UR64MFtm3BjCdVhUT/F0hPWwKtFHmT3YV3\nyefDQWacp4E70TbbiGpIp9UGrtzEQCeCbxu95hU7BLUzORyzRvEEhK7J2qvl\n8LL2H4uk6aUtQUUKQxxueyWI2Ks7kMAywpkcwOpIg4iy+9k6zajGouTyETYv\n+nbxi9jlqIYdAAHAUpIt/PO8t6EgQ8RMcAy+QBq2l8nWLPN77HgZOjPxxcbf\nmNgBpveCvfw8qZmxJ9Cuv+h/V+VMAbZs/Q6E52z02nYq31uhiUELZcli7w4x\nk9s5KvqisIRFmhozZmOofThgS3S/5At0Tjz7fT4zN2ueR+wNXIj+dt6OFUXQ\nPezjEMDoGdmzYhpfo7+38e7D2TB1rWcnnVWm73Z2heVmHx1d/wU8ZOOI9NrK\ndXVyaSBTfbWuwSUsjYQdTXEDm+WIwIQzUjqRFkG9ToeMkvktxSzWc1tOzWQp\nqFLOxxuV4ZjI9W72ocgrkn5KB1Edz+2RsqAJElnAY4gO7Gm4u3KkVt0GGKSe\n1CdF4eT6FYxzN878AbGijNOatBA/Z+nZqYHPMJbDI6Okfnzkcv7e87TBQe2G\n17A/\r\n=QJ+t\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCQVPctBpWsmFR1sYxvkCJm6psIBZh8BKugRYzeKh/XAwIgHgnQVPnNwSWkQXYgntrRnBlSK65kn7mPSJ2cdFTWkUE="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.19.0_1596184057636_0.6185406300379652"},"_hasShrinkwrap":false},"1.20.0-next.0":{"name":"@skypilot/sugarbowl","version":"1.20.0-next.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.0-alpha.3","@skypilot/toolchain":"^4.1.1"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.20.0-next.0","dist":{"shasum":"3f5a5cb79b4eec6952d4f26ee5a2e29e2a43f643","integrity":"sha512-0niwU72A6mGsR9Rtok07QPamNZOjLOlw+zCmnB/kcH6D3K82k8QlOeQg/rH+isfLc52fB3Mgu6peNzowQgn36g==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.20.0-next.0.tgz","fileCount":147,"unpackedSize":81343,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfJImhCRA9TVsSAnZWagAA2asP/1PTjRzgeoXLD5GYaPAU\nA2geeisVzzW6DzHxs497WZI+tg3YiRTBOdWmLq2Ga1qFafYUqyi+rl8pyTvl\nZwAMDj1peUIZCBY+dHNBDcZ2olwXBm9zdpEFT9voZEzTdgDUG+fBCDWBar2f\ngsX5lpZy0tzAcE6/SD8a8nD3LSHV4v19GrqBvD1fFSlEjOOLEGkgIjfVI41v\nXtXmrcADSlXatDrcj8LXAcZWAnyYtvDoRMxiAm27C/LtlkU84C3ropyrzxDz\nXMd2dB8t57LIKkEJQuH77zGMyW+bteHtLO8xWU+WWcMVTMTG3B+e57G1Syc2\nT/wmrXNifyKngLtb6A9K9oM2ZU4xEhAPzUI5Q8IvAAwd1FTVDvxbbETO+MRC\nRRWAH6OYf0U8INNc3Yj80psAZavstWlwKLTC6dWn1Z7obqOwvj7D8Ko+MvDR\nVO7hpY7vaKlf+k9URB9P1w1clPJ5SzOWq1eDLoCeTs+WCHW1UyaSwA63Iv6u\n3c7ACggjnq2+kdvmTeDiYYnRraArrD/UtvKuWRzmS9X4c91hAVqd3BFWM2dI\n++2h3JPdeRw9dlCzogEyc7RyGnmpenT5BEdoZnRLnjO5wJXXBEixbRQcEpgD\nLbt00E7oX7rYiAPeNyI5DZhXLlx/MvVFDUzpNPGhMwwjlO0eP39lDDxjoPWI\nX72C\r\n=Alqn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB9t9aUlTnCZEWRdKv9kZLduz8tu2AO0ZWGOQQle6djrAiEAsKGnQR/dBq0SLUEkKSHIuikJYAEcYpcaVHUCiFNds04="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.20.0-next.0_1596230048525_0.349749388610191"},"_hasShrinkwrap":false},"1.20.0":{"name":"@skypilot/sugarbowl","version":"1.20.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.0-alpha.3","@skypilot/toolchain":"^4.1.1"},"publishConfig":{"access":"public"},"licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.20.0","dist":{"shasum":"dea667e303cd61185f52aedadd0a636a0d68e4e7","integrity":"sha512-RTgRMngP0m42UiCMHqMmBCwz3i7wsmCMVGV7ohW5Gcw3tItWtG64jMmh0OZoUv/JW7+zsjS0HzO+2jEjsHhBNw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.20.0.tgz","fileCount":147,"unpackedSize":81734,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfJIonCRA9TVsSAnZWagAACkAQAJMenJeX5siNKMOaCM4X\nDKnwO3JozKUrh00O1AlU7a5cGAdZX9Wkc2U2o0WSXadYU/U8CXRH1+9Hm9hk\n/zHfDwK1Abz1oMXY8+xsJ1fgbV2qAJaLV8mOzK6w87oLgXJ84J0eBtRwgj/1\noYKOGm1EJ98LIZsXjnkjQ5rNybVSSu6rTmSvy89UA95/PgBlg8WRDX6gutKr\nZb0WQ67eKXYnrBJyS+gFkR0+Gl4rqvqGpqYPF2WYtqwBDALqe5DCnQilRNCe\nrroqU9jrl2duoIHNx6WH2MkxJvUjAJkVg0uV5SXPbpbzyN4fZ+dX/tmfzxq0\nvB1X3XxLJfv1uUak/2eu94TsI2wo7uvpH0XsDhhhV/++TVSgNqNnJN79s7Uj\nNx3Y31oDK/jCo5v76RBgC4YUTvxjziii2hc+yQGVISChAfYHIXO3DUN6CZOB\ntypgDJShVKiuk7no8sCf3d7Y7h3EOidXEEVgCl2uYb5eEx1LO0xNFYq7ioc7\nyMWFb1xVntq57TUr+tHvQW8475rlejT+NdDTukiBLKx2Nkt9CxC+yide1VOe\njuz7q0xUxaDauPNEO3+meWJHY1Kon7HGIKwdkmKiVXPrGGxke4mAmOpH8uIx\nYnqscrzht8nUhP29EWJ2ERcqeZci3a7+ZofOVbCr56ojdwgfgyAYAdeL8Pwj\neW2p\r\n=86fw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDwlntPzaKrbW4a5CSUlIaFHA5xVmgtC0yIlH6FiyjUQAiEAkUauXZzNINvi5p485j1BBSj3YzFSwkgPTKR+2Sg9Z0s="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.20.0_1596230183198_0.8839086113101586"},"_hasShrinkwrap":false},"1.20.1-next.0":{"name":"@skypilot/sugarbowl","version":"1.20.1-next.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.0-alpha.3","@skypilot/toolchain":"^4.1.1"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `readPackageFile`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.20.1-next.0","dist":{"shasum":"1f66d436bc53c1a5027a4d7da25609dfe94f9414","integrity":"sha512-U6Ip6Gv2tThWedxPCov9dLJ9udGhLE9qZKXLUGQVM0wWrY8igsnX48SWdVsNNa61SFBro7lwVSzQX0xz6YIm2w==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.20.1-next.0.tgz","fileCount":147,"unpackedSize":82267,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfJKyMCRA9TVsSAnZWagAAzQsP/3sdyqIyr5JM8X/lTiL9\nIF4W/pjHtEzDyDM796Bo3JNRSY5dQVWeqkF/KoJhLLlSJjLZ+Z0s68y5vQt4\nkrIzGonFyY03M/v8JseSOTbzRAvefXdpjmP6idJoPFwhgwQTasl3iA4jqSzN\nzVBVIfrmAVlpsG6R7lReF39GDRmnx7u72thF+pGseoiEAaIK6lefNkZ1jmnv\nFTDYdMaNh3SZhEqmkPmjwZK41z22/r41Mwl7OYwZFC/XJQXNlXYS6anWRK78\nNVNsuTPJnp91p2UfIUHMteym3HzSs69aoq/SakqgYn8aCqn+pjzlErtVD0lD\nV5xeSRG0HJWUK+FNHeAqVxcPQoCsYNiwHvQJj9UeVgXPWGTWLj9lJIz0auFJ\n/odpUeKb2aYRM7xJxGZNQt3DxJu/j6tBSptZ+Uno8VwVb4HH4iIzBmUaHBRq\nS/f5LdPfWKoN+mOcIDOUSWcxyHe1hjqx3NIGFc/oMNCrcwFI2YHz0Cf5b5et\nlMD8066HLB2oxWQNcG5fYkj23KN74v7l8MrmK6/U3ct6eyobNQVNRbmWx6tm\n6pA6dzQNcJHWVziry7IwaGQ8jXAoXQhBa5Y2Y5lBK+3E88sXfbT5GjlvP1jN\nb7yfTi5D5n+yR7hIFREHZAzKJZys3y2KvckS+kTGyP6PKA4hTJ0pbK9LeYbi\nIBeC\r\n=Zpi3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD+A300wRaMtLEd8bNES44ayyx7oSLnZIdQL1yt9tQYZQIhAJVsj2I3uwGj8BbZurMej89ODJ56PeZ3Tq4yxRbGVe+p"}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.20.1-next.0_1596238987826_0.27228231552467363"},"_hasShrinkwrap":false},"1.20.1":{"name":"@skypilot/sugarbowl","version":"1.20.1","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.0-alpha.3","@skypilot/toolchain":"^4.1.1"},"publishConfig":{"access":"public"},"licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.20.1","dist":{"shasum":"920a9fcd247ffd6c66c54a44b2b3edcf1b0a8f5f","integrity":"sha512-rTdlUMOgCed62HN+FIfgF69KsfsHHHszpRUvk2uf9lfUcCCSRCkrXn+IdqXS4VJ+P4uNGOA3pi17556sBYt+eQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.20.1.tgz","fileCount":147,"unpackedSize":82659,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfJK2mCRA9TVsSAnZWagAADkcQAJUUCALTkVFhm/Op+FSe\nVVrlkw5m3+hYataE8CtzLDWhyL66nxntufGi4z81EgMD9ilUYfQyVw0utumC\nZUND+Q4x3+q07YJovqxH5o7IOsVb26aOlHPZvIZjvqN4zywIqMjfgEhLsknE\nwWFTfT6kCeI4Ovhv8ASYo9GeTBZcWhRldqgT8ryhD+0rXMxzlBFdD8jbkyTH\n7ULLvSH63dVKKkfVkC9LWDA8kq/4pIAwKsIlzzZJ4RdTq7WJBAMjGxDH7v8W\nqb5JgYE6mFKMPPv6uL7SOq6T6MIr6xCXr0np6hfpHbBMsO2di+olQGnnrorJ\nurnohMhF4nykxMfBsXGL1iFVfYdFaBGHD8ULwPFZCDTXf9x44Zl3UulBPM6o\nvIIHT9Uwr0W6JiEKechIrHMLCH/ZhJNaNiz98L3hmiPTWBBxgeou8fepiOs7\ntJ9PrgSreYGQ88gqrsL9UYDl+yzSinOzKRu3rOgCiYDJLqT2WUOXm3R8hm/6\nQmkpEUQVPdd4KpE1agVI47Boi5hoJGuUCV3PTmjJb4rcj79+vLA+ijwz+2EW\n6RYwqsH6OfncfvijpMVWK4/zlmkY2hFflQXrsrnd091B6gRC8pFE/pjfaIyh\n9PwoB4TsS5cPNpA1z+Jhc7SijYKnKH/A0ftNYQFOWKG+1sgK30A0LTc4UOTD\ncOXc\r\n=FhYH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC9Wwb3vHuLyjAw8jhUamTYNX0Y30i4dJzrZRPUhyWSngIgXGR6DN3xb7+YoUwaxeViHltJt1znfm/7tVpN9PPcY4c="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.20.1_1596239269741_0.2783972082068893"},"_hasShrinkwrap":false},"1.21.0-next.0":{"name":"@skypilot/sugarbowl","version":"1.21.0-next.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.0-alpha.3","@skypilot/toolchain":"^4.1.1"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.21.0-next.0","dist":{"shasum":"8851d50e15e3aeccd3413b244e234e569491a320","integrity":"sha512-2LBfVjWcjYYUfhknBxPPcBnXKR4RgHje00spq//leMclNrrDBEKTpVmN13dDNDPf2T2Qkh6s5jWPKLXGBjoqcQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.21.0-next.0.tgz","fileCount":153,"unpackedSize":85562,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfJj8wCRA9TVsSAnZWagAAL/AP/32AGCXzeayVYhdhuA/G\nQn1BNrq0BNibK4mPBi89hRF5JNqCCemhTBYbP7ssPaGXuD8+R1Bajkl1n4fa\nZtKIWwLpP6KRcVq12ZIMJE/ASVoHhoG3nnPyrlb6AKy6f/TPZuFKfKmmAe0i\nV6mkrTkGBYvHRjOpfycVTt00LwJlbQISsBiOxGxQWWCxCnC6aLsz7AChwfLn\n0l9H0ZezHPoVWooqqMXfPjt8Qje9cE3trMWybKVe+1eGZ8kmX1+m1xdbQ2O+\njqY6kNZOjxC+yNcW7UWBeYkhFm7wICKSYRcheFdumQgnRPOYzE5/uGvFPrJw\nNe8kitYi7LvAQ3sClmIaekSOyt+Mx6dxkLBGiChEv4EbnyZ+m/+Rr6VpkqBZ\n8un2pU1WbbRoQYzdMlZVAJf9CJZcFPQhDsUFOLqRrfkayZpTp50zlEyhs2z1\nmlA0dbgebxJiUyJua5ZxvmeQtGvHCwgVjLhvAZhJ4OQbzROjG1wtH2Xd1jFe\nZcy70eQp0psv7JaERYIDiOemoG5zMAgCDsRuQeN0E+aPQqVYoxZF868L18nC\nHvD54eGpj9iD41d480Rdyo/B73iWO6z/9s+xgpWtVSaYxZcpLTY6XR4cP9FK\n+KaLHmekhUYcMAFqfZiSVz/W9VLQd1+K0ODQZhdLohbKeZkwi7i6MmcExw2L\nIFrh\r\n=ppd5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCsbW9nwfrWPKJacbJ2svblKP7aNAIB+ofBjG/CL0vpBQIgCvFQ4Qu7mRmIbblST68ToIr4qX0B2UZqpvrvaOIHFB8="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.21.0-next.0_1596342063527_0.5403933231829292"},"_hasShrinkwrap":false},"1.21.0":{"name":"@skypilot/sugarbowl","version":"1.21.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.0-alpha.3","@skypilot/toolchain":"^4.1.1"},"publishConfig":{"access":"public"},"licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.21.0","dist":{"shasum":"a87bb8c8de853d2f8f38f9488a88d2ab8ce1de2e","integrity":"sha512-TFQUmu4OmiB7LuXFw4YuZNqfRnLMabiwi/HLWejtQQIIKsgzTvo7rAiyQ9E37Y8hMgl3Knkj8ZuI61fB+gw0AA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.21.0.tgz","fileCount":153,"unpackedSize":86319,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfJwWfCRA9TVsSAnZWagAAf50P/iA5gh/gRDi1/TlZwaXE\n9IeHGKgm1xJME63y2X0ok/a04Lpco4UsGl4ScHcK8aZiInTIFINTzEaw2nez\nY9XYC8Vgv/p3FlnG4bQ0d6K7SXvda4jDZ+3bhY/1R+tIOS/gMOcxx9fMUNRn\nztD7vsftU9SkTT5AItX45p1R+hJ1nH4b6rxBB9QhNqQMXxV3KUBqCFkJu3l1\nLAqxZ2ngzUHw7c6sbwaC1RZx+5IpixzHtaLw3RcGUDK1FJlCW+Hihr+NeWTl\nUJVkc7v1/ps2WYWRQf2oUOAd9dG3oJIkAVFKFTuO/HETmtOO7OiNft0XLcFq\naMugX4jv1v97ZPnCgwIvxYffHgzmsf0R27HR4AVhc3SxGgCV0UUMG2/x6PXp\nOH488pHdXzuFBOJKg/x2b5BfkSO7rD0lZ0vxcMQrdbeeXcUllox768O1bkKJ\nuJanOGegvP29oe1gNq89Rx89YlXi+CWEVdQLb2L6+PQw4EoL0I41Z6PHUcRX\neQ1PGM/cMju36Sar0aGuUj+CTsCZmDwRysFYQggO5qRicjntzCwX7m1tURCC\nrFw4e0InGr8boNkc1cPtP/WdSa0iMM4wKuoB8WoURzK/cRHtgGLT9rpoMjk8\nvJsRa5tcujAT9Cu2f66S8sDTv4hEDdNk80Rq5gWcjIbM3ozlXNveeces8KL/\nD+U+\r\n=cC7c\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBwz7sgMqV8xVBuOzBBkpTo70Vpms71Yws1Y6Du9NweWAiEAv1A6IEkKR+u+kaEjMVArL/T5RoaIon9iM93MqWyCBfE="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.21.0_1596392862763_0.41530878468614585"},"_hasShrinkwrap":false},"1.22.0-next.0":{"name":"@skypilot/sugarbowl","version":"1.22.0-next.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.0-alpha.3","@skypilot/toolchain":"^4.1.1"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.22.0-next.0","dist":{"shasum":"a42976fa75251ff6d5946490300ba260184a74ba","integrity":"sha512-iR6vKVJrE08z0ToDDYsxTrPfDYDCce0Y9VwN3M1ISJZ4DJAa3pnWlnBAuX8iMZQEouEHRhfdYjbssiiwQBtHfg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.22.0-next.0.tgz","fileCount":158,"unpackedSize":87259,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfJ3XXCRA9TVsSAnZWagAA7BAP/2/53c+qBjDSNpyy80Cj\nvPKueYFoSq0KXBbspZveuMcynCIJNBbbhnQPvNggLIQXZto2mkfRVMh5Mard\nOtK1P7w/bkq8eeNJNZQaKacW4H6mZiDVvRcYWxGIecjOFJ9kUmBx7sFQrK3x\nj8hPxwmECHh/SA2rI9TDIkRQVAKGfcMKXhXrxDiegNwzre3j4LkwnS0/q5nO\n3u2ylZNcT4YeLaqfp7lcZioVYMeLCDwq8+VQ+T0O+2VQ3EnlOprNCRfirj4c\nPAyc/bDa27MuE0nfe8tvHTFO1qzHwEN7RB1FDMCAQ+n00hoKm4bcwyTisSCn\nSj84GUbQaHKPqFGC7GDD2+DKAlc0R10SwcHE31RRkQmAhkzerU0/eqNOmsFH\nGwWlwGFRGF18tVh6IWT3dDCcdhBLV5gqVbKR8zkJTayfbg39H5Oqdc1mIgjl\n6z94rR8NUU2BjdoSAonTf7wGuK7uM6DiEszzWF1FxlTNMuh6rMxm/LnZZZgN\nuh3vvA0bdVNiZZwBfsKrJCj90oYdX1V9w3GyWxZtOAfXDUM+FVJLKCoqMGO4\nb92sdt9AcRerZjxCHJzCSIZ1Xsx9H7wqAE3WHgsxpfwj2Q/s2kZY/ocCQBoU\nSIm6eP8PY9vVcPhkez6PEtD+bRLJu4TIJKy+wcrTThgekJ03GdmfbMmp5Phx\nq+uy\r\n=a+r9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCteABeF6ZzS6yr1I5DAEMxQsjYAWXA6dQboONESK+QzgIgVbBgwXv1ZJub5TgjgJtTiW8x6wfyZLq8cIXOKz/v5SM="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.22.0-next.0_1596421590797_0.02594570942430674"},"_hasShrinkwrap":false},"1.22.0":{"name":"@skypilot/sugarbowl","version":"1.22.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.0-alpha.3","@skypilot/toolchain":"^4.1.1"},"publishConfig":{"access":"public"},"licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.22.0","dist":{"shasum":"b7d6526bc222223552752208744971b60f49f1cd","integrity":"sha512-r08I92g1GN9p+Q39pCS36dTLAYSdPi3WIFfKCg86LCmFRSRcBp7IEex0QVmnoojeDejDVhnayEpUgQzm0SGXqQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.22.0.tgz","fileCount":158,"unpackedSize":87602,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfJ3aiCRA9TVsSAnZWagAATwMP/0/MuOqBXnOpg9CpJxcc\nb645d7hXn8bZ5Qv6tnNgHnJ0l88I8BBO67//CUoWRtYSiUNE54GVSZX38xTR\nDTafP8FV7KBcFuSR0HEQ1ZXEPKoA5XBrKqsPO4IeGdzuLMs2J2Q+EuUzL7wo\nmWxqeRvhHxcajXzZ7JeeTUWdNm7eLJ46mij/fLp6vNKLbaRjdlzw6bSowSez\noXUQ70bSknJjkmW3JuKibH+iI7TzKbPB+yaFswDe+vmNegQWspEo++jdAHbV\nZxiV51z5AxWtwZjoWx3orGRQJ+rKQiiRYBLfqsB9imTZyzf9K5j4ezrc/py/\n+w4sJku0PNkyVdtFg2XsURcuPgo65KoIO/qAr3UYt/Bh+0ZShIlXnDbYhxGt\nyKDkhOM8AVapelvQOa5c+wHRAfD+C25C7y+JslW0DaYsO7VUjgQzawJ6OCiD\n54QMYKnXzp4WmjapJddfSQowV15ykXezlJ6BKEycfBIOiVFGq5OWAln50jnm\nyHSZnlJIdw2WBKJcLrQM3MhoCKKr8Q5RNvi71qrPe8ED39Yk/JGiJscZqn6k\nUjPnyYHPHGINuaY/kUUWldudylt9nZcOTf9KT10OXAl9D7KrOxhYwj4xHitr\nBKT/GDGlYfqKcwtSmI1bZUKTKRG9R8sLRAmfRj0ppZ1tmrlEiro2cMSEtXYf\nJDtU\r\n=jS7d\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID6JkObEnkAWogyw8lvSNwKBqV1sljrpA9LifK1iFhsMAiAcgZSHvAJEl0JXdjSaAFnn9pywkDmyLgRuxoGukUMipw=="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.22.0_1596421793641_0.8371968410042046"},"_hasShrinkwrap":false},"1.23.0-next.0":{"name":"@skypilot/sugarbowl","version":"1.23.0-next.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.0-alpha.9","@skypilot/toolchain":"^4.1.1"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.23.0-next.0","dist":{"shasum":"792bca4152f944da6c8cf0423c2782fc0e3383fe","integrity":"sha512-8+oRCMckajd62NzunsNUxze4ZQtFekGgWVkhRvVGa+e4YDF/VZ4S3ryC2Pll6KpOQhoUBFOh1Jn4aPVQoqETRg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.23.0-next.0.tgz","fileCount":160,"unpackedSize":88223,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfKjqSCRA9TVsSAnZWagAAkVwP/250tHV3mnTVVj5h0AUp\nMNXVlgXiIlM4grWcHfvueSMD6uRiHCPN3QtHP7y4KZUDPYvjM245dUGRtL1j\nJarsxQTXeAwwFm2ar2Yok2HbZWIv0IQ6tMAHpEr0Yeimj2uBFQsfo4AHWlTL\na5+uo9P3ScVvtsbI4jLcWusYH0T2IhhMCbJvNlcDI3d/C3hxRagvkRqtJXlq\nX7CdDAu16Ael6S91G1BgjJNWd6iZDlTfSbakKmzEgGU8vLZ1lJpdrwUh/zBG\nW9GHEpSyg4hP4x8Nj2JBxka5gRV9cfBxGMj7+W1wJTeh0RlKihX+n/m3MeSi\n+S0FQB5j11IzKjVBSvoU5p69t8Wfqz/j5j34KYxujjAn4tZPkpgTvi4PXVwD\n14/LgXEyBFkTiTgjiEUSD63+BgGl/2Rwm4PKMegCTgFN+kASOtIo0f1FxaTC\nfDoeRQLdV7eWoYxo59VmSKjs6OO5JdB+Rkqik89cr/nFgnbgU0YkJFTClFHo\naP4B9BIuUjpHf72gUcFFRFc6Z7rT4+ZQjxsv7+k2JskN9rCANYtU5+rrHiOS\nHff8Hhmr5xexDT3XvCU4VgxQR+rE5h7IagX8eq7DbpZ+mZajhuRn9yd09B2w\nmBa3uQOduGh/3llvsR/h3pow5HEMRWSBBb1SR4+ltPhOYnfflV9a6H/qZN6W\n2bE/\r\n=BLrV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICKB6xiQlkvLwzA69gi6PkU2GWKBEVAhnDhSCNy90bBuAiEAz1li+vw5CrYDEIZiVIaJUK2U74BQbxzRWOFxTCJUjyc="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.23.0-next.0_1596603025848_0.5267766453748273"},"_hasShrinkwrap":false},"1.23.0":{"name":"@skypilot/sugarbowl","version":"1.23.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.0-alpha.9","@skypilot/toolchain":"^4.1.1"},"publishConfig":{"access":"public"},"licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.23.0","dist":{"shasum":"a403c542bf7a3901ffe586fdb952c8bc02a8e935","integrity":"sha512-4Me+hArDnuwA3XTQxsNVJ6QdaIaCYpZw5wTyk+qqC4Jbavfc7UV5P7fvB8pv5c586jlCwhZlSkJb0nn/QVzZtw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.23.0.tgz","fileCount":160,"unpackedSize":88564,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfKlAuCRA9TVsSAnZWagAA61oQAIxfYLQeVRsViYA1uoF1\nSw1uBodm9YDbJuzNY+hu5gy8EPAWFu1HHxK4j9FaInK4D+T/WSwDcjc8gKno\n/JOSgZklT6OvN5Ypc3rSnZ3xNox6NZsGnYq3bJ4/kvnzoB+q8FgG4HVFgBxZ\nfUOrp7gkXhwYhEQtYMAyx4cuF+FllXhjgX7BYwJCrXFNz+0qCRNuxEFOWaFy\nVelBvjaC8jPv3HRmKMofteXtMR6y7+9LOThlETUbiuLWS0hbnO29yVwHCvpn\nXczufkJdzD43xKzOP5NgJsBrCvAbtW6XW7DPCyMp3ilR5wHA4Yp/06MELuwm\nLdKxI4N0cZaqT87QUeWhuSfFREpeJDAdvYveKjyflA0cKSsQUKyk3B1CtySB\njIAhumlFVdbbmLAUVm4DJbqDPHY8wt1pyTYtMJg0EaVoAygGHlXfhj55NBJc\nM7/miTUzdLjTWfj7SJR1wdqyxIEb70iF8OFGQwr5GUNdWvfcuLDkeotVrDsP\nbsWBpLn3ZlI4sxrg62JQRNb95NuEip7oRa4hKGuBRVeZUJaAiQx0tbNLGcjR\nGGphKobxutAwtHjsMPOFjHFgr4ncBDDncSkBp6zG3eKkgVpHRmmWazzRyRg5\n6fp0v2+Scel0EuoATG8SdeVL4GMRgyQK8QnswNNPwFp9zq/bBNophjwWk1BY\nF+0x\r\n=yUs/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCXPWqECubcdzMgD0tNWnnm7FHRO7f4Bmr5iPhMk6vk7gIhAKRzgSzYHENSabRVsx1HD+ikluB8nwMbhbggSr35hidM"}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.23.0_1596608558389_0.594382653254951"},"_hasShrinkwrap":false},"1.24.0-next.0":{"name":"@skypilot/sugarbowl","version":"1.24.0-next.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.0-alpha.9","@skypilot/toolchain":"^4.1.1"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `toPosixTime(:Date, decimalPlaces?: Integer): number`\n-   `toPosixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.24.0-next.0","dist":{"shasum":"21b63bd169d67ba8b844af29bf9160d664aedb62","integrity":"sha512-y1FCogYTDjVP9EPYsVpJEjXqIMCvLTkLwXkd02tA06hibswyhjliPxN1N0U6mrhKZ/s0pJG/Rsi8MIGWY6DJNg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.24.0-next.0.tgz","fileCount":162,"unpackedSize":89595,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfLaxiCRA9TVsSAnZWagAApoUP/iIqHPVOKONhjPg5M4Zr\nPJEGMtCq/AQegyIWFw837YBZze+5cUgbBfU3VVEuwnCB4nJAsh71zscOgxhL\n6gJM/jYLzaQQMpK3kld/NYisfojaC1uGdZEgNf20p6bq1gq3LotH3KShRkHR\nJMQ25bsWbtjPlie5voudE7QFGmguoW2mJTH+y16ngNbI/J60DsJs6DVH48s6\nq4E4GOzp4vnRQbPcyZWdMYdmh1a2TseccpU3lxBoTTdFcioCSVQ2gONGOVzl\nQn08Rzm8VjiQzFf35wWvNbiARaPDa0TW3ZG15to6PbQwoE+ZzPbESRAY0I8H\nz8z+680J/vkBDHwViWfYZsk/OKkFunUmpysXc+9ahzsvZKvpjyrB3zIaQfKb\nAQq0n9FM3F8weTuMzf4dtpLOeCsfdOYpylvrz9sQkmn03TP50yHdrYnw4iLE\nbfp8Yo+yg7ePqrJzpAKmTXxP+FXkP7xYE36kpc9rGe8DprXTdqEkabE50ljI\n6h79khmL2rrMcxlFgP7t+q8Qekw113UqK0Id7gRUJ0Icl4uHC6RYTbMf/EpW\nY57ReHaeXrjGck7CFhhuMn2Dbg6EYvdoTDIx+SG2MRDeiBU5svuEjeHA1gvS\nMu3Yd/82FEZPB6LIZI0xJr5A7NdUfr+k4zCFOs50YRGmXOUD26XH+rv6wbcM\nri1s\r\n=21KR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDqV8wbI8L9o9XOP6qu0lhATGTvSYWG8QCxI41ql59QdAiEAls2LK2GyFuUQHGc4qRjpIYdu03JpXCW4F0u2bGjiSkg="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.24.0-next.0_1596828770083_0.6548274610929148"},"_hasShrinkwrap":false},"1.24.0-next.1":{"name":"@skypilot/sugarbowl","version":"1.24.0-next.1","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.0-alpha.9","@skypilot/toolchain":"^4.1.1"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `toPosixTime(:Date, decimalPlaces?: Integer): number`\n-   `toPosixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.24.0-next.1","dist":{"shasum":"86b464112232a91b977846a69a3ac04c57b50487","integrity":"sha512-5P2YrUgXElfwC7mWNUU/ejxVNz2E4P/r5ZktOgnU9+DWb1VXl0DU3EiHOZaCxcwXu85Yf46Cbt1qER0R9Q2tiQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.24.0-next.1.tgz","fileCount":162,"unpackedSize":89661,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfLbUuCRA9TVsSAnZWagAA9JUP/jemMilODqUUQhuBHvUo\n7Pihpxw14Y3cczOvGcGsDDsCqPTHn9GVBpVosf4Zb7f6C17yJ8DLIbkrHxwN\nDQqxPO+tioNTECecrxUiki1JX4OqkyvkSxwa4v42TjSoUrl1rivPeDtdTrCi\n7969so7AYjUXcx9eTIV/QTfhaUnS0dhKqCGh6bO/NA/msEMEivqgn5sXWthz\nikYH6agmnaxQpVUCQnHyAG0rZ/1MKMGirWDcM12Cr7T5b6NVidy3uCVRtyAa\nWAoSM5n1DboBRdEO314u5gDukLRaAiHvxYHgS7qtTwUa4GMhWEQE8DSVOiPh\neI5cbKLbcfPVorkZQjMS3XVkJNZ7yOYOaMad0jbum5amsoZZAGdH+rPg/T7e\nJN6x/ODPFphZg39LVjkTEWoQMbJNFLPAaWpVkIeVtooHO0g2Knxt2K6yR/n8\nimtr18ScG3GEyic4yhGb6ZGtysJujTd52raWcKuO8eN/Te7BG+cQk9+3wamm\nm5Or6F2seaSddlUaFBO+soYW74rrVgw7ySPAr+XMstV6s+v3D2JsqHLhKcs5\nXNXgAGzyw0iFglfWR3i/w51eYRQZa+cORRxU002YYWJ16ilTrmV9/j5d0rhX\nHIbIYiGMo0oy2VGdXpn0razIGGufKsw4quMXUgT+lrSKXcJW6ha+TEvSXDVA\nbypm\r\n=119r\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFA+wFBQwUPz2N9ExUoVPiI/fjMbSxF9dhNjg7eBtniXAiEAorDJsJ+wF/gsXlY++2RXOMb2hCUatYl+rTjlVmFHiv4="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.24.0-next.1_1596831021930_0.6552545358582376"},"_hasShrinkwrap":false},"1.24.0-next.2":{"name":"@skypilot/sugarbowl","version":"1.24.0-next.2","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.0-alpha.9","@skypilot/toolchain":"^4.1.1"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.24.0-next.2","dist":{"shasum":"5192d7d6bcb50a46c1d36790f7237a087557672a","integrity":"sha512-pr4RDpc6JTtjWI1xtwIGiHb92/vHRbiwG9d9VBKCNuHUb4VWmaOxBa32snj6M5WXqrQeLtLTCDH0D73XzTssXA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.24.0-next.2.tgz","fileCount":162,"unpackedSize":89641,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfL03TCRA9TVsSAnZWagAATgYP/ir4473/jwdNIXTG/9aE\n+HkEY4WXXrgEWTHUZf1b6julVHal0rOWiKJGrTpntgIm9bidPGojJreKrXEK\nFU/Ab2FDO3eMSgHMn0NAooIwszOuDhgMO1JBzAKbqYhZX10BJd2mKVvH91fn\n0/oroCp0eDe7luHdR/fgRLKESqWvktYWH80d2TCrZbdJn4qGrsumX6h0xIJN\nTrmhxQi95pDeYZFi6Sbh4rA/C4OlePxiufPpSSXhYNDf8/jsmaGQIExmMSCz\nMX77a+28pkCU0Xpn9f9D7Y/QGIZWKC7Poj9rFmKHYLPnURoUDVjXJJ02xSWO\nKObcJrwD6FzzGmwvn/xa8BNer/IPXTMeMPVHj4wK0Ug5Lyf9dOTQvN5IrT6J\nLEHm4hjIFnsCxL0QNF9iHALH9z88JSBfQ71YlSqAxGz8KOlqUQkHSCBwUpR0\nQpdFzjsOYwaaxPvKzvdM8oSbrkOg6hNmh3yFaDU3Pc9uGJCHEw+QzVk4vG08\nEfpMYB/9QdMXdeN5zTexJPMAWEsGrfpI1eDE/u9O+ADVCM1OUyrrYw8uJ8Jt\nSW9Y32XE+6XMtO7Jhv132T7x1T8+UKXZNJW5JD4tjrPTWtBQKEx8nTQmQebM\njbszwONvKdgdhXjBEjZ8e2KCE9mWd9PxRNIRE1U8sQhZP9U7YkAvyzAjluep\nU2rt\r\n=1UF+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD9jMDM6vCRWo4WhPmW4r/NNj3zMdp3kbGOpUUjGeNShQIgSMAF3vNgzXWyaxI2R/c/834wPq4qgv0X1mirS77EAXU="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.24.0-next.2_1596935635144_0.9954945370117343"},"_hasShrinkwrap":false},"1.24.0-next.3":{"name":"@skypilot/sugarbowl","version":"1.24.0-next.3","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.0-alpha.9","@skypilot/toolchain":"^4.1.1"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.24.0-next.3","dist":{"shasum":"741cf8a95cb11a111f3852e2fa52a54e61ef6273","integrity":"sha512-gtZpxPdMOxyvXK0AsQHqRxU5fHVbPd9RxFL6SoEP+krp3AVGUnx4Vgy010tS209dEhM96bcDUk0MJqomhJf75Q==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.24.0-next.3.tgz","fileCount":162,"unpackedSize":89641,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfL06/CRA9TVsSAnZWagAAyS4P/1UpBa/H1wZAKGRdam65\nPU0v8CMa1wyoIvw7MtzkrsZgaSZP4DizjGQBLKbIsyM26Bv868uKope063Hl\nAyt2xvJlPLJWN4yUlkf1lC/7aZGMaUOGN8apk1fPjLYND0vq66U/ISf2TcsD\nUvL96OfbWpy1handHGmANl7VrQ/u97kLXGMdpgGy2t0euprc/aRtqZEeU6qn\n7uKqBIasgoDS+ZgwYlyDJIENfI2dg4GbFHZhZcDl4GIuN6s8ToLpc8JmFNHF\nHW4x+NV8m2j9H2mkeI/KYp2wjjeB87jQprIYuh/E5fBhUk7F7dntmf6noBCC\nEQt4Ntm8UElQPuvBwMpUWlERCiWl8veRkFYIRQg1t+svTUXJrRLCVzU3HuDG\n5bXRfBiNTa+hD4NpGYiP27ohJC5TU66n+HWzWJ0VoK94JzChfMaLQdTG27c1\n11kWw55CVWPMiFqYopV06hJAGjl8rqpVlhu1mZjxxsTfZI3jnm52s3FGpgqJ\njACNCbzQVDuK9tvhDoIVzJH5WudCzv+MG1DUbY5oL4IXP9SRCVyFFThbS7C2\nkW5Wq6m6yMkFFxclLw4lBLe6fpepuQyXvoIC7q/NB+DimVRo0QoQJWa4l7G4\ndYKsWGKhEWqw0dSqGxEgQy3FmrQMlEvIO556Cewne6tXKLIToyNSJZY0Fm4T\nlSTs\r\n=l+g9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDL/0kGh+Swh0Fa4x5L7V0c1RsjVy2Uk0aAPUJB7kB4ZAIgUE9R6+kNjCHkCFFSdYIx5RiQDgHRGZpKZ8/OAYmTA7I="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.24.0-next.3_1596935871321_0.3300949507138957"},"_hasShrinkwrap":false},"1.24.0":{"name":"@skypilot/sugarbowl","version":"1.24.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.0-alpha.9","@skypilot/toolchain":"^4.1.1"},"publishConfig":{"access":"public"},"licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.24.0","dist":{"shasum":"9bdaa94f78636960c13439704fbd058e05aaabcb","integrity":"sha512-OJGBCg9LWBDUjj0VXYAG63cSkZMorh0/hF54IspSadjGIV73tOH7E/Cf47ECIM1YTvc00Sq/7H/E0nA7k8yIaQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.24.0.tgz","fileCount":162,"unpackedSize":89985,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfL0+sCRA9TVsSAnZWagAAp9MP/Rhlq5a+heeTPMfHjSo/\n6INRIJ5JQR4NpWu2aWL4Nzj+KeoVZk8VVxmCBg7ibKSbVVDjrn5fxS40gdtr\nMP0ffb8+fFJqgA9FbiHJstk5gZZYk2cDib7yG2Wd9+p0d5jr9/hp+bCcPLN9\nJUKBkmJNAHLvtLgAKCId1c4FlRaYAm3BgH9AECU6/rkw4XohRQNx30sGLBu/\nZ6Pb26c9nPm5lX50ijp3h9r2xttVRi/+JEHPWKrDX1jffXe5I3TLq9JzI1cg\nuttrzz1dbxoiSJoESXnJloe+9oCvyqOoh2IR5cb8X0jgaFpFnD/UK3wdQQrJ\nM/wSaZmMBlR8s2ELGPm14U9YW/PTnJRqu1u3waIwQwUmeYCVYefZCwlbtwyY\nh+GESuh2Xgv9Wp7mB0IA7vQh6SUycg4fgbk0XuctXxyI8F51qw27QG1eoQzW\nyu/dKGtnZjslLNPeilcHXgugSrKqL7htm7EL8S+Cv4FEOL+i4NRSswWwO0Ny\n7c+W5qxG9L+kvJELLYaLmoH6jKkBLbAAaAhmrCWR5usFMJezcmHTPo2VBQy9\nCnUVkdvIWyALFz4pbEesmygiavxcBwvVNScCIHIrwbucxL6VaVH/U2sJmmcy\n/BN5eObhpGqpW+fAyaF0kLrd3aH+dpTMAlZtnuNK8do83lxUzATeXnOK5eot\ntZRx\r\n=j6ga\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQChfWm/t/j/LkUEcdYtbEnrM0rsJdLD602ORjGGJdroOQIhAMU51VgT1q34JMqnwwJ2/SFGtc7zuZxKDcq0rDRCdVAJ"}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.24.0_1596936108033_0.37250864072082734"},"_hasShrinkwrap":false},"1.24.1-next.0":{"name":"@skypilot/sugarbowl","version":"1.24.1-next.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.1","@skypilot/toolchain":"^4.1.3"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.24.1-next.0","dist":{"shasum":"3577e7338e0c522c55980802652cfe7d67a329a1","integrity":"sha512-t7Kp+bfhfCd3NL20zdtbSRvSeLV0oDuNF0Dj3GGs8CXsBDoa0yXUWcVcJTtCzLRg0E12yCxKZ2orUML8w0+pgA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.24.1-next.0.tgz","fileCount":162,"unpackedSize":89984,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfOMsrCRA9TVsSAnZWagAAASoQAJC0cVchiLco7qU/pk3o\nM2TI470ihLrxK2/WoE5clBAEQlnzVY9NUBZq14uBC0Hs/4RjQxZxO+1DFoYB\nPJ88KKPaN6pRVgdLzoAXWzhOjENbH8TWm0R1otBG9b10sieQIFVtVhw38TMi\nDbxfT70meDCh8O5w7egAWFGzyz+Wess/orjqXc/bTyDXaB3vObgTzO9hAP31\n6c6xdotkyb2p06zMoR776hD478OJ905n+p53BHuxsf4hfjo3IOF2qeN/9hti\na22GjbD804FyL2bpRgfNtMVULHuDXpivWFo6bDO7+T+RdckQUggsMjg/xXOf\nLGHHCDRyUnBXG8+f/SCdIE7QT/ldLOE5Kj2pfXcsjxNAYfgJtaL59rT0sKVN\ndmLem660yr/CmMSaZ/QYExdVTuvLmSl+R35Mxuie1a1w/qBljLZPz2J+AnWg\npWCbQFrjTt/MJbd8vzoKimyaOytUdj/JDr102zKV18E00aIFGpoKrF2OyX8X\nmIPHzFoFeyYuFthSNMtJOTAy4Nhp2XrDHiP7I4G3nNHy8YbxlkUB2nTkTZgo\ndz8SB7bPR2ngCyLbndsRMn3ickuC8LQDtZxTobGVMjTHal+cKSTEB9w5ckZ7\nWKNiyCZ6DbgZ1BF67re3wpY4ZAISimsQ4/kvKeZ1Q+pGbZ2Yz+v986JAsNT3\nRChq\r\n=VqyG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDNkZPS+0vnxrgzCcTIxEEXPm4efF1qzKF2C8kAMj7RcAiALxteyKc72qJ9JUWiO9m4eUITgnsZfb6cZJOpFOZknLA=="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.24.1-next.0_1597557546980_0.09714264349286683"},"_hasShrinkwrap":false},"1.24.1":{"name":"@skypilot/sugarbowl","version":"1.24.1","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.1","@skypilot/toolchain":"^4.1.3"},"publishConfig":{"access":"public"},"licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.24.1","dist":{"shasum":"0d6d0d645381fc8f88e9f8bbf046917920b7a909","integrity":"sha512-DB26YF2wq5etNi7+3jPaj7id7aN+V3Pg3tn4c3fGzZ5TRtlXYe17ES0GtCdtF33blNHhjFs9z8HSIbUaff3QnA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.24.1.tgz","fileCount":162,"unpackedSize":90192,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfOM6oCRA9TVsSAnZWagAAp4AQAJM6RRUO7Z+R+Esdj5bM\nhwc2QudWPQYYZOQEkNfCWcIf5dPGSPAyS2BoAALRtjYC7B6cZqs0O8g/Nzxk\neh3yc8row8sniOg+smjefkCzwmooE5zqCwv1UoXR+SHuvjrVquUbEPsiPTj0\neZ+Wo06e8MIB5HBlMhLvd+Y3rTuy7233epnmzabq5lki7n/RO3xC+THtG9g/\natGTSzZLdywTK1NVxiGtKr855kTrdynMiChOdz3SRb2Tk7QTPuxyZ6/N96NZ\nRDFeollOfEZvybkqtU3GVpzjnu8o7+7oMZSouW1klHB5rTrG6Q+kwUF2IE0L\n1uGbm9L683Qfa1puIRCi807wEMmF4FsqEyH6HPUgxLUBWUZz2VQgvYhTuBIP\nRIa9lCpsMU5W3bkdYz/E9rFLmkcgiMqTH4xJGcBQR4Ov7IiqXK9E+k5cPXJQ\ndJgd6vV6yt6hDfd10UAnhjG+4qrYuTQb4OaEzHa/QhwBzpTFH3R91jfbB9Uw\nF1dJ9JVvfKaCwE7Lx9APQXFg7GJWPTkI6Brlmxs6P1kK3bKIEyAsp8fgCP4M\nwlC5Skcq357opOfTz5J/tnRIps7T9pdyQKOKEqewWNygayWQlBu3VdnlYRcb\nNQ9JalDx8uoy+pGsgYcL4r6tSPiLmuWJL6PC/eTwYtBaP+aDEoax2PX7sKN4\nRtYi\r\n=ChZM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHU5Btu+CbSFEIurEqNYlSkGfv9yb1MF/su5HDKICjZeAiEAoSkgKh4iNQUZFPZfLs4yws4mIIXgtlvU1l127M0cgGg="}]},"maintainers":[{"email":"wthorsen@skypilot.dev","name":"williamthorsen"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.24.1_1597558440090_0.3220759270179303"},"_hasShrinkwrap":false},"1.25.0-alpha.0":{"name":"@skypilot/sugarbowl","version":"1.25.0-alpha.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.1","@skypilot/toolchain":"^4.1.3"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.25.0-alpha.0","dist":{"shasum":"0e8fb8da7515dae654f274829db4418779b3f743","integrity":"sha512-4uWd9E0dr2zRqNWZC5RC/dWFJFm3brf4Ru5L/XDXC7lsNkf/m1bl1hADrNXodRpual4WVM1NP6hEpInYfVQblQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.25.0-alpha.0.tgz","fileCount":164,"unpackedSize":90768,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfa9joCRA9TVsSAnZWagAA1ZIQAIbclGjTGfJaF/5lwc1K\n9wk0y2clB2INYhGzpzU9eL/GOD6oNGH2+byqkOA79AZzF8KkVLqS+ua9T1VI\nqWAgZBBJ/kiC9Yi+vVCAphAS6U8M1WxwQIMbpnrEoUnvvNzJxWdDEtwiuLT1\n0oIfQ+xvrQVJ2a99aIHzGY/J0/GmOkZHsPo0cravsBR0Rd1D7u/F2iRtlMyj\nYpceZQNPR5iJqx/pNPr09szJinVoDE8dk+QYwh3thv3tTQwmKELy18bvEusU\nMCc0DmXH3iXe9sC0ZOvWVti3vZMvEdg4aVdgU6RisD8idtq84C70NYFvtO5B\nJXWY6P2psRBk626yT5+/a00b3IGFIAKMeROAX7tHvjvy6O53Wp8CUwTmo41C\nMOpN2ymsm8Z2KuzWeKI3LKpz6x4KADnGYL93M/gRzhKN5nl3h51JYkiQuXc5\nkzgAXS61VvrfZZcnCakkb6YydAvDDTSAPmkKyGps6G9auT1evP4/JzZ7w9U0\nX56DaHnay1CD294sMn8xt/QU6TZwmctewiQggXND7u7COAVYJK9DLRFZ0Bpe\npQ+6pANkui65q7z3apA5aORF0RECoy3Bj5sCiezUbAXqTvCQjBgs37O6aL2i\nJa6ISKZDYfrgQW7kpGV/pDjHpFNldWxf0wROp54jVScUD6fgMWUqXFIt4oys\nsAxU\r\n=Yxxo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCbvWRVxfIZpv3ACRag4sQPcU0qgamT2jEtMutGFvmcIQIhAOvKmuxC3ylKACnc5SB/SZxYxA/lCBWhFkJBGAo+k3kZ"}]},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.25.0-alpha.0_1600903400170_0.5356974609497587"},"_hasShrinkwrap":false},"1.24.2-next.0":{"name":"@skypilot/sugarbowl","version":"1.24.2-next.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.1","@skypilot/toolchain":"^4.1.3"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.24.2-next.0","dist":{"shasum":"2f05f507828ea0de96f07b0bf408f59625c45a40","integrity":"sha512-AsQcgek4DDGjS6tmOznBTMFFsPSk7+RTBD9Ym23YI87Avh8OITuYDlasXFNBUirFVI2BMxDursYNByarb0W47A==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.24.2-next.0.tgz","fileCount":164,"unpackedSize":91196,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfeSV8CRA9TVsSAnZWagAAhfIP/0yBQZKIbNUW8GbRMM66\ns1BGnLujbf0wn5XXHxzj+s3vBN0it3vW97SEH6R9KrL5PCxNw0O/kfokB7AG\nu/O+FFQ0HKw7LfonHSQ4+5ejg4bD5b6ZygVNbOXkTvzNHcfdtEiyNcvfu7K0\nlG2kBspHd5XRAc6bNceXYN2tHD78m1KeQp40UscPrMO9vzV2wGCVMyF+Lo2c\nilGK9MpXuxeD4AqZb1VprA4ETGbMIVWiyhFBTg3NDMdWassW1w4HJlDHdSsj\no0CA0EF0mk3VmwMvWiygyMKp2NYzihYJbHzW6R8fooO6oF3DDtWV94wgyCVI\naKPRecrPB/8Dlg3rCLOkPCgSTnQkKnKZvUS1CBN6uY60SVa5Beyu0Jzn9zsn\nB0w49Io5TgQDgBlwpQ0CHcUJ4cqjkN/xtgyXmJxtktMDOZRo+idrwBTjVYEV\n9Oc1zp4OB2+j8cOzKFtZKFR/OH7H/3MitT3BKKJQmXt/kkssEHeSvFpKnAxs\nEyvUvHRk/vKcON/sGdKafdO8Dxh2FJxO6/8zudbhclIVn991h/U4AqFVi8Kf\nCX2KaQN1FINTJ/DfTDt78xhycVrauqJAuRG50WZs7VgL4QnfW/Q6EmMqAZ4q\nCqOl1UTihsWMhT0OuhDEyKQhfG14diNzy8Ln8P3+sKXq4YFpZzLmHD0tzsNk\n6C87\r\n=ep2m\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCfaS6o7Y51RGJMf/+bz7PW02rRceftwmNJaN9+FrMWLwIgCnyZquXAjTMlfuR9e9PxGnX36ck6GVS5McEl27YHk/A="}]},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.24.2-next.0_1601774971587_0.06604378360261465"},"_hasShrinkwrap":false},"1.24.2-next.1":{"name":"@skypilot/sugarbowl","version":"1.24.2-next.1","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.3","@skypilot/toolchain":"^5.0.3"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.24.2-next.1","dist":{"shasum":"f3fe01b62ba6067aa3a11a51e78a098601f68686","integrity":"sha512-2UhwmJBu5G7NwiEFAhWMespEgSIaeSNjO3JU0Y/YZdzSfChA9fYr3RTkrCoyrYxohA4ZiMQlqVINrfZf2LrTrA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.24.2-next.1.tgz","fileCount":164,"unpackedSize":91196,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfeTlvCRA9TVsSAnZWagAA2AkP/08BBuiFFTzXIOg1WVxK\nyMAf716w69As3nvRcDUi5quPXUH43EebuDS/vASGu+bA0AErfU8zSCtgeyxR\nvh0eI++CVCp/uxsG4J+sScl3PXgA256qfBuNgSLXesTljtDcN4Mi3b31e6c0\n0VlcwlfmIbvPCd7s5WiG/V+MfUl0lMreBkQsO89InDdcfD0+I53i21nM47jw\nofwQip8hlPP+JfDMFvlF5ws9FxuoD08WnxhT7sZ1gM8qpwACO5rxGE26om7q\n05y2xiiSsqqbViPK4pd0JJen6HsYv7Ltpq3B7l1fdIMxiP45XW2a+l+jgJ9D\n3k0nhJ369Umec++0pxWYZJgv7Zrq/yk/14i9mwYlPqvAjrgU/zfB8UAzRO4r\nCVpUmB/EuBczJrjhwi+1YT5ymSW/aGMZhJRCkVQ/nRsOWjuGNdKL5FlS+VkT\nXG3GaPjK+zVg1fYZXJTs6PJLIkDdl4Cqmr+6in88Xjg5QrNy06QE/yzHOfcd\nOxvhKYfEKPWxowyMk6xvC/44KC+pVbNHBMCy9ow8dGM+Re+9wwqK9jX1Rxs1\neRVGFDBCBA69Ntun4D/ntvlvEmisHBzTGtjxIn0EcNg5xizyJV+Mtft5zgYr\nurP0pzJZXtbPQ8rPdW1ZTeTwqJ8WANUKif36eEJARH4op6KXkS/OHYcN+Lgj\n8nmJ\r\n=ZJea\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFBGg0ewDnAPuhS5VBRMkvhVHvUTXRHtAwnVJnPBXK5SAiEA+bY8b8jR6oxiqhZoLhJ92jEkpYAoax0+kS2r/16Vy0c="}]},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.24.2-next.1_1601780079178_0.0902670561775627"},"_hasShrinkwrap":false},"1.24.2":{"name":"@skypilot/sugarbowl","version":"1.24.2","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.3","@skypilot/toolchain":"^5.0.3"},"publishConfig":{"access":"public"},"licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.24.2","dist":{"shasum":"acc54dbc0af18c197458ae02babec82c2e24314c","integrity":"sha512-bDMNaLUjlOuy6bCpxk5FSdMmz2jbg5fXH0ozhMCttNPWr6vIL9HupAlafxLPIVKyhEy+KIV9tqNqMKiwhVlhfA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.24.2.tgz","fileCount":164,"unpackedSize":91443,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfeTolCRA9TVsSAnZWagAAyWoP/0X4Vg+3XKLG62vq84hW\nydC4jSHlrd3RGlqnb+PUKS0mqJhz1skh37IX6qJmT6SpcM7csIRXp/Mmu+v/\nH/rTj1BJB50dIv+1TKvEn2CbNOjNl4oY1mYwtfa7vq2CCJwmxrdJmzXOXVxT\ndnvu+YFBI5t6QKyEIG2oi9P1FsW+n+a1c3W8630Ip5ptOUcUG1YZG43iT7nQ\nwMUGejlpjITpQcpZyM1QpEp23R9V293IW4CWYJ64bRIBDZExab6m5mw4vXTE\nwCNFG+0Mge40HOhejFjdtN2CcQN96eiXnnz3HdSItVVe/j8hLXmnKFy3iBBL\nD32N7BneFsjSlrUEsSTTRMWrKx/umYS8jxRlFL9v7zW7CGr8pWF+ACLNjXJi\naFBjrFfUXNeEdeHDjhcZb5LiBR00zxsGcMopVr2018Z+mUSBv9dN2D6CjFZh\n2Zmu79vwIdRoCYiHsHBd5W6ZrlsBUAefgSqkuSMVKO6vHIi6h5CC276vexAR\nipGRkqEJ/CSeFqTVe4Gyj9NzDYkR0c8CoYkBYXj9rXnVN1+4FE0977ySrJsT\nQWRYk0Sj53CsCvz/5CiCI+jLYJF38pyIsNWq0VVgLYrNXhGHcxHIo25K7noV\nLkGQaUNpE1rXDOraFzBEPDD+CX9fPdj/J6fdAaDbLjbCko1Vma224IcUwpNu\n3Bmd\r\n=0Kd+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDsWbqmXtUKT9/hnqP0UZ0QIsID4TmruuvqanCn9zprxAiAhzNlVRB9X4auOvx9y2fLFmGCze18FRTg0KuH8jIBcqg=="}]},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.24.2_1601780261408_0.046794916531627484"},"_hasShrinkwrap":false},"1.24.3-next.0":{"name":"@skypilot/sugarbowl","version":"1.24.3-next.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.3","@skypilot/toolchain":"^5.0.3"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.24.3-next.0","dist":{"shasum":"85a4d54ff33b29021820f8cded3be68b62b3b08f","integrity":"sha512-JKIBuua8Fog37MYZ7QsqNrZJDCa01iqfqudl/ojfIfeoereO/d2wrU1kQhHvD2CMQ8iNSeK0B4JwMzWzAvp53w==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.24.3-next.0.tgz","fileCount":164,"unpackedSize":91450,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfuI2ICRA9TVsSAnZWagAA+e0P/j4NIs8yo+OK7T/vMoN+\nduveXZf/4qV6juxnG9PYfXbJntLxTPF4ugF0GbSHkrUNZiVsvbEfjbYXG872\nNNzArOTG0+F0yCeows+D591nDGnTxqDrUna10ZYkwgL8LdI1WgEHGWNuDKQA\nb7s+w3CSSIx1673pEphxaLxlBeDFVG14/7KeRTrnFYWfDgX0JqG7rjbql8Z7\ntsDLJF3gwS4M4lXqXWJz5xOf4leGVAo8OZuoDYI+HPT2rAeRQQ4kdl7Rej5b\ntKdQJGfKFm2C9tk8+0fihPl2B67xZgTDeyQWf9vrKFsSq/NjqrUQ3N9pyucB\neKu2yYrDuIrP4/ar6cpAO1zQAnvNzUgYlbq30AKwFe5Oar+WHXYTl+i5Vlc5\n344HYdzKR709DMc4aVLJFs9jn2S6KuBFRj5NXdGHoJCDKk3Qn/uJy80W3tuI\ny6VTXFPwzJTwBeT3LAZCtBsHaTmi5y97/vpBqtOU6Rwn8DqvZ/pSzyrJQFTz\nJOGGL4c1ff3eqyXAMphJBTKW6aKbVEE4FbeVTCE4GbSR5QRao0TSLHoNwPfo\nKShZOI++zaTatPAs8b1b9u4DcrvRMlrgXIXEra20awT6Oenz6Fd/2kTnrvoP\n694gBo4ifirIxqoi4ARAo/zcv1Ho2SkHQvSe4PFMDrxBenWa7Fda4xp1fT37\nPQ8R\r\n=HngO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGSNwtL00Hyw2io123/P+fi4N9DDqX7IAsy17uAhzRDPAiEAqFT3KukbpfyMq99gO1cOzqgWtyCZcEWHsnkrfkfKVeM="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.24.3-next.0_1605930375328_0.31345237589027386"},"_hasShrinkwrap":false},"1.24.3-next.1":{"name":"@skypilot/sugarbowl","version":"1.24.3-next.1","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.3","@skypilot/toolchain":"^5.0.3"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.24.3-next.1","dist":{"shasum":"2c921151732c7c5ffaa2c437565d13032c8bb7d7","integrity":"sha512-Ynl61kGmyWo436oSqCGgZK2Rm/mWJpyqLVHDLtV9adSOiMBIhK0CaIVTuP4M6NphzncSS+XdB7vOkvbiJVA1+A==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.24.3-next.1.tgz","fileCount":164,"unpackedSize":91766,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfuanyCRA9TVsSAnZWagAAig4P/iankGkPI0LnjKXG3+xR\nnhV0bmUkIZSAIWV/RmP6Up29SH0Q2VwW9SsA7c8bsJFS3wiGvGiG/dmtlKdQ\nZoZI6Phwlm2WVTllP9xi57+RWmDnA5y5U3U9d0liq3cBXRfaSx4BlNiYO5Oj\nEBLLgFPIvGscmL8PgIMbsKA5IjQj92mb8AjMBRTWtAvpTSs1RtoJmKusDIwh\n3ll7CuL9XMdDYv92Oi8yDTv+BqVcWQ4PQU3K4nEeBmGpKMyHdf2hH8KTzRL3\nJj9sFgA2gcxIZhaIIbz6KJafFWdC5NMfUtxBjgLHQcnC5o94GC7UM4tOcYah\nuqEm4g0lDThSrKybJL75IcZJNvnfQoTSapxU3GnMbqrIYqUzOGlVrBEcPHtb\n+utvv/QSACaJeMge62Fv/OlPblrFJx+7cmnYJpV7AeQMs5nTEFlGlw5WiOUV\nbeuJrIRhQ3OeGQN7H2qKyxoADDzrBEgnSK4kM/AZ+LRxFEZu3N4iv4EAhCtg\nwi8Nm2630+0LOF8GAhbL/8yD+IdCf27iBUst97PKeohwg+WWbpJqDph1XILk\nZ3WBOc/Hx1YVmr6vncs1nKwQyRADzaq3SgKiogz29jTfGLA5SlNlzajOwzdP\nI/sg/rNhQwqAYAy0KxjiP0+eqVO2R+6yE5C9L6lm8sgGSOfyqgJaSiP19pLD\ns/fP\r\n=4nHn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCFTQdckC19DDrP59fUoufXeQ8LAXtXDRiJ3B40Oj+3ZgIhAKc2yOnZCIg6FjoXMiapC8fTEoV0m1rf/DjYYsA88ikF"}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.24.3-next.1_1606003185920_0.5991195849333724"},"_hasShrinkwrap":false},"1.24.3-next.2":{"name":"@skypilot/sugarbowl","version":"1.24.3-next.2","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.3","@skypilot/toolchain":"^5.0.3"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.24.3-next.2","dist":{"shasum":"e76f2c7b00dcd31b157f3154d4307f16065a77d8","integrity":"sha512-6LlQ+W22Mwk9xx7Y8iM1DGb0YFvQzhYGm1o+7g8w+bTgRATM4OGTOfDCQ1bFn72+XInR701WcViQQEBBQH2UVg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.24.3-next.2.tgz","fileCount":164,"unpackedSize":91766,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf8Nr2CRA9TVsSAnZWagAAI7AP/j7ySDnY6b2lMAQ5Z1G4\nj+MiSREtkmqSd49f8iTnbkwk7/bZCSQ+Zp/jdWIndYqeNGxLu0cNSTtCX/DT\nq6xwuZ8erxvIdPDewz8rX2frxWPuNlZV5Ud8TIihXdk3dqEjuQJGmUrLF2mn\nZadqK4lidwSDa2taPmrdzbcV6fivRDsDmnaKIa0r7o5dPSZZSeXVXvuaywHn\nbaEvi/AnCjHwiY/fUe+9/JxogE5SCMzckiLBZ6X3HaHqj1SUpSF2FGJTj0mG\norVqMyQERzZqz/nFnBCdAqw32pu/jKBsYmqSNHNqSIFmyo0t/sPFLzBJwNdV\nxKY8wPmGwPZGsQOQDQP8COirzSzAdEjFZY5GXSwMobvs6sMRn8TX/hU3ReNX\ngeagPABqm2PxDBhMl6e7sFozzvKz5OauRtjzUl3PHKQjloQxmUn1vZ6G4yjR\n4y5rfChJOmmnTnSX77lDzdpj5lCbN4gpbarf4z+trmR6yIasJk2bJ14nDkrz\nwLEXxV0jKhHYWycRTTRUY4jYA8GYJADYAtCrTaUjOBeji5Nf/V4Kby4qXtL1\nFqjx8SWdibhF58RU1maxDIrgWyl4HMoYqzybRrnqgL/9PXIoMPmXiN6LP7yA\n0+kUFx9M/q6GdmPnmXe26QPPXJ8mfoODF4EVkbFtQ1MzE5Ot90yoS7TK+crg\ndeFv\r\n=Z1V7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICmn/fDSZ8wnLqXz0wXMQhmOUdm7HlpyWnDZZ66tCzDLAiBvSza0VbFC5a9zTnmKkEd+M1JMOFYa3qxTzCvDN5ODHA=="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.24.3-next.2_1609620214056_0.1731249868342879"},"_hasShrinkwrap":false},"1.24.3-next.3":{"name":"@skypilot/sugarbowl","version":"1.24.3-next.3","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.3","@skypilot/toolchain":"^5.0.3"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.24.3-next.3","dist":{"shasum":"56d5207aa8f2f0b98fe7cf7820175ca40c74ec73","integrity":"sha512-UbessaHS/ygv4zehKAzUA1y2wIigl/WaRx3H9oloDj+rXAxPmw7T1/sJb26tZsnTBW79To0WqWtL1ewoaAs2Ew==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.24.3-next.3.tgz","fileCount":164,"unpackedSize":91765,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf8OSUCRA9TVsSAnZWagAAV2MP/RIOmDT4BlyPGk5g16iA\njWM8rHUOpd7oPvt50WieOvrI/31sXXEK5vzlNyLPtEMxwveqPspRFfdWjnZb\ngatmWFeQ9r9fh8Y1mTN1IqbFnHOC4MNLZhyyBIqpJtn2hjyerqMllQP2blYQ\nSLVbDgjF/LCS4p4XTQAHatFj9+I/f2H2dQX0+T3nzvIyZ+ooOcUgDqoMcM2v\nlHTbdEsIg3o5aZfvD06Krnz9eQqbY/g5Nxi4odqkVZM02THzfDx46+dBtqLm\nyIU3qO3VAF4QrnK/BbzdzrL3RKObUjPHE7/CjIhs7zyOy6TRQ0oeZdPY1spI\n3rOHIskzDWMkObBRPJGrASHbgzo4PJ9091MoCZpTZKUXo7yHXI/AUrfWdGH4\nGE/hlSGaQ+KnLWw7OQSFbUl1NKZGiucRMqmhSYStnd6DSVDPIc/2tns5NA5j\njHhb+aHOrJQxRcH+rxms34o7JEAc01VypPrHqv4bnp4385VvrJlgDv7l5KqT\nBDY4xMV9f9SKfI6G7tb2haq6OXwbyIbB2YmQfO6NDivsRVBM0yi4ptdlvuaX\naqVVMi1d8UkHvBqKfec6yvUxPq4jtsHLDXq0UwSYN8g2RuzCKpm4NKMVqylR\nHvly0RsrlhKBUb4skTc8wJ4w/GoxydUCjg+yYQitkmRbjiU54z3GrOo1JvzH\nr33Q\r\n=TefY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCuXjri9AQvPN3ghfoGTxxx80frhIlxVcKhumF95thpuQIhANE62QN9j/cqsjclt7aw9187iKrWbfTlGwUaJmszfONO"}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.24.3-next.3_1609622675604_0.9662823256541544"},"_hasShrinkwrap":false},"1.24.3-next.4":{"name":"@skypilot/sugarbowl","version":"1.24.3-next.4","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.4","@skypilot/toolchain":"^5.1.2"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.24.3-next.4","dist":{"shasum":"1e61adf5d9749ed449ad1b5bdfedcc66b54d0226","integrity":"sha512-a7kMaKbzACsVCH71J0RTQMuZ9ePQNucEawiEx322KEQt0K1iktrNyRmU4PS4JiRuQdMuc3tz1bTq2Tb1rcsFRA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.24.3-next.4.tgz","fileCount":164,"unpackedSize":92411,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf8OjzCRA9TVsSAnZWagAARDwP/0VeHPDpdwHqPxrjEmpR\nyLvmPyqt4uYseDkuxqmwQKAA3BWYxYRABYhs/zqLhTkrOsuKOTLksyYJ7tyK\ngLWJHD8DB7IGtLvwUV75Eb8Id/vpkZqllBQaJOtDJAfQae7BPt0qULKNMu4h\nQVdMkMIEtwJx3fXPjfsPV/Wb4JecN/N6xpFnjB4hhb7O0SgZaN8P3ltU+nMo\nORzR3qpuoY+GRHfhoeAVSLiE+X2DwPw9XrQeQJdCiDf7IzlG4k3qQLJJDC/L\nQPGOQN4/zoMtfG4RbUIJLJD0Azf1OvKHT7F19t7WZTFoJaM8BV2RG6gRZh7t\nBEMOVwXdCRdm6FGPQoqF1p8mgnJSH50wapg2/gL03oe9Xg9WCqkPPfZbaZzO\naM0XQu+GtzIre/r7KBlu+TAVbn+ZpWDCNkoOP958zA6BtOZWkFC8cURTNDBw\nMtKduX/YYO7Afr53JdFz1BoFo4GkdOCDQF7I50Ho2wi2LMd9BnWxCaG1m3GP\n8sBwy/7OYhNNO56TtzItS7XwRD6hKhitSUv2YpyIZoSfQe5u47C0SJyU8Dtv\npJwZgRCbBeOGKSXsPtlpYEJceuH/JdqmiBWQ8FZWNrY8irvfC0q/2RjmMDvM\ntKrUO0beGhh2/a1fY1YYA7fu2So/sMzrxZfq1h+LG3kVhVLwkcf3L2K7UB8a\ngc2k\r\n=cUDC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBL9x+0rYvJkZEoym18+Pe5b10Jdm6OSYg0p45WnksBKAiEA+b8aKlilQJCpP0hP3WH1RalrP1fP0Kmqep06Lf2HaM4="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.24.3-next.4_1609623794757_0.8634742466550558"},"_hasShrinkwrap":false},"1.24.3":{"name":"@skypilot/sugarbowl","version":"1.24.3","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.4","@skypilot/toolchain":"^5.1.2"},"publishConfig":{"access":"public"},"licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.24.3","dist":{"shasum":"edf47b0195ea5c3e4d7d8b614d7f3255163013c3","integrity":"sha512-PY2q8C/x7ECqujbe8o/VoqBOHESV4G0+gM7XEG02rTjVQydgVrnm/RYWyAtHPT60bF1i/VIPCSkAN3dSN17NIg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.24.3.tgz","fileCount":164,"unpackedSize":92830,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf8OuBCRA9TVsSAnZWagAADXYQAIND1YlDesDkcB1Fk7vc\n1zQ5zPhIwOMx6yo9Zn41KWD0iPJkI07w3XHgqE58M9XM8vB7im1b3xEMbvXr\nL8SdRx1CyOXnp1d9qc9Ab+Ib+HHJJRVtV1++jqaptOfrmN4Jo/Ll1864GR4P\nOdNMLtybtRQEj7WcyH+UBn3L9dBhLtKDm5Raz7vndrvdYnKRLprJ9unX7qgs\nP9JWo1Ub17gwQzts83F6Ekx30Vbn8rt6hhYj4wYgO8DrZPOUDttOt20Oys/m\nCAYXBrlOjbUX4Cxjl1IwHIR5tLjBCCOlrAleImRWILcXAOl/6oL+jAwmV+jj\nTwxTfMqhaa+HblhVXtkUK/cSO05vhL0hBbOWfG3JYfV30CXONGZKpkIUreba\nbk8ndlMKyPFqM1BvQhYkF5gxbRPDSQVMu3gEXto7d4wrjyN1ABcS9r9RUqqc\nbVIKzkJa71cGsQNw3kctRv5g1rJaz6mmDAys5fih9LF2WLeSVICv1EYNe4p4\nfijQcd/64PfyZ1ovrYxkEoLr/4kLsEm9IzZiC/dwzBZstGaYxp25JSoXgYC5\na2YYYxOttDpnDpdXK3yp3M4dn7TtCh502GZFi/KV0lddvq/pUg2MEEpj7sKT\nUuBRvKqOb/gN7xvRJvewqMMV68rs335d+VLIQFOxotjcGpMYVfI/KXxDL2Xx\nk6fe\r\n=VQli\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBsPZOOcCGttQRhRIJI+z/QwJ9/mTPSnoUFXcolcZlKGAiEArgY8olwSrcfCPGEI+YKTKffTEeX3Tz3mj2PH3tHcV1Q="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.24.3_1609624449574_0.16338425717038718"},"_hasShrinkwrap":false},"1.24.4-next.0":{"name":"@skypilot/sugarbowl","version":"1.24.4-next.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.4","@skypilot/toolchain":"^5.1.2"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.24.4-next.0","dist":{"shasum":"9d8fe57697b37845c429cb669a64f3b559235646","integrity":"sha512-cjv2we0ZB9HjNkg8XplBNxQu9OOLqoFusEoiUyfNLzJksT1u9O0bOWrE4jKFsZP9y68Dq9N2n0nqwJYpCQLzOg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.24.4-next.0.tgz","fileCount":164,"unpackedSize":92868,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf+lwzCRA9TVsSAnZWagAAI/0P/RNYIz6Z2F/so1nxK4un\nTSrxymRPfOpX+obBwIftwOObBSUey274oHPdhminMFmtvmq2p9+yxwUapZ+d\nxWhdS+hQ0WzlLklYrbZELccnwSHW8mrnYlAj/UZu5KLSLmLALg3LZ7lBrcFL\niJ0wXddFtrng/L4SrT4cbOiZLPL9HSS8MRtxEh1Vyu07Fjv2eeDgkJrQQejI\n5iZtBxqgTMy0KUVaDQ4JXHvblP4+y8E8mkhv+DMDjjXJB3UcJeKa13SH/9rP\npYpJS0u6Squ4BCQ2rEu5wUpc0gYh+1FM9E+bj1SxHPZWwrov2E5s+syLJJX2\nFbUf2FbyfEHLJPuQVIVHnu7fTNGb0AS92Wq2ul+fWBYBLIk4kRklNdi8F/WF\n92dBouYSsJteUxCUu7oeQ5InVXO8B4fhCT+JgqRuzbFapypverjfsIW90Vyz\nGaa8mSjokuDah41mQ/1eTK6c6OLHdQ8QYxS2O3OJoM7dU5T+l67LdEJvND1R\n7hKCgcPi0se/pJl2d0V7RW5TrgdLyRmuZEKIKQH8hPiiZrj9PhwB4YiOiGPp\nI2ppolchDwrq9Vg0p79ZSUdoEnoyostX60i3BJKgejWc4ObKqS0zuhANLKHw\nSvY5+z/MhU5hlA6jUEa1CEFvVtpMvN2u160Ofw/ajub2WfmA8B8EkRlsz1JO\n9CTt\r\n=I2sQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCt0vfv9IOpCxMjUD+SJcK2AC+EfJxAwy0emddxESluBQIhAN8JZ2zDjj1qm5oQ3Vw56ZtLhmcssj9MjLTfd7eGA0dj"}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.24.4-next.0_1610243123178_0.9807898087250644"},"_hasShrinkwrap":false},"1.24.4":{"name":"@skypilot/sugarbowl","version":"1.24.4","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.4","@skypilot/toolchain":"^5.1.2"},"publishConfig":{"access":"public"},"licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@1.24.4","dist":{"shasum":"458e91d44ff046cba26276c3b454f6f972c16393","integrity":"sha512-HmgM8b+8QsVdjOdCzmW8uv1ZTxSPGEl2l5+x3YB/lUOaegCFKdfXMYQfetVynFjZZGOPO8LgpVqchKNEez01Yg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-1.24.4.tgz","fileCount":164,"unpackedSize":93146,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf+l8MCRA9TVsSAnZWagAA+zsP/1Vel8gIsg7hI5fog4/9\n6tCSL8MQv4Sv6PBeogcUzIlxMWXn6WS+5Xb3JTyBZGZeqF6MgeQi0LnBDUnY\n/AZqE/y3ob24wVheQ0r5iCRFs57KS/n9cFXBPPyw+MnSETwl7K9utg+0ueGp\nhpimhnbVbIKL3TH4qZTyzVjXbkFVMIYh++oI3WmwA+9Hhr7atWRX4j3yk2GU\n03KCtdiVx4GXX85kqrA98RNWsj2I+2TEiOlNPAEb6cyRFkds1Pa995lh11LV\ntAPRWE++Ggqz9NMgseToWsmreIn0Hf9SmFB/OksY72bu36IVvB/5UYfyZ8NQ\nzH9J0hzZid3o6qTDLR5s/LLuyHEvWBxBLh94nlRgFBSERPr7Ys+XTkUv+bar\nzdHabCNm0Wo//GySD2c7k+vPHhgogntAk2CXbNxPWqciDb1+vY09Lz1iHLGZ\nmwTKBBzPt/7/inDFG8SGqsOQjcfdHbCuPXrRX2C4PoXxlxkwyJflcZ9liJa6\nkTAfozPhZU83nxzQIVF2tocgY1cNrUSOaGqfLW2P/sBQyGqmu6YyL4chAzOb\nHRUlTnx3Pde2/N93v3rVD6xalL5yPcVHUnaOpiD96MDe1efA6MI+ULNTuCnv\nUrI1SG5rUCvC8ZN2NbVhy4mZ0MzLsU+Wq45xb1zPPvBV1UNWdE95AyZ/kiIv\nE/Ri\r\n=fHB8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDLZrv0SyJAnjrTIMWP4/00nxcwZwD68MquzkytMzcM1gIgBUDK5UzP3096kEgf4OpdXM8f7ycgsgaUbZHDAXXFHOs="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_1.24.4_1610243852360_0.2543937273147212"},"_hasShrinkwrap":false},"2.0.0-next.0":{"name":"@skypilot/sugarbowl","version":"2.0.0-next.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.4","@skypilot/toolchain":"^5.1.2"},"engines":{"node":">=12.0.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@2.0.0-next.0","dist":{"shasum":"b0a77fe7211209622f116dc156b1b9af0587457c","integrity":"sha512-rJQotQ56j/F473YLD2SAEje0ATlapnJ9AbpQCM1LwnKWwjdWZB8sAsc8W351XyI5UHvmP4kOQHIXHD7/qEDbcA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-2.0.0-next.0.tgz","fileCount":164,"unpackedSize":93195,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgBdMHCRA9TVsSAnZWagAAkrIQAJUiIcKIvZadQCK9zaqr\n790P+pglK8PFlpJCRJPkBknopNVTiOH5ZdJMPQZuNZzkrX+y3dawbpy3ReTw\nwUHP2JkBC93Vinis8/8B9KPrDXf/BmkCBD+jJFbUWDM7xsu2tZKcl845tUuB\nnB0jTWyDiRkFjN+NNtdAs7veSj1m+MaLriNN6NOeLH7pQ9ES2AEyTaeQI+81\n5hg4+2CfAAvmUrR+A6b2rhRIfLxGcU9YiPM8uWGqFhLdFeWcfr30UsGqkiBk\npCc1bPYphKONe7DgqUgDoVRClNhCAdhho4YIwtZFdiotkM6dyDUoD79yKVy1\nXSEd7bY3xpyE8sEs5dGDFdGl7cDkTbRWNJEYTCh7ISVC8YUphAahkpahiuM5\n7FDeg5qpnzC11kN+Dh3k+no91RmqBQruvslIG8em+mEwRFNQGCyRDebvLP4g\nOFZqLzQPUb37qwF+PqHw9mrzGZeNXPH/RWo4oTOO+M1yZ9didtb7XV6uXrdw\nfOqYoVsX2Xz4uw+OqVMinad8EZJm+7NEn/z5PMAhxBenIm5DzjlmDt4xkteW\n5U7b1qdImwQr4OntALOU2rCJFoKUWw24PsIgkNeVBrPN0XOgG3xAmt5sxD8+\nAnD/TSVXxwgrkJIW9MBRojzjjdGrTtKJ0HD42ZcKJJ4HGjSSq3FasDh2Offz\nWYYv\r\n=c+1G\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICf79yP8HeYg/XVeKpbbl/73TbLsKUM3ERp/1U8Nsv0WAiAPYAvJiqkTUx4MgXMPgHhVlbOJwkjlhicPRi14wGyPhQ=="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_2.0.0-next.0_1610994439192_0.9277872938190947"},"_hasShrinkwrap":false},"2.0.0-next.1":{"name":"@skypilot/sugarbowl","version":"2.0.0-next.1","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.4","@skypilot/toolchain":"^5.1.2"},"engines":{"node":">=12.0.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@2.0.0-next.1","dist":{"shasum":"f0cd41c837707248182abea1d40bcbd61832ef24","integrity":"sha512-a8eBF4VeciopwKve0LdBkhid92d49z0Wch8GvriuOo5Scoi2ti3JadjuLj5pZ604609I9CQ4cJCwmpwK1CidhA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-2.0.0-next.1.tgz","fileCount":164,"unpackedSize":93209,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgBfv2CRA9TVsSAnZWagAAAY0P/ioUppaVYkkx4XbkVBXJ\nZRzIDP9h3cdaBnVwXTDIZMb+nIpgZhl6pxi6VShLWBXisUtAxn1NKaHkggvM\nGiN3ancEVucp0I/PV/xUxfmozWrO/+l+fl3Xtv2KgHwzTdbLwa3LzCTjbQZr\nvWPeyuM4f1GfY4011PH8qbQwKsQHSJAiONmvqGcg1+N63xUftjjtiMyAthvb\nUW/QiDw4GIFbufe1d2cwPj7npTaki6S1zX0CXQ77l0H18zLTS1VglQaK/iQY\nwwonKsowz95MSw6vzOQNEK3v8TVB28M5f5OzjzAJUCyHCSOnReVNicC77FPa\nnpzOXACbxzULlTX2nOz2F+6qBLp3jRAOOlbfu3NsMbCWhBjAle9g8O9L2j16\n2Xh4JpEjFg6sMqOSaJ+IfwGGanmS8l7SufhkrOYkRbkVlGXFI1oK9AjDSVTP\nZwZUmHVgYwAAPqTfugCQI9Nj90VGgxtYKkieFqWG6LdSElvKoMv/iGcmcULe\nGUDZgTX6+Klmn1BgQeUagW0arAuT3LsaeNelnAZZkjEon5AMQvMIlf5MBQvg\n9NHfjlxlAOjMUyEV5toOWHaYIE+qLJuyngj6nZARR7+We+tY0lq/S45LyJhl\nSQXB3+o8u9A84KWTfbexMYUCg8f6j8DmzDru+OIuw/Gy89Hw46bjWoiDB98/\nBGYA\r\n=oGrd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEA0PVSLxEHJB55NFyRQteKQZ3qvuT3c/6F9MR5Bp5aNAiAQ5VJRF0uCdjjJpM8H9asf6jCLgmNH6WeORbqrSRy5IQ=="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_2.0.0-next.1_1611004917998_0.195410934594624"},"_hasShrinkwrap":false},"2.0.0":{"name":"@skypilot/sugarbowl","version":"2.0.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.4","@skypilot/toolchain":"^5.1.2"},"engines":{"node":">=12.0.0"},"publishConfig":{"access":"public"},"licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@2.0.0","dist":{"shasum":"a242ceec96e98ce4214f4024be3d0902ec226c25","integrity":"sha512-nxEbW9tcFAP2I4M749KtrVZga/xSxEpDhBBj/+yUpPFOi1BOKnuCZqH+6whHp2pqz7NYNx/BAlDb1iJ6N8O7xQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-2.0.0.tgz","fileCount":164,"unpackedSize":93525,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgBfyFCRA9TVsSAnZWagAAZFcQAJq4eiB7wTeRHNWBLGOv\nHg6EhXEoAwUuXf6X0R5fzPiKKdY1hKXgj5qV33b36NkfneyAXsf0WiDISLc2\nvsfsWXkqoPvzWkcuCpFMrxV3saW1afO2gEC2HivxCohScpwz2u/IfpcJenM6\n3tfsQOqbFdVQNim8ADH8Mvyf60GvPCrWFpHQOT3aey76ljL4dcD3NiFwKJta\no5x78B6WC/BJ6J7o4gAYUR7lWuRbijofzcSe/MGQXBZSjac7Ds4HVvFFUJwE\nDVG+WEkn1Rd3/1ojPzVC60g7SGXOW5Sd5NEZ22gdIWBxehtWatV5s8kDBJHD\nYLgd7M/qR5v8lO/fFlCAHUP0kdpNFqqXWOh2IAbxaRKhbRsL17EEG95EMD3p\nL4CxNptYwyAyH2AHn12x+w9eJ3vFD6vsP2ewQGPwt6E73C9jwKBw0qFEvzjU\n+nFhyxhb1vUYfzqWdqfl4kXUSizX5S0efA1h4OQwIeLvQdEgEBDsrpB71PXm\nSBShWdzoGVs2DYifAXQ945m9YXOrEi5TaGNRWD9ZKuMqqqPmw+P5O9yS4NPM\nU6f22uMYkVcpxrPlPG3mfVlkV5//pIeg1lVrbaWLyaI5O6pJz5PQyqUgq63O\nxrZOPv6uuN92Zi7g4cw7iXv+W7CNTxmJmIXkSdpdxc7HaD8dJi6Tl2a2iUEk\nXqIv\r\n=sohR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC6inhajDQaUEm9qrE9ImXtbjyQwM/VBF1GFA0AjQml0gIhAOHtrz/pcyseGGGSYrnqoVRdb40SK44t68V/em7OA1LT"}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_2.0.0_1611005061354_0.9800328022279052"},"_hasShrinkwrap":false},"2.1.0-next.0":{"name":"@skypilot/sugarbowl","version":"2.1.0-next.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.4","@skypilot/toolchain":"^5.1.2"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@2.1.0-next.0","dist":{"shasum":"664268b19b54436b54bd9145e83a4a15e6508228","integrity":"sha512-rcYqyR351V9diyMnkkXcWZY5b7s0ubU2fHX+cvccgc6QdzeKUqL3wbfni1Fu2yHTTNbLHZ9m6cgkT5YBg2xMRQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-2.1.0-next.0.tgz","fileCount":164,"unpackedSize":93533,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgBgQoCRA9TVsSAnZWagAAZqMP/1tTWSEGZve3TFVz7qD2\nQunysvUbhXIgyugIdfu+nVNoQq+aiVhLmfl568VkjSrc/cia0QjFe4w+3dZW\n9X1eqcSCevgAtrEuc1lLlzbzUJ7UDq50Fc1KW+DPmi9tPXq3IjSnK36tPyyE\nObblIAwczc3oySw5hffUEqHo2dMDdQmfoKUvFwa2EOYRFcI5Jgso/ChkXO7I\nq5nVsdYXE0YoRfXB3EV2/Y9v+bPpFpP1P8VkZeEZVj2gcOe/vLS6rU//9YDJ\nYETsGU7RX/97tzQ1/MmtRZO9X7wTs8aTmlctKwBlq5V4gcKTNgLoiMdBgqPv\nJdgZ3ZaFVvt9mJAAINIHtN1weq0EoH87TP57ln+mCUtx7GNzBF79avv1z26S\neFASggWw7rdOm8X539AoeSoQIsDNZdSx/qavUJUWaIi/8POmPqCSE4aBP5Hd\neQdRjBa7EW/DzvVMnzss9R0jRAlBn4+jr7hZtelKhiEX16jWr53lEEG4wP0N\n9FcYYjr/CIyfxHZqFzvGEyKkAhnlxuVEKlOs/sJXGoKzVhHfNuqR+4RmMOmr\nC0c4NxHkT8dww3U5jcJ7bLAgeOw9VZ8+bCZhOZeMPmRLb3yqjmhGBdPNHn71\nmgEtRLlVw54ZpbnpjZ+4wYkM/vKcWvL5AGl5Wzgt1VGTzdqa9tfX31b078IN\ni8sh\r\n=KT9x\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDbNElcml9DM7RC62sbBmNZef2fCneQjtNS6MEPOnZELwIgaET7+R5byNkIh+JNtEpNhH9hbMV6/wkhSVld0cOyWuM="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_2.1.0-next.0_1611007015930_0.5002501146760976"},"_hasShrinkwrap":false},"2.1.0":{"name":"@skypilot/sugarbowl","version":"2.1.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.4","@skypilot/toolchain":"^5.1.2"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@2.1.0","dist":{"shasum":"f416844bd9ed1e81d2c9bd0a8b9cf5b46531a92c","integrity":"sha512-hjkqN9T/9L9iGBNlwMHDJJrFBYPjl8UgfpDQEVUXHjLQR8Gs/bH+KIjc5qaBdyAjEq9G6L1QybhwZvfS3kVsZQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-2.1.0.tgz","fileCount":164,"unpackedSize":93775,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgBgSyCRA9TVsSAnZWagAAvmwP/jjBMhSMXiyni2gLx9c2\njAG3XROusrdJNLD5zVFDqBFCHLt+ZMijlW+CnSUM/A+22n17Yzhtk/BqpEOK\nusjD1jPwj+uMlLpH4Dtj/JLM1molegAailtfFBX3NbhK8S1g7QESSq+DKu5B\nqjXJ3og6/0PdNeNkC77cClazyC5No/QYhDYp0YvbsZBbhluRuUaSHd7Dze9H\n8uwH0cpYdmgrgUdvwy6nuSmcUlXZ2BeP+EcvvY6mlrIQqwMd3iXYpfBgQiwE\n8BoygdW6e+nZUFHNHsTjwBQj3URXRZvxGsVwRddKXm9OHTrZH/Q2PPJD7CDE\nYcLXKIqqDPXGcPdNWHm2cdI5PLtS3OcNZjr/qt0PRcObeWCVPv95+o4HTkls\n4y9DoU2J2eswSd7w1TSUvptQiQvEyeV3yDNlP6OVvK3buEDXS/3ruJa/kqi1\ngHux4wJTjmgEOU+JOkBcWFKlrmrIDCrY5VWY/Ca0NL3D1kaLEIkCzlNNcs04\nACcrXUoErV9HNqdbsnQJoEIbzjzqnTWw1b1q7Qg8iFzUN3EqlRwe7up7m8lo\naIRPlsTEWut/FFRRkStvjMidaNWVWvnmxAKJ+NJRggSCQxtPCxE4CF4vgFhw\nfvY0cXtn9fyD9nEbrYCHmnxctybm2doeJXbYRWyJW85IPDp5R9qsawQ5vEf2\ntuis\r\n=/PI6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDSmolDekHVqqNdamxTVHRaRFNZnNCiyb7dhmHnfedRDAIhAI+2pQoLWWTl+uLvThV0Lvz102Sj3gmRHyGTJJT0Krc8"}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_2.1.0_1611007153455_0.963010849675189"},"_hasShrinkwrap":false},"2.1.1-next.0":{"name":"@skypilot/sugarbowl","version":"2.1.1-next.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.4","@skypilot/toolchain":"^5.1.4"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@2.1.1-next.0","dist":{"shasum":"1f2db162a8b59f222bd33b40f3d951620fe46fc7","integrity":"sha512-9shLuj/YrNEJZ8+Uz06vAExOWzXQ3pDMXJ2Yxp3fmW8TvMw2w2wqa4xAIeZ+aKuAoR6xaSDTdLOUE0rB7ztfRw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-2.1.1-next.0.tgz","fileCount":164,"unpackedSize":93782,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgOxL/CRA9TVsSAnZWagAA21sP/j7MCYeDx3axt+Q1wzrn\naB13rl2bgPrKfQqUfO2FRCEBUkSZDwWhfcVJu2eHlEmOhw1QEaQCwGlMdx3I\npA/k17jEi8rrmSkREq+JlMKWR4Y+z63abHHtBY4hVJtegFw9LyDkcBUYYKlP\n9OqtByY7VL7hFzTahfttw6eUXuugvBOQDd6Nt+TYbVHaiwBeSpZSBljqeKzU\nsHW3Dy/9rP29cgEAp4zjbwozrK70T7g1rW/ebKymUdDivHRPvnt6+z5Ahx9Z\nBu/XuEHbail3DK1HuJp8Xn0/5QIULnnafJGYBGUdq2RLvcWqhYUf6wfD21pN\nWI4xLXH5SIcM2EtYlVeKbc3PNdVR4yOnedv/0RTPw0SnH1ifagsEylOGr/Q0\nTPNqGOHr/u7mIQRlSf5KtHz+ekIb64QAH/bk1/Q+3mOsa/peoMidYTfzG2Wr\n60eM1medPKKL5ufD8sAv+EsnEDaeLSAelLgKEyU/5l7J2bkX2uUQxm6mypCQ\n4bVOAV079E0ctr00xvAW7OlKX6cl7M1/3HFgWfptNho3GVnkm8FA7BKlQ+9e\nR+EIs/9ORufxIe0oPUfxFbFH5Udgh35udniTu9amoWZYH9oc7VRCqclAuQ7u\nD7HAWXiZuttCyzxMXqwbXBnjq2dRbXf8JBjzeVN8zllyHLs7PdbY4ogR0ga+\nRpS5\r\n=iuwz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFQm6YfkCkgF2cIBs1yU3ZzjTeP6RfJu/JgOhY2M4uGOAiEA+KqDlWPoleloQ1cE9W/h6OwK71+bjoVVvTvsEBD7vY4="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_2.1.1-next.0_1614484223040_0.09739170997883972"},"_hasShrinkwrap":false},"2.2.0-next.0":{"name":"@skypilot/sugarbowl","version":"2.2.0-next.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.4","@skypilot/toolchain":"^5.1.4"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@2.2.0-next.0","dist":{"shasum":"f57a073ae95496c2f55df121a741b376d8b504d6","integrity":"sha512-vv7NKrXGebFx+2kKwb9Z3VbzUfsjKMgiflEGhVEUA6pi+iVe0pkIXehd7PbWEQGW1tH44tcVou7j793Uh6oA/g==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-2.2.0-next.0.tgz","fileCount":166,"unpackedSize":95930,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgOxWtCRA9TVsSAnZWagAAepkQAJpsICgcs7IWcDh7kxto\nKsReS7bFeYI6JF3epaXe0pZz2boCGEZ34qi9VLdK+zS+5/lTKhPOs199o+Vi\nKlKaRrpgb+4INxN1104X799eGvl0vbgV8EmO2atddFj/HyKBU3GmPAk1gOXR\nPK/tJx22sRoQja3jgJUuGiBI8rK34O4uPMMat6C2hh3c3w3GJOF4trCMH506\nkccFio+Gju/aubJOwEgkOgIfkbHqaflLs8boqyENzx+nJXH5/KgVJ7XF5igM\n1fxGAoPSfKxyCXEQLQr3aIJPFhy7NZUZ+/Xr0N/x6YLAz7uPpRp5MO6uoU/O\n55tMuSTEPELkXRU2X8pj3CTDqqL7nokqptE0Qrvq4io81eyDQIxYqxJ2Qid1\n9abTsFKMumFqThledxt4XBSb70ULFptpYQfPjFJ7C1x6CirB8hRmECM6CYaL\nArsVfHKg9nHdQTQGT8UujMOWxIQyacYjn/vjtHwP9D9UVqNk+DewQxI4Sr0H\nC6y7C1Be7GJNMf5QOwvJHj+RwFVP9mmJ0zxIrFLPDqWpU7YKbjXvoY80Y+jX\n0vWjkEDc4a0u+JNZBywJ/eOYrH6HB9sxIfOZ7+UtvgOClx5jEsz/h3SvZMGE\n/p2HfntfVDgAQnmTn+YZJtW79VDwdWQVro0rCrU+rexz0vmWxBMpcdA5s4FU\nA2pD\r\n=V7mX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCneKR1/NUxLwZpWeOZTRTZZ/fpReOWqPx4xCewyxNGwAIgE3hx5AzQdhGlc4MDAhdVsxqjKhHWmtM9hI8pfieJDvc="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_2.2.0-next.0_1614484909170_0.5095583188601565"},"_hasShrinkwrap":false},"2.2.0":{"name":"@skypilot/sugarbowl","version":"2.2.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.4","@skypilot/toolchain":"^5.1.4"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@2.2.0","dist":{"shasum":"13f4d05712dee0b572e3332ee777b2846ff70b48","integrity":"sha512-tx0t8wixr8DYbTHEGD6Sg/8QehRbdHVu5DrlPHLgq1COVuUoag8mVv3MgnZEz2fvJATojp0+j4EgenLb+hFbwg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-2.2.0.tgz","fileCount":166,"unpackedSize":96329,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgOxgfCRA9TVsSAnZWagAAcMEP/2sipgNGOUsKzXHrtkVN\np/E8QmnFgcFOQ44Cm7uI9ADBTZxYVR8JwKYWRnwduFMxRNgq9mUr+PX9LeO8\nSi67gms2j6IVrXb4kn0tPbTWge/h2NFsJmeE53urDNjWOSWdMVgPLSFFrM6f\nLFFWo/RBYXxy628M9AHhaeVnBpcxP1Wj11zkjuDkohjrQm2kNvK2tRE5sU2+\nTeMXT1y8nIvBNmru9APkFJAbKyWfhi6k6g9EKu4zhxuqkIR/I497hkdtootW\ntk2VEk3NFJKKhb69OuGYzSp9ut+/BC1xCu3rWkk2u2jTj7AaWD5DCR/VyZfE\njamZzJfT9P6Y46oOYI+eI0CmgIXtvI1QIWaBfyqkI05oyonRRd6zQcHGGIJg\nxm8p40cBBONMqypdUOxKy9IS046UNT/V1vxN0oFzFv0TwX3f1ttFIFyEKaOw\nzE4VbJblWylsEFa0s4VxFza8WlifQSsY1GR8VLqgdsNtscNCvI9Z/2guGTi6\nY2VvajLVRFHUoqqGKET/bvlJllz0mRi9F3yySqQOvM5EJv4/JjitmAkaYYmp\n4IIpM52vg0M5WtrGyEBdGaxWj9dn9YbbFR9K+ZGxFGPlevYIw610M2z5Hh3h\nSN4o1MpzorxBV01ti/f3Z3WouQPkLQffbWmWyM56iMWt1sglPngm0doQ3QBi\n2Gwl\r\n=hQX4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFTnf50LDbEtbZ25Z7jueMGeC9bHq/rZAMS0TWC92CkjAiBTUZLozOhsGuiDZVqOr0TEqwxLLJr6WCyrFQiw/RUwYQ=="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_2.2.0_1614485534784_0.1469556637021141"},"_hasShrinkwrap":false},"2.2.1-next.0":{"name":"@skypilot/sugarbowl","version":"2.2.1-next.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.5","@skypilot/toolchain":"^5.1.4"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `slugifyIsoDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@2.2.1-next.0","dist":{"shasum":"2224ee1cef36ee10855f183a5815846c57854c8b","integrity":"sha512-DP231DPqMkcCL1JPTzfnhtmUpvV+25L/bUroVd05kdNjbZPp2OzBSRPU5G5NQ45qoQYCBqmgD5cEGV+T4q7lZw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-2.2.1-next.0.tgz","fileCount":166,"unpackedSize":96361,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgOzihCRA9TVsSAnZWagAAjY8QAKUT4BDLAbGn+FprbZ5B\npHcIkgWsTaput1T/NfX98/HRXkKJnTqf1RGMiHoGjj8Jdu/SQj16P8bHi7yD\no0JlJKlNoFIkCb6ABkiW1q+2AGEVDaVd38vNYPfCnabwmD4crUO34pO5l2L8\nUKqgM/8SwtJBCB5LTVPsnMwCVUenfwS4DNFJn6sfoGiWVXEUofhVbRdpZjnC\nGRUgRv8SWWhTK2aRtOI34+eSkTfKiiA7wddR5aUPUvQuTeA1+ncl2dNPSHEk\nffg8pd0GKFkXVXPPW1UeOpN8fzPFkb8jfmIo/E8LJBAYP0fZa9DvBEeRge7q\nUenQqXKhNoy930hCGWFVMYrkgLg48r87b/ixnSEofDHtIDkmu/d0Pww85Mir\nOq7z17doTh6tAnRyOG0SAsRuxM06VPFqILirjmLYJTH/oG1oyDchbM/yXyk9\numJGLilbVhwV3C/+0WQjrqZ0UOSHIM0Me9qTFJsZX6qlgnW1dkNG0B6cgqBH\nXgh4E3axctIcmNHL/y4a/HHkYHDdk6nyDklltC4VxEaklkJodS8TJXywMfm5\n/CfttcuDj23kTl/m0boIakv7aSjVOkftrbylQgRb0rbpJkoxpjS/Wiug6j/Y\nuDxAEA5M7S8IX7JgsrDmnPpW6AlBup24y3mB7NXjKYrAmRbB5ngpR2qXFV+E\nmI+6\r\n=fPWF\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGEtbmUgseyAnXYaYMQqcie3aSYffMbdjTIakN8ou4auAiB+MWmYsZ0U9i3FT61jEtwa3gKojeny8jg4w4AggR0bWg=="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_2.2.1-next.0_1614493856669_0.6669577372406106"},"_hasShrinkwrap":false},"2.2.1":{"name":"@skypilot/sugarbowl","version":"2.2.1","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.5","@skypilot/toolchain":"^5.1.4"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@2.2.1","dist":{"shasum":"0f5849532e641f4ca2d2a051c0dc0a8ce6249d1d","integrity":"sha512-elHDy2ooNiPXxdxHevFeBD06SLEbdi3I/RWS2D4SKXz0J15pAf7P1q1En98eYVjnMRVIwN8QDPrP4X+/DHMP7g==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-2.2.1.tgz","fileCount":166,"unpackedSize":96455,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgOzluCRA9TVsSAnZWagAAwq0P/iXHD4Q9dsvdLW0m48VF\nfcvWj3n3idarhBSnW2Jcpp9APl+DC9ItC0zh9e/tghGlBkEUjuVO1OLImIGm\naBNIm9jsOmmiv9ZhZWTQhtFQZBvBIXyk6cXADK7sDtQpevyYMUxVyYcjb1Du\nEhO8Ef8jphND4OKt2GbsxOcvN8TpbCFcobleklqwykhQ7sV+9mvaUPuBDftp\ni337wCA68qjCRaZfj5DpTQKjzb4l4qWkKdo7WfhS0wtpqphouzpy/iEYYv4X\nxdpw1dHVfunh9cWd5A/931vvzNmdDg2usyr3OMQt4KEekyA5KaeRkh2B/O/8\ngO6gZTDlFPRm/7HGrIDy6bbZdpUbPWvputFgXAv+5xNjr6ajZ7le8JWAvIjn\n4NKgVkM2HTY8zUKNqOBthRcnmdpv4AFPu42NGGaTM7I3GeVDydHY19Q2nSa7\nbZZJNW6qwIQojbsGe1oK2LtmdyFohoZweJTzUymMN+xgRI3F5NFUYuk3pU3t\n8WDPYRDTeyV2+bcfDnQLpOsQ4Ld+6N7LPfzF/PKg6+UcnXW6bCahSyz1g29J\nt81msB9g0ptbpVyt/4jUa+Z+4QhMIBNYcOf27Hqa5V2AFkKRtqednqvu61Bv\n24uFY/x2p2HAndsCSIyZqkTNRLM5EfBkPtE6KyKW8RwFweWy9uR1ZGCWOLeb\nXVRN\r\n=mLEE\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCk8LlDwYvv/GCMYhDn8Fk8NHI46JQITh5ccK/n0wJaeQIhAO9IAQ/1/cXbAssEkqXENKNbEct9cKvHPrEh0/nefS2o"}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_2.2.1_1614494061317_0.15136823050657866"},"_hasShrinkwrap":false},"2.2.1-alpha.0":{"name":"@skypilot/sugarbowl","version":"2.2.1-alpha.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.5","@skypilot/toolchain":"^5.1.4"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `slugifyIsoDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@2.2.1-alpha.0","dist":{"shasum":"c0549215652500f5311d80fbe8d619060cf19e3b","integrity":"sha512-PblZ/dcix4US2AZxQRB4p8XZdbvNhYQ4i169+D2M9hjvYoETV+bWQZNt6Fejo1y2Pl+GNTBfeBpH6O4TTQ13pg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-2.2.1-alpha.0.tgz","fileCount":166,"unpackedSize":96463,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgPUITCRA9TVsSAnZWagAA03QQAJ2eE9FvPWQSWc0y4re3\ngzj/3Dv25NebV47kWxPDsGTHd7u4AlLNGua6CWMam+FaJmJU7he4SbGFz6n+\n3DtXp/WvqIhw8vIOUls6VoajJiY5a5wKW+LHaMZ1dfyXyWotEDW+/M3n8+SM\n1xGCwvnOEzlZZkN+4qQb2NUR1y6BsDd+18Zf5Qf8xxHIFIQsEBjN53on1coc\nCXTXXmYfby3j4i5YNSvux6T41haAwoi6m1utwXULaM9asxQVhIIEgBF9bHjd\neYV/tynUwKn8TJygWU0vQbPCn1lw/V0KCIUDpfU4jUAs2nNgkspjroOJEzGX\niwwfeGI3vhJCgs8dFVHc9zFfJpPQbrtqtavxWu9a2jcWGC9XY9lJuvP1D50h\nRiiJkHqd8otIj5VKbgA/7lzKjSnAXE++bpnpS0Q7yAs0C4MHEeEGwogTEivQ\nDj+LQdGH67avT6ZYjPzLyuQAV+n3m/jDZ1mJN0BYwLSBRd9o2OMlJlu9Tt3w\noU7k9zP26hqVw5whZgjq1RNzIXzZTLkkmGVHrGISw+03AaYiPad/j4baUy1c\nu/xDFgRxwkc/kzhZTPQrhe5s1S0Cv2WoFgmV0haD/jZugkHQb0oErRLLUxx5\nJRogCnjnz6DaKZ6KwdPhH+6HnlCgmKITkHc1KDf6Mx9DkRUwGbTWw8i8kIUn\nkWoF\r\n=YbM/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDPiV12YoGlBFxX+O7mNObedsHijckWfgd9y/6YmwHaJwIgQgoSmG19+r5KfDh9mx1lSeHWygDO7GQ7VOKAeljpjgw="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_2.2.1-alpha.0_1614627346679_0.990034599948328"},"_hasShrinkwrap":false},"3.0.0-alpha.0":{"name":"@skypilot/sugarbowl","version":"3.0.0-alpha.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{},"devDependencies":{"@skypilot/common-types":"^2.1.5","@skypilot/toolchain":"^5.1.4"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.0.0-alpha.0","dist":{"shasum":"904a80d04953e7505b69d0136e1ff6a1a36b7357","integrity":"sha512-ivdO3VMbH+qIQ1Sdi6H1qaMxhb4l6ZQ6B/HdpQ2i6qv8MiAeA2PXLzbRDpJ2Ie4vbMk/5fYQUycn5jgctAfVZA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.0.0-alpha.0.tgz","fileCount":166,"unpackedSize":98328,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgPV0TCRA9TVsSAnZWagAANQYQAJQmPpcbTuxLkUZTe2/R\nNqORiVKFgYOaY28uXV2CSJNtoKx1IUNEXeuTVkpXkg1GCa8+KpWIXz26l0iM\nl1DdA5AAsCAQZLm+flFsifJdtoq4TBD0cTdU5g3SSMMpOrAGeqpefTDjyhya\noDXL3pM2Zf8ltNzUhIUFCql/WI79nluOVsOL5rKrc7wVppfQ2W0pqDh3lDKe\ny8mR7oL4/RdloMThd3aZS02XZw31QLDQfMZXhJ5+u3b3HGGhtAZidyi6FVth\nHMm6qT1wpmG+Abgb0zvY9uju28ICveYSJDBGPhDABWGJsQmrcTAY3fcoc3zc\ngBxZG+/bEXCGgFRQGx/xRx7YuB5xuTqZ84w4WiaMDSNnptVOQWnoJhJMNYqa\n73S7tTxNQ5hODAqVnKQiTXmsDEgU+68HC4dUFE8kKKnTHYEtTbtftA9ghdGh\n/JxQtvSn0myNS0yXovsf5/5ZAbpeSkWEFDTENZ5/vXrU1ATCC/w29Is2RCn+\n3441RZ46OVz2o5gkdRSPPPyuDIsFWDmIBERhUVd2OgbXGMVgHjivgr/MRthY\nwkjM90w3PIqfWjcA4au3FYYegJ8lzWJ6dhx1fjvKJQQ51LtR3hOPhGhm9sAf\ny+r6ByNN5pOguJf/9k49EyAA5S6UfAXCPD7EGRIPQF0kfR8xgQ79PL3vb6Iu\nXIeQ\r\n=rTjQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD6xKx2i2Q9vGKQmhd/676GZUyDWodtZusF8YCPpiAMFwIgSDb++9FbsscLO4bGaioWHiBFjRw4YM2H/PSGhpn5q5M="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.0.0-alpha.0_1614634259147_0.24681081087086643"},"_hasShrinkwrap":false},"3.0.0-alpha.1":{"name":"@skypilot/sugarbowl","version":"3.0.0-alpha.1","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.1.5","@skypilot/toolchain":"^5.1.4"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.0.0-alpha.1","dist":{"shasum":"8a3bbca81dbf1b4bd5d9818f80d826510e402986","integrity":"sha512-bCrwi0WIZvdZlxbeF+m5536sfjG3Xv+gx34pJPUh9LMK6LVoYUHA+j53/3X8WEk1eOcVqzOxSemvm+RAaEUdqQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.0.0-alpha.1.tgz","fileCount":168,"unpackedSize":99223,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgPajkCRA9TVsSAnZWagAAmn8P/RMO9HjcTPb/1OV4KQsm\nTkBaviU9QSn7xXdyl/io+Xrujwo9FTQ7UwX4lmbXH8g3sz3fWskaEdpJgGct\nrfKJjioxtssGAYskIzJAsl8dBQ3BrKtnUGUyQY6jydbiycGZXyWAafjG4rQf\nd8nhalu5KzQAt31+Vemoawrm8xj/4/aDtOQBU6Dt67X+uZDDMKvl8n8Jl7dD\nWkQiepHAdi9OxaOZHuTWN2c6/AHPA98PimselG/41VfG94h7febHbsxBcQUo\nUslNcOLY+Emm2Q+B0TlzNplBpMPeOdGgzGEyKDmzk7VAKR9VOAMiXN2ta4DL\nl62TTuDOVDJ7X+o65HpYu3flJkLVvb1njKk5YF9OqAE7x/oyjhS1SYSHSfVC\nRe8Xx1jT1nQmkVX3A3dU9rio1mnmt6r/njCLXRDam/buTByQpwCQNziATZAN\nTYBDjIvnRpJn+FMxvkVquLaE2KMWfe66pCxnlJCnRdp3l4xJ1rz9E1RCNguK\nJK158K47PCwauTnyf7rdk8D4nyfbQL8OtCrKQmvHmWufmPe5xTVTLcy8AP7F\nah1yNu2eEF/AJtxI18Ku78DGpTVmrnvUoG21NZpUV2gN0ewxtmTxsRQ29s49\nKVUq/vzILlaDX7jDsiO4j76ZalSkhRQvDYSOcye1Y0nW8UfHow2rCF7X/nX4\nrcxU\r\n=TCCH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDGe/eTHWeYGAeJ0TCheGZoTSnHmwtif3IKKJ+bJpJdOQIhAJRT8+WIGzYpzLP4bC8EwO+bqDnAzKsJPoagKg5WkPXF"}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.0.0-alpha.1_1614653667789_0.830378081909303"},"_hasShrinkwrap":false},"3.0.0-alpha.2":{"name":"@skypilot/sugarbowl","version":"3.0.0-alpha.2","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.1.5","@skypilot/toolchain":"^5.1.4"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `deleteFile`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.0.0-alpha.2","dist":{"shasum":"6e7bb47875a34d93396243385603628740132613","integrity":"sha512-2UC11e/2rRo5naFnhyI6MI8eDKOcSaSVPtNYFBdvSYKarSlxREnEGZIPefNh4fZTHw6YyKar6K9ZtUxzoXlmew==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.0.0-alpha.2.tgz","fileCount":170,"unpackedSize":100041,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgRaFQCRA9TVsSAnZWagAAARQP/jKxNkEbDM/iB39zfEEa\nC2WlnqWUGf43n1gEPn3Mgn7z4EtHmyK2fXyr5AeMCODAsQecbhuiQVtA4tng\nIWzDLm4sB9fC6zctz37a5FLqzSUpDXGtW+3vOnoqUgNi4puHKPb1BGuMMBD7\n6G9a0hq/Yya+Uqb0dz91vXMJJa6yvMYHK2XblRnPLu6MvI4NmoN081ATvI2J\n6e4YngHzsXgrdd89vlRKwdwRgxIFC4XMpLTKSm8gp0ZZSPQlI+oftImY7PP1\nNdghf4Cbl68ayBxu0qxGDvAr3rv3BKxerMUzre3tX/XIaIR9527u3vOA/jcB\n93gkOGeMBCOfgtWpsmcnZbX6Jbyb0pHqbBCHU9CMn5jG7R50d4AWZ6bcqa+M\njAyQoCyrN7IjGQQ/xGXKK4NURDcGHUV0Kv7auEI5JVgN1yNFjciO37puGUAT\n8HgHADRaxD0/ZhtGQ9Z8ERg836p4KyZ7CSecZ32zNWwAByC0jeIuwascXFxM\n+cQyZbMo0prmMwu6CizJcry3C6VbhUBI1GXjOOd3rCSS0kimWAmBxOU0pqjs\nEk5oO80KeQFq3ly8Cc5YhmVVH/Fsz0lUykIoM4a40e8Z9JRMVd1uoY/ocqTK\nVYqo8vHHHwz2ezed1gKDJsXZZqPl9FObCoThQYCJKIAPj8BVPJCkrXS2uHjG\nN72a\r\n=KyKS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGHWU1Xo7rNO+ZtKgHHSVPK+/NHAqT2a2xztqO1nC+JzAiAUsoUv1yyurY122gwH4dOK+Li8zxi+yCszIo2tQUWw9A=="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.0.0-alpha.2_1615176015481_0.20613898414608878"},"_hasShrinkwrap":false},"3.0.0-alpha.3":{"name":"@skypilot/sugarbowl","version":"3.0.0-alpha.3","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.1.8","@skypilot/toolchain":"^5.2.0"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `deleteFile`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.0.0-alpha.3","dist":{"shasum":"5618a67ea422f6b7d9674e43b02dbc18a37e0827","integrity":"sha512-CZpsHZWk1Mdm7exAisAibtw1hu2Vs7qY/eMDyjwk0iJF8h1L2P/jJNrXm0yfb8CP2sMAqBCVkmtIpow7c3dDLw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.0.0-alpha.3.tgz","fileCount":170,"unpackedSize":100184,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgTTMlCRA9TVsSAnZWagAAmvgP/3XOcdlpWHL5DvslboIS\n/wRskLeuLlaTK762zf2hX56XCCjenbZmXX38QEUrWQqKjr8P4pDejLvArxqu\njKJtoY2XWoThRcigo6gFx32TfRE5lmZ2+OzhSCbMtjJAtPvAoFqBFfzL3ksK\npieojMgSLsQr1BbI/5ubrlwLFPwhujLXsfvMXWJwjTBxrz0gA8RCKYlJoPD8\nujuCYPP83tQeuSqg9AmYlyj8h9udCIKRjOWlhWXc5I6lbRstiv0ETolEPYam\nXtdvG3h3fx+MR59PceH1ml8aBZ51PeiBqX+gl0CfVzS/72xL9+KjqEPtV+fV\nCceJloMlbvpZFg3t4J2g9q/NZBjkiaroQRlKUMrEvLvL4Hbn2maf77azbwSJ\n8KcO5gcrqoxE2Y5oEqFk6WnyXd9GNrs6HasN6Z2qm5xJXz3Y23sxFayu/XQv\nDVwIUHIHZztE8yMxsS3QmQx6Z2BM1wAWvQp0SlzEh+xM8QR2G09IOp1E3F3W\n6btPWiLtfqKMDDanKbjWcs4yyC/sGUNOjUsWRtNexUoRImcaZxdRdSojtvTn\nRR3yZOXYXPYfD8RCDzFBRpN8+jb9909VfRC2dK8vuMM/7158Mnfv78P/8HWG\noWYZIiOZjeASas6HC2g3BifryLfELHR/VUiD1mLm6aZjTKSJzY+rYYA0s1UJ\n35mi\r\n=Et5g\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCrnJ/m+r3dcJN4doFJZgusOuOU2U8j/Iz0D7MfYRl5fAIhAMH7pqmSqmnwxxjiW9bge/T8psUlGblYzzyOirj15FJC"}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.0.0-alpha.3_1615672101091_0.42752614609854134"},"_hasShrinkwrap":false},"3.0.0-alpha.4":{"name":"@skypilot/sugarbowl","version":"3.0.0-alpha.4","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.1.8","@skypilot/toolchain":"^5.2.0"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `deleteFile`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.0.0-alpha.4","dist":{"shasum":"3b9c1414814e6e63876899dfb18d87bbbe22f22e","integrity":"sha512-EBcRp1wQ7HlA/DTbmZR3QBR6cAWwDRng7wUlg0kLE3JEoAauvgWRIQZZhwzlPVWYKONICiPDGl70DjxTK5r0bA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.0.0-alpha.4.tgz","fileCount":170,"unpackedSize":99677,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgTTUqCRA9TVsSAnZWagAAp6kP/2InG8q2Ux+S8DTAFtOU\nC6B6Hn7KY9G8R9ZGA7tEt0PTwQAZHq1ZhWAlsQ/OhVEAE4gIQmAJIZSdzCxL\n6a/AoEgHLNfRplBDqOVUIncyBf3WArHDQZJfI+0XNdZsLdsX7zoINX3AhRTD\n4nxGlBd3ATALF9mG52sdwxZfjb+0CPqWT7TQvHBPtBIVkw30bB9oVvbyTxVm\n08YT9U3wH67P2ZOS2HTUH4t4Tk/U0X8d5RM13vOHVhvSR6rjRS6vAwM3frZP\nLzM+NpnTQZRAwDSkK9W2a2eSwmwRi+ingTH+Bax2yvdC0FKROuwfzmKP1h1g\n57x+HaunIK/9WtEp7YqmJB10tkQnU0qJVdmGxdm8R9VKFv0ogQVSIa3le73F\nQl+ROOnf78u2pKwdrSQEsCW8mdm2KuzmUhifeBzSLOrLBtHlOkkUHQiZnVSX\n3IMq9fPsX03bO/ukQWmCl6Q7BbU3YNKxwJzfr394olZ4wflfg58eMxDgUUxG\nrQ/wB46rjHFoyFC05JEJCWGj5YWAIm0iyEySh+k+y6jCPRwSMKprM3LcSQ3h\n/uLqD+80tJNR0rpMzmaQ0fbU0H0imNkw+Exwv9VMHoWng3BoI8DP5MExDgHZ\nzIwXKkblgqkXjB+iAfpI5bzaruKD8yPYhnp40GKDrr9KxUNXEesYzvEvfEtJ\nGywa\r\n=ez9a\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC6bliZZZVs54ji7Xn3DJlmqObRrZlNhgnUMNnWwY/LAAIgTHo8jR2XiOMkaR2QXcqBGVq618IphPpwciZy44L2+p4="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.0.0-alpha.4_1615672618259_0.3250130584178188"},"_hasShrinkwrap":false},"3.0.0-alpha.5":{"name":"@skypilot/sugarbowl","version":"3.0.0-alpha.5","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.1.8","@skypilot/toolchain":"^5.2.1"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `deleteFile`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.0.0-alpha.5","dist":{"shasum":"c7d2289788622489a192f698dea8cfb39c232188","integrity":"sha512-P6SO2crVjSwS30ztXlcKTNwk/C8fr7/JboYhS78Y0SMtXdaCaBJpOHA/QLnchB/DJzYpRE9oxTU9SAe+WgGFYA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.0.0-alpha.5.tgz","fileCount":170,"unpackedSize":99677,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgTVUGCRA9TVsSAnZWagAAA80P/3D+NCZOgIy87wXUiOkZ\nOfkW7SbhaUdo8+QvPMMVl8v9dQx3XHS5b05YcUMSXNdsr/Abr7oM/m5xyKBU\nsMz4gPGfnNRHQtJ35y1MWkl8+2yWw3X9tRLl2POWa/ieCd0yqFmZxV6lO4lr\nsieXtnELMtj6oSMjWWCvvyMm2ypvyFY/JOCvX2Eg2BRH2JE2gt/48m3U3bgC\n9350BBqGNf1hBsiOp7r0lKCW5LBEA99XDPWibgNB46c8C20mbwuxMcRoqiau\nbDuXXMOR8lGvMXn3iEP9zFhLs31LsihxhW7vyLrejcP9jdjL1C25e0x10/++\nyseEu6wqZIJnR1TWzyFG7WPssAchpyIaKid6CMu2bv+6rE3NJLqYQGCYCjdM\nqg3LIbzRuHmdhu2drhV2bQQwJaL9SOE9Osp0S0mhqgDfkC29i03Vawe8Zpq8\n4LQrKJhdpMkyXJadF5JNfQtr8WCqtP+VrRWJGQqLmsqqFPqRIRev+yxuIo61\n8hst1k/oY3F3RIaCmAxLXNNclj+tR3JdZZcD38mRuvgsLwFaw4SMo9xuvQX/\nEh8ra0IX+RnIzTNmOn7A5LmyyhlzAvtiiqKZNgetPvGhsCr6ymqDtsOrgrZR\nNLoC3wmYeVFEo2LD3En6mDYATh+bQ2kEgTSGp0uhEyMk0FyuObf+fCU5jH9s\nw9XE\r\n=I8IM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCj1oU7LK1WqibgqGg53nUxVYAViZICnCMZ6obhaeBLewIhAPYY07lM/VOkMGkgCQgwLCbLhbF9E+TfhHuJhI7EkRxo"}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.0.0-alpha.5_1615680773920_0.8252759685287501"},"_hasShrinkwrap":false},"3.0.0-next.0":{"name":"@skypilot/sugarbowl","version":"3.0.0-next.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.1.8","@skypilot/toolchain":"^5.2.1"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `deleteFile`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.0.0-next.0","dist":{"shasum":"03d167a2cdfdbfa2614895a680f0686979920aed","integrity":"sha512-JGT2h8m6+oKCI9lIPEuuK59wLjir1LdfiGAZJHVuSedPbhhvOWAurzBZXZE2NTwGes36QrQ9pwh2saW3YknNsA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.0.0-next.0.tgz","fileCount":170,"unpackedSize":99676,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgTVYwCRA9TVsSAnZWagAAUAwP/2HwdZ3q+M2fiCnA/35n\neaAYEHt/b6soTi9+46NZ2pkrZDWqE6MkzuHcoa+rgntBbWst50HhhhoIPBjb\nnMVcwwGYuvFCn+O/LKUmRIRNpMSuGKztfxcbYSzMWWqPI/H+qC60Pxn5IG3E\n615r0Dbd5iXcCY1/XOzBu2h9gPqNRWiEMDQEthtwLZv+6XV5/oCwkqTdETxk\nVAoOSt7rCnGg3oI0MmW+ctx+o2Gt0Z1OBKdq43dAgFJ16iOz9eDA9mR9KjEu\ncOX1o8qvG0m35I5a9AI46HVhBv/eubY92kDIsfZTEsIG2RaQo7SIxSEwgG9a\njzFYTjWKE5dUyLT08618vZpZvIXyr0JRAWB2ob/fhgYDfhtNQcAZK8OFuQxE\ngdrG3Fn21cJxEVSGzXnnxPp8CHb8aWNthk2YYZjyr3crOOCpSk7maO/upEaV\nsAP3+upvaCM2+fR0A7gDt4P0J3hKdSmueFKkqGT1NHcakedhf0+4b90YutpT\nR0YgCnt5IQ8hu7D9dMdrVL4bPU7feEu60AMqv51b/t9GkQ8P5TYAfxT0VYMV\n6UpdVzSIbYmKKyKxvWNhY0CMfUX7/JV45idhrtq63hIRB3rCZ5WKk5K+JvmD\n+I4EWMjrKxH8oqG9c8i5fF3CwVKh8B6pGDLWtXljiy36aE+IGmxdbqY5EaOE\nZSTa\r\n=IwNv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCSOfDSEoNf0a4d1x+f/YwcXD/fK2DxkUUQa9ktwviMIwIgS9MqV1KV+BbIeDjPkEtMwBY049GQz1mmm07SZJ/FHl0="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.0.0-next.0_1615681071930_0.14680039843041492"},"_hasShrinkwrap":false},"3.0.0":{"name":"@skypilot/sugarbowl","version":"3.0.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.1.8","@skypilot/toolchain":"^5.2.1"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.0.0","dist":{"shasum":"4a40f0cb7332d4ab19e785db0e09d2efdd57c922","integrity":"sha512-R5AYzmNl/ks7YhkZvdTggUy4lEnIZuHvC3UccFeKcGMLmCuRHb2RaJTtcg7VqxwcGBbfoHbM1tvttKbHJF9t2A==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.0.0.tgz","fileCount":170,"unpackedSize":100521,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgTVeBCRA9TVsSAnZWagAAlX0P/RlbIwwWqfeIJzrcmgRZ\nogDi92/6w7bo3vIIX62/TPK2qo+8N8/KKHmGXPepWUY1jsvkrgTP0FMevQih\nVwuzNEjCJ886sAtKylzq7Folf9muRyAeg62i08ZXEQe5KXUAI5cgdqnaHpON\nsb4XaygHX0lFy0vfcNtOE3aborc1htUfds4YDRbUYYDL48Ad2sk3TcOmpNro\nCbp27shzQPl1RLTiveWxjD0JFn+8EjZsiGuDOCzzPDvY3bA+dQitmfWRhpBn\nqcEjrc9FwL1kcLER/sxsbGSaX3P+N+d8TZKdDfQWAEuM52/BpS7oxMdnTkX4\nNVmEzdW7tEE798pum55rE4cbkROtan1xmv+KCObbUzFgPanqR1EIC9lRSRFJ\niTC6xASOqSGaB3ps/etSB1lxifcNRD0T1KjxaoJy48f8gDboqAKS+saTX4KF\nYSKTnFYJaKv0l38ZSo5jI/uFPUHpiD7G1ZtzLbDu4tiJ98/7ROc+CEEAQeey\nXNVlU5J6ejvOvZcGoNeeo3xyF8Ce7yHUImaEXnMDBZ6b+80OCNUhQldgrhOM\nLuaW1Fn0sUAi47W7/2u4ix/xa23PwUH5+0wkOjXnE7hd5WepFP5jD8jqPYR4\n+LISblC52ugWjysC55WM+t0P50/xbROsgy+y24bS6NmGaIJHPCzKMklXNNT6\nrAMr\r\n=amac\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFER2YTf66KWdk79TItH29ia46ANyWp26V/rMrbbpHRyAiEAqS9SGoBmb2dYwk+ZuIarHgtbjfXKwDGs6KvMucEJ4PA="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.0.0_1615681408835_0.41167756815417933"},"_hasShrinkwrap":false},"3.1.0-next.0":{"name":"@skypilot/sugarbowl","version":"3.1.0-next.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.2.1","@skypilot/toolchain":"^5.2.1"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `deleteFile`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.1.0-next.0","dist":{"shasum":"b838639bfcd732098f9ec208cfc52f6cb7b3fc02","integrity":"sha512-m4mW7RopuHVZeDlmwLXDampx4qupOREMxusAtT6HW/ilYSDpCXPxUJjI6SExhdy+7Y87UbJTlYBrCcUBxvuYcA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.1.0-next.0.tgz","fileCount":172,"unpackedSize":101279,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgUQg/CRA9TVsSAnZWagAAZd4P/12rMhbXxNjMqqR8jQ4k\nHkO4sB4kDs+OZIRcVT27LcuUdiwyz1HAUQbnLJsptqClIhSwhSILfoCOUGdp\nN95hPHno2vv4pLvdmKe5jt0dfE5RnVfbKtKG6QndVxPwczTjw6sqXPi6UK5t\nFxjtCEsvL+BXvjSmV7Zv0CvTGPdIiZG9uFHc0NSQjq638PMQc9Uui1r4x5YI\nSlxawn/Q+CR4DAkaxPR6SDRUFYZ2N7iARfxN1jlYkhwn7yTiZNnSNXU3n+6B\nd/nyvXDqPukIU0uuvEpLbLHnFDDMNEBUshn+LeyVH7X9Cl3FFWxtDeVPxoX3\nrlO+Z2pVIx6BAmOw+oYljWyk/ft07TwZhZ8kMqtUeGOm+gPQnBPH9IBzmqlF\nwChK0C0g4tVLez5dSuz4DJpX2qaFNrxrPmAYbpetm3pBMkbcC5468R/1ZV7q\nYduvaRtuc5kwtV9WAZstHICrpCGZGocQPeF8Lc7cKfT0aCICOSjjmIwaVS7A\nEmESv1VKU7QjqqIla7+5OHYweNkPVbTXQRwVO4VXSFIZmtPDU1pMEZSHD2uS\nvtfwzpw5izvnolGLXWryqxd6dYfzWYigYvgFe07Nwem0Nsb++SLnt5u/Wom8\noFnetgWrLv6A8LnIO0oZNPboSc4tPKMR5VmVBSfoOvBolxEYNKCPzSjuq74b\nV/UZ\r\n=qCR7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDx+HniIBADsB7TmDmyH+cmnd34GVIqh9wALlgZKS5uQAiEAowKHv6nE6evP1KKgpC6UkV2kHoUkX6scEKsUDOs4qRI="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.1.0-next.0_1615923262818_0.6773204581745567"},"_hasShrinkwrap":false},"3.1.0":{"name":"@skypilot/sugarbowl","version":"3.1.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.2.1","@skypilot/toolchain":"^5.2.1"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.1.0","dist":{"shasum":"3babb10e51504712d6112cbda2c7f194ba51bd68","integrity":"sha512-bxdgPu0b6hvNE788QxgT3+o0FNsoY5D/WSueNuP437s1dnOY+5DZ7nmk1FMrp74rp5f5iZVtF+WfKzQZnlTkcw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.1.0.tgz","fileCount":172,"unpackedSize":101549,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgUQn8CRA9TVsSAnZWagAAPEEQAJwZPnmDOohmUVD8Xotj\nj6ijXMwjzqAq2XQx30zcIZTELV+iQ4lIDOmQGmL8Ks1nDaS9SCYx+/nCLRU5\nS7r5xncZnQ1h72SHBub0diW08U1jwU8OScKILADuqYqCpaFuepCiODAxm73N\nMWetf/pVKgX+QiAoF6k3vRu+Zu+9hdXB99VIw3QyBjDAhtX1WTElM8q31KUp\nKt/Xj5uLUPtKzOr6WSF2rTzJi/SwQa96pCrSqZW4TluIhqch6uX5GkSuYx5w\n0HukH95ON9vGgfE8CN7yJOCMLbAV2r5YJ5r0YZmqqYZxjHSxcMiOGuk0OEQE\nJJEAo0vyr4N3U0ReoHmJbERmLimj6XwOvZqewR+onilb1e23TY+ClTLXuGiU\ns++Q/QTNhymFvy4SA5/3YIIooim8xhoSNl560tiGFCCh9Fb/CzU+/J7+BoI6\nguynQmA1J22KQwUajlR7ZeeK1roqOkaT2fotDWLsyQ98mwY4rQoIN2Qe+3yW\nQi+c691E5ujnObr+pyUAG2LjMP3XqLGYv2ouncaEFRNn+ZMKK99xwB9gTWEA\nZI5ozfU//pOGz8kXLUUCfNGSPEfQGZdnzY9DQ6Y5/gxZ3LurKFWXLdp1noGD\n5EJToU8odqRVyUyctIdxbc1xwMqV1/urEFStMnDqBN8kiEZcvJVOy3uBbBmb\naDVR\r\n=8nY2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCKtoErsju5zGlJSTBtWKsNaukFOwLlmGKJJ14fNlavoQIgErOTQNr39EPGs1PCPLWW2xGeLBrmlrvAySukvTVah5o="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.1.0_1615923707735_0.09535708380860775"},"_hasShrinkwrap":false},"3.2.0-next.0":{"name":"@skypilot/sugarbowl","version":"3.2.0-next.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.2.1","@skypilot/toolchain":"^5.2.2"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `deleteFile`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.2.0-next.0","dist":{"shasum":"8aed8844ba5ce59c5354b3c85869b9577b89a0d0","integrity":"sha512-An/x7r/oyGdJ+OX7ke2fvsHSCfigvfvN+BILuhNp1Vn+XLHdXwwyfkeyI1ADxuOwoMczR3YSh7Uyu7sM3eNK7Q==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.2.0-next.0.tgz","fileCount":174,"unpackedSize":102504,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgV9/5CRA9TVsSAnZWagAAtO4P/3nPjod5dq5qNjltN64v\nQBr/N97sIFfgVj8SBkc74OpgDVoo+e/cxnzKj9MpQl351qb2zGkBbcC8ftKk\n52SLNUP5m1qslUVHrz0R38isyhpR7VqAcW/LsBm+w4Hw0SaV8GyG0SwumyCl\nKKdFSLHPk1VcUx1XT4NVTQFDWGfAPLArN0tJSaPjuUS3rNTjSqHMBQqCN9kW\nJ/cNhxOVcL8CfyY+Pci9hyQ9v0LnxLGLAwPNa493oSrVWwxEO1C5cWmex9WP\ncVajHlUrAeZyW4F2ivc1VSFFFXCv+N5g2HeMuAuOYp5xWkiKnS0li37RjxH+\nfSsU0O/5wbtq2VaT5exKF7V2F/Tc+Ji68WGvoZC8mXULzPGvxG+fwdMzaDAa\nNUZPqF2uOYpLCljkqdgtqSsYLXxOMnzsOucEnVzXI+d6mvKTWno8WY1X406k\nJlZTL/O3QA2QepLQ0liIQQ91f3Cy1o7+xj4HNvQgk98Qa+AMTzEFl6FsQmj1\nyVmAUhkvx+tupQrWWeL3t9EsqHUq6KH0b+LTK9hmXShHpw+rz4qPZdhHoCIk\nuVoredwS+8gbDx7B3FhrHo8oXxxaiVev1TbjLiZokI8x8Jsl3/7dCHEOK4TH\nATWw1rnBAcl+K5TNtVskX/BcgGSvXDAtqWRr2Pyuh4Rc7hYGoclOwAX8IQCJ\nstKN\r\n=vFm+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCy6uNZDGKRw/c1+TNkLrJ0+JOXlEtDVhSQVWwWG7sMmgIhAPOaAZ99EZ/dBQD/i3FLBzXKFP5lztBF7cuXQlWb5WXN"}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.2.0-next.0_1616371705051_0.7136940591220768"},"_hasShrinkwrap":false},"3.2.0":{"name":"@skypilot/sugarbowl","version":"3.2.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.2.1","@skypilot/toolchain":"^5.2.2"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.2.0","dist":{"shasum":"79c2988d7938adb5e6e6c9ad7394b0ca5efb19f0","integrity":"sha512-lSZWxuXUhfnlU/G5UDT73jrty62SECA7aKPCZAurJHsIWBweCT6FhwyOaWGudjIrRPumxr7c880ue+XXcUTTiQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.2.0.tgz","fileCount":174,"unpackedSize":102923,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgV+XUCRA9TVsSAnZWagAAbqsP/2DuHwXhnWjTz4QJwGj4\neZHgWz3Ju/JTdq89hQZQnJilw8+P3920j4t/fFJ/sfiLC6ikFasOR04hjszV\nDK32afaivl4ag12tGAmxdrrfNlqQtBKpX4hZop0wkZ+qUdXA7gNyumQOXucq\n7FXUynvLFjp5Fy+X4iAiItjNr9FLKAFu0RNJBtzjKih/s19iEUePHbaLMHKT\nJXvOrfSYxkulkNPkxTdbX0HGPtpDB8dd5F5uKm57c2ePhgSMn6kEWOenKgqO\nCjZwRmYrtUOQsdycXcYf00Di+RmzejrRuRwFPVz0SibJfP5R86ymUceAU27F\nu+z5LIi4drrQ2EXWQivw+GfSvz3ZWTQocbP78+HvXzJ9Yz8VHSoHryt9bIjj\n5fafeirCix6E1wH8zlaMF9Fa+EzJKN/3UFuSRUGon/6kiC/9J/rhVe5/vsUk\nZsOMDNiDhijqrWh1o8inB7yXSnBNNgIWKF41em5R8xkJLEyKh5PuwXb+nPTw\nw6G1gAgHGHMuTHRuHT2T8Ey1bw7tRAo6vW4pDpySSnSBtw9auUeyiHGJrGAG\n2+XH/wX6M0+X0jlX7pxBp//CRf19S4MMeyhA3o/i6GuqA3arMIIzza6Pm5eX\nFUdxMdzJSB6GODekw2UPk7UFzSNEiJcZIoNUDlYtrcH+JAllVhvY/N+I7lSX\nwHbJ\r\n=oJ2U\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC3X+JvuNr1OZdVWE5fQwAPC27xo1Ps7KZixv6ggM8KIQIhANsfoze6MuHbycUqRKjOZ+oynQAerHL7PD34V3iPQrVu"}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.2.0_1616373203454_0.1010341861224533"},"_hasShrinkwrap":false},"3.3.0-next.0":{"name":"@skypilot/sugarbowl","version":"3.3.0-next.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.2.1","@skypilot/toolchain":"^5.2.2"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `deleteFile`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.3.0-next.0","dist":{"shasum":"1fbae359962f1ea28467a113c2680d083efc8541","integrity":"sha512-pXtmy6u9z5TVJdyKAAjAU2VS8RzFCJy9Wxu3OLbdmlxS1I89lmahgh9taw//pjogPWsFo6tS0vm3e5KLluKDLQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.3.0-next.0.tgz","fileCount":174,"unpackedSize":102958,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgWtTBCRA9TVsSAnZWagAAYZ4P/2o9cT0xNz0ueCQD5nLX\nq1IB1NOODVEk4Cey7Swk6/TpvIkTKUb1r5bqNAYPAyPDOlg/2PIPSjejSbiZ\nnFnhPVk0Lla0NrWSY6MEoA/cTw52l+hRSfZNO2I0Hhjnx0YcgGjPfEJFy8po\nruyrLHHWwUsHtJrtrQJvla0nBkR8Ijx5By8JrgXCJAnZ9+JR9W6Gq58XbthA\nQzroh04+fZC/RVPmSozt9/o6+GPQExie6qS4x6je9EBBSwK1dNdJML/L9Kn8\n9luiBJl6M7uFPv4HqSz7enXwLIY/Gyc67zzUd56BtL0sNOFlLfcM7C2lc8gw\n7I3kkSy5ajk8RWxJSz5/dkVrWVEt4yDqKkj6juafvnFe/DlhVXtGJTXvOwdl\nutl+d9Brke3aUQrngPQKcHgvz6HqAH0V0Fl/MhBBWIxQAvLphIEso3jO6M1Y\nRTLpJ/GOEjlXTIbtnyx52uzPXMNOtRs+mhb5a6EG/bzPdOzAZw60NkyBzn3q\nRMIur2rdPQUWXju1SMCxSYd6ol8Jri/5zTKdJsN6psgBQYSvUOwUPzxxIeog\nHqlyzheYwDa/Fat5RQ3l4WET5PDZzoI5MNPYtVaBnZU/0xhPzBQ85/ZsxQPm\nmfKa4i3GqLla1bXnUN1C8fTnkkmVZCnKPYIAqUC+XBc0d0HooahehPufe8YD\nglFz\r\n=3J+F\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAW9ZrYlSNsj3FQLsbWvNhtCnEaymCY3a7zgDD67PSZlAiEA3mDixzL7UvLS/njiF0XNkxFzaJ3kB4R2n2dfqzlYC4I="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.3.0-next.0_1616565440938_0.36642151077367524"},"_hasShrinkwrap":false},"3.3.0-next.1":{"name":"@skypilot/sugarbowl","version":"3.3.0-next.1","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.2.1","@skypilot/toolchain":"^5.2.2"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `deleteFile`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Classes\n\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.3.0-next.1","dist":{"shasum":"12d54cd5b6f8c9ec4f0ad04a3ab9320475c2df24","integrity":"sha512-TscWtoIR34N+PGbKPC8RF0g7TppScwMytqSnOfdwr+aJQO4doF/jh9IDNF15YH/xLh7DgjstXx1hFzplqwmGaQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.3.0-next.1.tgz","fileCount":179,"unpackedSize":107515,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgXkhzCRA9TVsSAnZWagAAZkAQAIKQShskvKe0tNxGVKGg\nMBuHM/ICe1qXRKWruRTk9Ec3vFDHAtu081tmKXph9FxKUG/F17tt/8Duy/vg\nFeaI0FNuXykhCQY9hTSBBLi+X7sVzG8MdA0GsO7dHmChuwz5MQWAn1Mhi52n\nNU2EL97wzaJM54llgsTAMWcaviHUJEITt2ze0aN6oN2rOZvmTFgUnr6yqcuB\nPW+REFeD3ZrrimRzCjP8Qu2krefANdzJiTHlPWzd2/uILTugZHmqlFGZH7tr\nLbg98fOSFLijWu0mLb5dh4jlwag/xh4PFUxKaOxx6WIGDMJPlrPworz0HoPW\nAGDyXgL0Xq9XB0Hw+QLC6046qe9zQJ5HMVWh7Ue9SghFvZFYsuQqIHBWys0W\nM8KRFaE6vEP5IA/C5kfhp8JPa9896psqgjiufXQNCU8p1+CDhTiJSVt50hi6\n6qpOismeqGfYtdZ3/eyXe67ZLhIbJvtqiLm7kckY+qF5bWJ4urp+F0Kxx5HX\niNLZlbvyFm8T0uCXitbAlOqefFq0VOD5IIEjMKcj9DlA1h/sqtwwYVnqtbVH\natM8WHXBS+9mRSlZu+JViJOV/8bRbyEywwawrp3qVNKyEr3aieXonjqhdwpo\n3csz06OvO0IaqBhMHSWqeSg7OSySzx5mQJw+zpVWRj105XvN/zeukMa2qbHM\n8kWm\r\n=wjQS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEoYm8oBWWx2AbWOmj4/CfnkVuRq9u8Nq1Qvx+PEP+WCAiEAqriXEnk5Ukm845MpFJO3ULKic5BeOOVJA6A+4FJzPc4="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.3.0-next.1_1616791666644_0.08425499547465609"},"_hasShrinkwrap":false},"3.3.0-next.2":{"name":"@skypilot/sugarbowl","version":"3.3.0-next.2","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.2.1","@skypilot/toolchain":"^5.2.2"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `deleteFile`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitEmptyArrays(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Classes\n\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.3.0-next.2","dist":{"shasum":"0963c95c671a1eec2e48e17bab798f8dc479c0e7","integrity":"sha512-JwEEZWHNmWmf1eUt0RxB3RmRk8mFcnSJrNXLCkHuhb531ZYBm3e6Jau4aLpQGO+kVYzlDYjEuzVJt65MEbLGnw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.3.0-next.2.tgz","fileCount":181,"unpackedSize":109438,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgXku/CRA9TVsSAnZWagAAkwcP/1m41jKIJTPbQz1sOttx\nviZwhHjmsX0RoUD421px/NtkF2WUmnGyJwou3ZhmRu1X8SWPEtEJrdMnDg+q\nGyHrVsm+HfOPX97pjBD9By8pxVkC0VW3tsQ/Mbkz1D4RO7p3UT6WljXwXY8n\ngT7c3oaZfH9/IwMLI9UHEYnHr/dfsufbvjUcYo88CPEn47zaUAlgqYTNAMPS\nGuah/cF88MKn1TIpQLGAFKjXJL1el6LfT7C7kyUkZLEyG6OklxdWYb9asbLV\n0+FdWvGmaxTqYkP37d8C3T00E7g3CPV+0Ggu/Nv8eNekjL4fg1fCMWMfKEhl\n0Z/RYR0zKReE0zI8FqqCYI6zex1rzAQEdb5zoB6wI/Bgn2co3dDAIWTEjQo0\nDJW5pSBNy5oGL7gErlhgxL+QBzt/l1AMCyTrUDdOAoyh6VlJ4/fX9FP+1bz+\nn60pRJoK926+DF+xzRsrSpNs36wj1xKGaVrR8KK4FYoEnvn1LVXbp6AZ6b4L\nx7t/S02CrJpUrh4CYRziLPAOwK34FJWsRPt659apbDwCCwvfg+iY8f5cuqb8\nHLHF38loN70iCJDgvhriAIm3a9ja0nmUUzxVHqwVJhcqr1OZhtr9fJyy1rHg\n7wjtVfunRFHQLe2P4ZXltBfLQW3HntaamJWIWS/3MFXjXqeJZzr2knthlGco\nMVRp\r\n=eX/6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFVqbsXael8KbelPlZ9pwyxAtnuK2BHxfUbqkAxNrfn2AiEAtKnWTkqOUIWh4NvO6eTeiH12CmTMEW0MdqhxyVFxacY="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.3.0-next.2_1616792511197_0.644866979074822"},"_hasShrinkwrap":false},"3.3.0-next.3":{"name":"@skypilot/sugarbowl","version":"3.3.0-next.3","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.2.1","@skypilot/toolchain":"^5.2.2"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `deleteFile`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitEmptyArrays(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Classes\n\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.3.0-next.3","dist":{"shasum":"847bc7431cbc21ba72813a638ee3ad069fcd38a5","integrity":"sha512-gpgEdl8rJTcjPUhBdmMY9lFdc68eJzP/qT7/cdVMjX91ic1ga5rrUoZqLrcvFHVTI0kGbgPKshFzg+wK2/ixxw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.3.0-next.3.tgz","fileCount":181,"unpackedSize":109802,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgXlUBCRA9TVsSAnZWagAAPDkQAJQ1F3mReeLCW8/IdKQb\nSMXDmWW/nYAIPMxkAYmx7E2FQjJ2Z9+zcYhdwkQpxPqRQboGbPmS8m/6dfWg\nckkKoNX+udm7mIcY9x/y4uP4kCz6uKKhCp2ngMXMub+v33I7dcE7f9ZUbQHN\nkFZ+KApUIM0G21BgIawAxb4kTtmPv7ZkHbgocZMKbSPYyyO7EMH5ZscF7Ma4\nNCrnBH+pSub6wnq+fibPgVympMmGRqcdRbnB6wiS2SVyLYcEuICJdUSyZ0xu\nibBgLtIjgcNb4WojeGbC/6QouHIenywMAYi7KqON7Ns12E4m04vRUujjF5I6\n6O/9dbvtgnyghw/c51dp6Jdzz/nPSLWUtfG1w5ILucWZo+6DeBxa9x+1jJ6O\nfnxZMiyATiAj09nWD8hfP6nqdcb5gLdRFNLJLQw7MTfyY/BKzxDu9eRtwoYh\nSoxwt81AJitfOMxvUfdCKupcgruhxYxJu5JNYKf+5Lq6U3lYhMrwPBAK+MLt\npPTeyLZHEIyGjgvROT6EUJDDmh9iS9oBQPKXkXOY98P1kFZmsjU8Pwax2dsw\nEoMrigyiVXaxGd286tUaUcpH4Ypf+QabAQuy/Fr0QpRabB7Gx1s2r7u+3GxL\nt2ZzjITuCjXONtFbnvfrpi/Ti5CKLV85JB9EIx65n5LYXcnKQeCcfz5AGMzf\nL0mg\r\n=r4bk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDPjA2ByoEWQ5f6/XQhcbXhNTA9fDI8T2E2AIwH4cW73QIgYKGiu7w7GELjRyVMgMXiDxJ+lPiFnVJ4ErV2HBPTd84="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.3.0-next.3_1616794880444_0.7717939995325449"},"_hasShrinkwrap":false},"3.3.0-next.4":{"name":"@skypilot/sugarbowl","version":"3.3.0-next.4","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.2.1","@skypilot/toolchain":"^5.2.2"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `deleteFile`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitEmptyArrays(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Classes\n\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.3.0-next.4","dist":{"shasum":"f30fc087c878650939d4c2edc06ffc9d2a839fa7","integrity":"sha512-8oD8n0n/jXDOJooW7mKF79US6+OOaRuOCCU7YLuGXnAU2h5P+xh/6uRko5z7CsL5nM8S7SDbWBfurTiDgR2sWw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.3.0-next.4.tgz","fileCount":188,"unpackedSize":111156,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgXloYCRA9TVsSAnZWagAAHQcQAKD1tz2fCbeQgNI9bmKw\nkVbul6r1RNrt+Yr+1ndZoz2PGuudIR1wzDOy4xOIkOvUG7FYlYlzyscAvKkk\n7bauU8tLpFDfFkO7rO2ZYBlPzxurjI0t4W3H9rIi5dgioFmqPcEIQaKcw4Z3\nbdMK5Yyma5VYQwMgYhIwzncEuWnP8cEU0JcvztimlH269JKPHqOVM5+fEf4z\n5Kew2C1qeOnZEIFG4gL2NL6FXcUEDuWUzzC5mg+RIPupEkLj2NP68e3aO5mD\n5+h6Gnzza7nOci9gEwuOmN1jX0P3vV+3E1KO1T6/OlPrr8X47JE3LyL3E2+1\nQA0K853yD0O6FdzyRtap2+UTq4Pty3MjrVuKYBc7gFC+D8u2xMCo5ShOMIc8\n9M5qNtlDl7yOhITbB3tNx7k7vm209HCU4adE1FnYgSYh4qyrhaWzQ1qfognM\nRGnzftj/OJFG/n5OeP8BhBJuf/XRsDbuoNe6gvvBZnMBfmrRv/RR09mRYlBE\n5lGWHIjOCpLQ5Y3IZOyrUarqk1V2QgaKzKi5EgYBawCWGkcGsBcOFpcrHuBs\nNayrJppZnDEOXgocGpvsfnrp+jvEA3oupQFJsH0m0PTyWLfZD0lgPlCsdXw7\nG1ZnFhoCZ97L12qyJZtN0ycPD0devEKrks7Kcxln7E0Bsc3w1CySdheHuDWG\ndQDR\r\n=jcMl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA2J9dvpI5cRJHKpqt/0dvrjfgCjTRzAEwV0Pj2fLLPnAiBy6qDQdLWZOS2iAkYeYYBXEgcMg6+4+jZ1g6Ls5/unCA=="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.3.0-next.4_1616796184119_0.9618061209056503"},"_hasShrinkwrap":false},"3.3.0-next.5":{"name":"@skypilot/sugarbowl","version":"3.3.0-next.5","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.2.1","@skypilot/toolchain":"^5.2.2"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `deleteFile`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Indefinite-value functions\n\n-   `isIndefinite(value: unknown): boolean`\n-   `isNull(value: unknown): value is null`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitEmptyArrays(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Classes\n\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.3.0-next.5","dist":{"shasum":"9c22aba0f8b4cc958fc99e76ec4a523003f9b9f5","integrity":"sha512-LizOtphIATTyqrOiOeEMV136NbE3nbc9LYJe/wKzNfPr6KFIvI7qJQaEB17Xb7I5aMaZ9G/sp3mZI/o/pSk3nQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.3.0-next.5.tgz","fileCount":190,"unpackedSize":112050,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgXl51CRA9TVsSAnZWagAAqD0P/RjJAjsubdOVNS9+CSXk\namo5Y2Q6FfT+EFRjgCTVbkPSD2/oHRaxpe8dQd7FUw4c/A9OsXVP8Yl10cu2\nE5lk8qLcr2NjI47sn1JXVi8Ymso0phft7JWQroU3vxPX4d/iMS4P2PKzDhWj\nqBog8DGaEGa+k89IqTZXZEswtwBbRMzT0fTBSmDZpseUjNC68kBM9wSdCuAk\nVGxgnrIEdT6ZHiOTd4Ou4unIutuRyTxcPWCDxEa0d/pWrrdvHYIfxi08Oo1x\nOPvca9zurzi0+grQObKvNKffLKGA7OMRTbIqqWjVwL4Swa305GeRNQl1MEx9\nQ5J8L9nrKo6TxvsAMWvYI0xMnrmFeIyXAtVXp3hkyAjDbYtLUZ84/HQUlCGH\nTnrLqBYPWKP/Vujv7IxyIgacEazoSkEvaXn/3nkm7N4GVNApr/3AyJNq0epI\n8YVAG9Iqg9+V8xV1zOR+qH/K43vElgh1QNV/PQRkSY2fjt15jziVqnOxY0DB\nGav7Z2fpRgkjf640cEuwmaxXYZoOWZa+ZrzvKtjrNOn053tdWXoTmi2VKytD\npjYfhDH2vwSS4ZehHjp+KX9uTsIZazG0B0RmVLUcv3G7VZHWkQEvbGZQtzTH\nw9ru6fO07xJSGjyr3vcjZWhB4mJbLu7ejYTx+anGq6y4osNjP2lOWaNkCr1e\nQbhw\r\n=TQH8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEHosGkz1ZC53Q0kdTeCuY64+tHB1f8ZqJejcTRqFa+vAiAYEcuQUFWWnqvTH/oxpVgR5EhJnmw0K0IYd48TK0Rudw=="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.3.0-next.5_1616797301171_0.14745756221388095"},"_hasShrinkwrap":false},"3.3.0":{"name":"@skypilot/sugarbowl","version":"3.3.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.2.1","@skypilot/toolchain":"^5.2.2"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.3.0","dist":{"shasum":"e0c9840915cb3c4a0575c88b1b01a2522308e8fa","integrity":"sha512-8StQutrqxyG8SQWpu9rRu/jOSgRA8lBst6WbAyR/iZbO7pU9ete1bpWcvWKwB5Y8JibLDN7tB4KrKroKZ4fYyg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.3.0.tgz","fileCount":190,"unpackedSize":113117,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgXmQBCRA9TVsSAnZWagAABjcP+QCB49wBHSjJao11LNYT\nn6aMzVNR2JLOsGI2/VtbdfK9OA0uZJE9y4TDi8kA50+0wVYTfsywVSwnk+ws\n+77UjUiio3J+2iFLkMK7bXu3ZERi1T+CxumughZBCYJk+cUTwQ+38Ub5xQAr\nVbfevHYDlWtbFiF7Jo5gHWNUkdYS2xcJK6lSzdqDK2fTC4q/GaZcWUTWPlmc\nWCaE/kSPGV3xh1TTA5SiWgAAY2qQE3exMUfB+OsgX0CXz8nYtgUTFZ/8GhVw\nxFAn71kKUSlVUsBpic9/q9XMMuSCBewCA8djrAoRmCGOaHihFUSe3lUh5g6q\ngcFeHdVzHtrvKOgfkPQI6XShnidJcK2BddsTpoh2APSURNxpE5lVTUodhgmE\noXFD8AF6je7KhunfxkRMrm5nzr+Idsxzc8qKwejr9xu5a8HrC7jx0v8v3jLG\nwN5MRGu9fssnNr6uSC2/HmOmI0Ee33ik93w9VFjB6y/2bET8/+mCSgaPmS/I\niWYJ+I7QobWL3S+3srsdOtKjzmoyw51Gqn2xQ3kozn9w3WZtZoQNgQhyM3ot\ne5xZJeaTYtye4oxbNSLTcPefwtIJTjV9OYkbR4iTyRSkJjdegD11HSb4xIBN\nGdKijcWr0d3HZOfb/BxasljkGfKhNDGJ4psbRU5uFKnF8MEOQQncZkgprASp\n0/ff\r\n=yIXu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICG+lR7XEeVW0bSLCzPiZ/O6NoTUrjOfGlCc6+IwSsnqAiEA5gp4hyVHon5EYwEaDIugRD97bRWI2v7Ukm6w9gP7qc4="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.3.0_1616798720915_0.3261405402998776"},"_hasShrinkwrap":false},"3.3.1-next.0":{"name":"@skypilot/sugarbowl","version":"3.3.1-next.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.2.1","@skypilot/toolchain":"^5.2.2"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `deleteFile`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Indefinite-value functions\n\n-   `isIndefinite(value: unknown): boolean`\n-   `isNull(value: unknown): value is null`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitEmptyArrays(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Classes\n\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.3.1-next.0","dist":{"shasum":"a73da11baded7b2c0ab7430f3e5e7b44656d9a45","integrity":"sha512-EQCgmLbgDVrLxxHJ7vIBqJlEpMgM4O/VBEIg2/a0d/eBKXBRSoGiXXyq+tHK2O0+vrddfpyts3xIPZXmL3xIrg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.3.1-next.0.tgz","fileCount":190,"unpackedSize":113340,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgYQkeCRA9TVsSAnZWagAAysEP/0sMCwfLMFf/vCE/NgXX\nS5MkCDNRsbC3hcKzMVqiUYODjvVKsVmFVRI07OHJ5rSnqxIoH8X0EBhdjU2w\nPLVP/sGNUp7FrwFEbYl33kkqk+y1gBIIXIROVd4cJ+Q/yjgD/7VI9ShwK3ps\nXdCKY2YSfuaEQHbgyGzYixuWH6bNHlu3iBXziKqP+zfGJ2g7pdaOO8HrSKqO\nhfy+um8TshWbz+fGUbNMSs+8aS2sPRJ97gQIYbZayu/GOUyXwgZv94RqdqWe\ncGU4eNRRMaC6A0lF5TiVRWDFlqklWszy5xXbh7w9Yj00gJaeYlPDLryk5Puj\nfCHpi0lhsrpVbIPHB6Cl9n0DScfWP5Q29Z4LjhSnI1d3ClQFuDwOC2DUMIHA\nYFAVDBz6GnGxamWtOlL+FBLu67s5IB/zGkS6LfNnJve8qCzTpb/CBiMj4LYa\nfB/wVumV+I0zLxfZfm9wCAftQlDjENqrakOBn20pUMetiVoltFLhS4ykEmm8\n09f+tuVsmtr5q/Fl9eA0TSL6OuqMR/FaEm/RUFd6WulqqwaGnyxha/tXjg5z\njOrfCWOqxPd8djDquuUtmsY/XzW4tl9KTe5jZXJ860hzYZOTshm9PJuI/00/\nF9jx3ziXPbsYZfdD2EXDGZh7Fe0oVz9B/nG+Ic6tSWr+l46r9bRNSbAiGKWu\nDnD+\r\n=AtUI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCwpUhVf7MqxXlhcw6JVX9+T6Y+8viO+WvcLb7BuhU1CgIhAJ6IfhXRVacdeKIaqJsBvEdGmDQ2+ljrDJyPAFS2WcRA"}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.3.1-next.0_1616972062027_0.7332104622779565"},"_hasShrinkwrap":false},"3.4.0-next.0":{"name":"@skypilot/sugarbowl","version":"3.4.0-next.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.2.1","@skypilot/toolchain":"^5.2.2"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `deleteFile`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Indefinite-value functions\n\n-   `isIndefinite(value: unknown): boolean`\n-   `isNull(value: unknown): value is null`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitEmptyArrays(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Classes\n\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.4.0-next.0","dist":{"shasum":"2bc87dfe724616e6e2dc4e04325af2ff18b85b0c","integrity":"sha512-gwTx9qFoi0uiB5hNEZdmk6UW8lbNe50QdEFs3b2d52PLJ2nUswH4hiQxSE882BzrDkX5IKum5Ua+J28pG82Yjw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.4.0-next.0.tgz","fileCount":192,"unpackedSize":113770,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgYRsBCRA9TVsSAnZWagAAh8oP/2mNkx2RFr23+FlveAAN\nn6bKbwgtMSXE8rMkAOR8sVM5MfkxGV2RDHXVtmBdmCW1E7+VLQJdsKGoNN1d\ncdZdTrZELVotMaIl3fDi5WAW0UT2ZkpTu8Boe3qtaUcQcOYi9i7bK9t2hXHr\nRhBDd4w61+gu2Wl34wNOMP/Xv5bmnsAmVMhw6QtdEKetJvECJDDdESmzj7U5\nLP9o1y+qYoGBgINaJl9wurFON/DsIc+Api86K38ShNYiYJut5JNA4APsa7D8\nVK9Gh0eYZ/Fw/AWIy4jn8IWeNgPm8frXmxuyF/zyl/dmgcucch2hlUaEpz7S\n6V7exiVxHboev6c0X3dSyRneWNWn8KNxbJRFfaiy1f7gHYQn83fnMLUrIaZR\nKh2g4DhM/ZherC/Ogxm3O1zm12s+mbDC+mgzlkJVbc9DQPs6M1MGhUT2UfjO\nuRjITcyXfHexjYwJUv/Yf2WtWgPrRwNwakRGO8BPIcqOogWYQhdMz4dDBwS1\niJx78OWscadvkp3OH7/qgkI7DJA2Zhe9F1BpU4w0WxLmXyWdkcNKZE4sHgD+\n6C5aChFYnkF4c2XYLvQcvf/yYfo84MwaOq9nHe4HwbqaDSuOrqq2ShQvFTAF\nbfEZ4x7lu/0WcEJuYllQwZXRLbyCgLh5Apa+17te++PM9SgLJdVLcvZ7be3r\np2xk\r\n=1NId\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGvhyXvr0x20Q3h2v2RrR6vKwySsdviUcGKvlohx6Xw2AiEAgwvAnYZgio9iiYIywjATkILGqmggwA8oRfacAmJoJqE="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.4.0-next.0_1616976640478_0.6767316923304554"},"_hasShrinkwrap":false},"3.4.0-next.1":{"name":"@skypilot/sugarbowl","version":"3.4.0-next.1","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.2.1","@skypilot/toolchain":"^5.2.2"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `deleteFile`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Indefinite-value functions\n\n-   `isIndefinite(value: unknown): boolean`\n-   `isNull(value: unknown): value is null`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitEmptyArrays(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Classes\n\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.4.0-next.1","dist":{"shasum":"2aeb784af89f17d0315ad112b4eddda486f796a7","integrity":"sha512-nYN/XcljFoC7aRhKo8X064jbF7ihnn1qd8hIlfusj2kVkRL599oX9hjxGT8Wt3QtEcsmvtDv8AS03ir3TkC1BQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.4.0-next.1.tgz","fileCount":192,"unpackedSize":113925,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgYR8WCRA9TVsSAnZWagAALFQP/jNtE30aFV2qAkDjOsO/\n+qaLfmxMaCtI7ZIZh0QpTDafsLJgKHUJXpkzjV3oJEhykP3nAeaFZu9+1/iK\nbA24rr7IGjfa90d804pvtHjuYjjlWgiFk8PScq4oG4Ms06XVtumqHsBDvcdb\n/lw9JXlaJJSF7l+oxRkzG6AKAgk1fVPWO19Neuoqc6O2Iq7dGtlkb0StnzzX\n+yvmyKHRufnQqc/c5SbDKsImtazTm2pQLbaZjHlV/f6K7vyQZWxMlzjNxM66\nrJzvOu6A0K5jj6peRmIDMXqRIPGfULuYjga4csHJ/J5cwh+PSp+pt99HeOLB\nlm2xXK/BXH/g+n5gwEpmjSggbV2NW/eH/5+IbYfzbXquYOMCDbLJKS+NNXYF\n1riPbJ/E92rv90yOoOONU2cJ1eWVcXvaPfrJ2AtzpRhtE+8r6OWTEg6yEImW\nHrxKc2ZePOv581ot/jhsmA42mnpIb7OfuCDOmmSNncwhky/SrTbu1fynNhC/\n8MTTR0fsp9xrAgGpDuFwIrdBN/LFnwBxyZnsiQJ+tzMWXXDkVrxKsBoGVJMN\n0VA+jA+15fmakB0Yg6M4/EeHti7o0PIfHNYesZHocBJpZhx/XvjZuFbn+0B3\ndDfLdCzx8DApEnTcGi1Lh7sT72qTzsLdpd5qy4zuzRmaN8HI15DmktXOqDpO\nu2Aw\r\n=cj5E\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCmFI+UymgcCTOsmmld/WAXHO6mIU9IJulPcKGdQQymugIgVb1ZPsShcW2mfQhxoS4Hep0MYILr/ohpVpS8j6Kxqqc="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.4.0-next.1_1616977686084_0.9033115456533141"},"_hasShrinkwrap":false},"3.4.0-next.2":{"name":"@skypilot/sugarbowl","version":"3.4.0-next.2","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.2.1","@skypilot/toolchain":"^5.2.2"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `deleteFile`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Indefinite-value functions\n\n-   `isIndefinite(value: unknown): boolean`\n-   `isNull(value: unknown): value is null`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitEmptyArrays(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Classes\n\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.4.0-next.2","dist":{"shasum":"f2ebe72c46bf15d72145ebd497292fe7852345e5","integrity":"sha512-f6AIaDHbvPoxoTqh1Zr8JZYX5AuoUBC67SISl4zMEu5RKfrP5X2rg5tsCXRtKFgBjQPiBRuibgKk4dQLJB25CQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.4.0-next.2.tgz","fileCount":192,"unpackedSize":113925,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgY+lMCRA9TVsSAnZWagAAlb8P/1/kMfdek2P1++WuCxSU\nLvotOy2qrEzmxcvad/v4drosqxVkOFrzid2fhGJTkvBOzbZNrgQ3eROKZ+07\nG0mG/okmIFdqhSfU39uUfzx1rvYC8k4zLM9YCZyfpIInlNQsGUpwsd80+A+Z\nfFPknw2caqwAAOHvtolcsM42Zrwgc2MrgGFVNYb3hYF1CWA6Ae7U24PI9nyr\nZYJ781Aj0N/Pnj/ZYTN3nadzdopd7fkWgbtaHws/GDdIimUolJ3LdjPsVG/a\nkTceao84yoy1NR56MT9GxYxZUQ82jCWLRyq17jzmz6kbXri4zYvP0lpGZkmz\nSjkjn5hsbeYmGJMUDEHkI0FMixB6hbxThOmBx2quzT5PavGwqRtYwG6jkB0O\nruYkHsgjr9NvmD5aEl9YSmkYzgQbUgOyKMiki8DdrBRV2mzXHMj96fKjkkbt\n8UqGN6aJVkrEjzpn0EcIksPbN/LwDv1ca1ydD7hz4v1oK56Z6J5OSqFmBJ7i\n2zOEtXmCJaz5VT09dOJQyi5fseUGF0QJC2nCZ1Qfe9U3XOBApJY6HY6Nx419\na2VvdahE0rQAOCxfm2xaNErkwSG9sbMRhgiLp3KGX2tl/J8YwXUZo7OAzdHn\nXA8tV9g6uFqwjUXLclXaqlJTbqvsLnn0JjlyvVwZY9uUo9TbPJXfy9Na5MqM\nJ32l\r\n=c4tc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD1Pf2HhMupmGi5n4ER9y1X/Cs7DHbNzPcwdOAPffelHQIhAM237kyDkkI1CGtuz2l4jodSDzLAmzHVXLyMr74a0B3E"}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.4.0-next.2_1617160523517_0.7304252801021063"},"_hasShrinkwrap":false},"3.4.0-next.3":{"name":"@skypilot/sugarbowl","version":"3.4.0-next.3","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.2.1","@skypilot/toolchain":"^5.2.2"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `deleteFile`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Indefinite-value functions\n\n-   `isIndefinite(value: unknown): boolean`\n-   `isNull(value: unknown): value is null`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitEmptyArrays(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Classes\n\n-   `StringCounter`\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.4.0-next.3","dist":{"shasum":"736aa0882d227f04307076a2658b52951300a649","integrity":"sha512-cWqVrqi2gCSLUprW0IwX+rz3mkrmZSW9hFtKmZdvLJ4LpP9GvB4jvbzOpVgjCJvDn52SDD0DomA02o0b/HnPfA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.4.0-next.3.tgz","fileCount":194,"unpackedSize":119631,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgY/WHCRA9TVsSAnZWagAAIc4P/igYysdBRMn9gzTVEwn+\nUVfwxwBg40sBtsrQIQKAuQkr1GLrPXbvRGAuKwV3QQidBhMxkbo4/6voVhhL\n6ijiJmvwAI0yGBPAFXSLEJXdRt7+J3b6tQ8Vuy1TTMNKW7GMymumJogwl1Gi\nuS4uI0rhHBNCogt5BDO+Yy2rZP8nLIw+6eb3Aj+45+jIuXVyLqxDnfnhVAts\n4DMJnR0MZZ3IbDTqsXJJibAau6XphtBFMgic4eS+59nXgBW0K86m0QbYZhLA\nN3PYqvZUhIEt7pd5XGHYOKYqQ4hvrcxXVTU7MNC7zoS1FN0kdepUA/nZh3WI\nwW0z9OqQr6QBduWWDs5wQul40TXf9qUDKIxZlbVuoqVniPCx6Dgaf+RLGYL3\nYcLiwEBdrZZfdOx/RU5rtHxTToj82fNrnbzJdwarwRv5Es7suWJ9Sqh+PlPd\n6zhp3GPFzsACIPMwOWGZegNostfKorga1n1hQRjSQEAczXkjejT5btQGb7NK\n3EtzxPWIQ3J4GkrqwZhUe6SyszeFbarwQM3Ii3kO/5NJYxjvqQ766PMw34l8\neahZay1QENC67tJRc4sL2tX8GLRaDWUoIygAoWgVh/k4IQdDVfI7ivqVAdFl\n2bVdaBHLNr8z77bUgC6d127JPhr1OEUdTN8QfosNyqSi/K3Axrde+wMS9siu\nULNP\r\n=8lcX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDpkjKACTWE3JmHPc9uCK2o+VcyGZ2rGNDUrfLviYKXDAIgZP6iRwkXUiazf89zC+CVY7BK5yVmA05FWN2jvbuXBoU="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.4.0-next.3_1617163654403_0.7344666359726648"},"_hasShrinkwrap":false},"3.4.0-next.4":{"name":"@skypilot/sugarbowl","version":"3.4.0-next.4","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.2.1","@skypilot/toolchain":"^5.2.2"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `deleteFile`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Indefinite-value functions\n\n-   `isIndefinite(value: unknown): boolean`\n-   `isNull(value: unknown): value is null`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitEmptyArrays(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Classes\n\n-   `StringCounter`\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.4.0-next.4","dist":{"shasum":"4d912096f071172eb3cc7774d37d144426786739","integrity":"sha512-olrkQUDqhm9LnloD7OUyIXLPrA7FEJw/vr3i/GCtKJqNW9Zr00i3Bn5McjPY7o2bH9Pp64Y88rqlU3O6POGpxg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.4.0-next.4.tgz","fileCount":194,"unpackedSize":119764,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgZApICRA9TVsSAnZWagAALR0P/1VPpuajQOtXVdRPZXqc\nosCyAJmVLYMBJWllQIGhJ/FzQwGNgPor0XN/JVrHHd2ZV6YXiqOz9FgZx+0L\n7S3anbM/YE7JdD6Jtpuwi5UMh4A+o3gJw+DqSDkBOdRt0Ht5gX+tObrQh58+\nyw6BKdijQRQoF/0WViP7AK+lB7rUqqjwuIpAX+LlUc67VkprmPVRocbuQxo9\naKdjW+s6asYIKQQi6HfTHGUu95jtCnA/4N90kzQ8ITIEVU1KCePDqQDzYm/J\nQPQuOI6qVTmE04FdJyRSFYNchRbKSQJ4nRSLXyTJ3ZUf1s/VTJ7kaGmWJZ8u\nMUYZrG1G6o7GDwWnxuM/ihW5FbHY4+Cc36xdjz/tt9VEb/E0FKr1NB2sxg5j\n8x7WL+l5CKoQpd27U4063hLuJ4Iqg1sy5o7/cNl+GFv+FIzN4r8Il/MpJzkn\nN9H7oB3rpqbFdJOpae8TFIUgf/+wW31ml4S5616LjSgJBFJSdbEg1KeR0rGi\nYz7AlNlnya9iK6kKfYCMXEoeCcQfVdwkwH1mvWyxgHeRnItefg4LSo0bd3Je\nJRVtO5fWE7nwwG+nLD6LukAeS/OiQGVxsUxwqQ+QjgivUHwwIQvz2TNTVhio\nOBe81TuPdrLJ8aYfC20cHMYKNo7ehtMZ6Us/vtzlTrQLUYrospFr87ENzLKn\nGnIW\r\n=asv9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAKU/lK/fKNKMU7FJX7wQYDgyMnfSbxKItqD+WZ9gFPjAiBC6sDebwEMk8KaxUVEyFqahMnGby9ZrwN3h3t1aAvD+A=="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.4.0-next.4_1617168967856_0.17487130321145083"},"_hasShrinkwrap":false},"3.4.0-next.5":{"name":"@skypilot/sugarbowl","version":"3.4.0-next.5","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.2.2","@skypilot/toolchain":"^5.2.3"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `deleteFile`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Indefinite-value functions\n\n-   `isIndefinite(value: unknown): boolean`\n-   `isNull(value: unknown): value is null`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitEmptyArrays(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Classes\n\n-   `StringCounter`\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.4.0-next.5","dist":{"shasum":"58a35b533806a73d0347c3b14db010983c76cbc4","integrity":"sha512-1k1oMGyUlRG5RYq/scFWL7vw9nlejdVaINY5mmU+jKb7CYZB2ziaqJJ7Y8niCwGml7Rdnl/UlWVQyiuqt+k2ig==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.4.0-next.5.tgz","fileCount":194,"unpackedSize":119764,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgZaG0CRA9TVsSAnZWagAADowP/0Fb4PBX+bTAr2M8vVYe\np57Id4u/sr482jLEgJIJQHxpSRajg2LLJ5E9CjfgrRoeJh5rz2rlpiA3h419\ngc59BQ7sHMLBFcE1GZi9Tl+NzntXMRUpCfTuxpMR+zQOcF+6FRL8AeKchBZ8\nxhBwnT33xgD41kxg8KSOXZ24n917u0UXmaavfNe+lCzgaqPtF4WdKOH7PHSU\nL9NsfXwqwMxeFDRP4MLv+A/RjGjVa7BRecSz5Q3lAyEGzQQ/3AAEande5neS\nOtAI3KdHpWtH8NmQ5FuBu3X6lIeLUcwbMlZbCIPSXZea/0QuX2DqnnDmcX/G\nHkZjrJep1NLz6mwtX575anIsaUKNpMel7plU6qQXMIPKd36jZIO+n7m7RR8i\nOEQbLYcIl1u9qBHyvMR9IVqgKFjBpjgjEy7ZRxxLvGfkZJJCipEdF6WyWQF4\ndMUBDqhLgcwCJf6WuY4qEwDnom2CqTD/NbYiJIoQFIE6QGzukdwCAobZ2KQO\nqYameWeJYKs1zbYMQhNgiCVIsY4py6O6VDXCSAFgQKqTY6sDdvTWakETfVrn\nafB9PpOMH6SYKvjmo5UE202mXwtneSML2FHqMSf8qxvL4ZEcdjn6sAdg1i4b\nwRs+5yQ1vXnnvLgKHS8VsTcOrzWasKV96x5JjW1W++Pg8Mbz0Dpt13mnQdUg\nE1Wj\r\n=RW01\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCQvuHQ19QS1KBjvkt8ZSeuFP3sqVLE/N9aGlBghX2GnQIhANusFys78lhaMUPmN5VSrVpA9fv+/JBVji8vLtBIl3Rc"}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.4.0-next.5_1617273267665_0.5014162569747751"},"_hasShrinkwrap":false},"3.4.0-next.6":{"name":"@skypilot/sugarbowl","version":"3.4.0-next.6","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `deleteFile`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Indefinite-value functions\n\n-   `isIndefinite(value: unknown): boolean`\n-   `isNull(value: unknown): value is null`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitEmptyArrays(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Classes\n\n-   `StringCounter`\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.4.0-next.6","dist":{"shasum":"23cd657027ac13f1abcce578d8ebdfda98c17c22","integrity":"sha512-aHCVmWsEQ8UKijWWTrmA9mvn8VBrtSWKbggfjhlxRbOUTE8GbHSdP7BiZgTwJ9nbDhhRkDqBMGqPOCb+V/R8qQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.4.0-next.6.tgz","fileCount":198,"unpackedSize":120360,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgeNIXCRA9TVsSAnZWagAAsz4P/3OYMZFXyiWETxdjCVR6\n2qsuvEZ1dU71Jg0aTDx29Ye0h4NbRwjZKiMKKj+7fyFMyfeCoPQqxo1AuOm8\nt3dsbwuKJQniXtrw8NTui7IXJUNSG8PMcx58f3MqXxxi8v9cetEC880Jo+Rz\nyb/Koss+lB00NslXEVb+1qN80TgONYI/2mRBF/mY+lBpmajW8pxjWs5fNeC/\nM3IsCXBpdhM7kMOV9G93adnXlBGy5y1QP2sCzGG/2fecMQPi+ricZkYZWrt8\n9jBVievgH/acKL6drh5ZhOn1qW1OvYtEQ2SmaD9O92zHm2MyDMYuDzD1CTwi\nQcjQ+XwKKDSmQ3Q/kUjuaQBYvUz63gN7zoZQlyYPlP2zOEcjglrNXTneFFK3\n5E8D7uq2CjNqMioTl+qTx0Vj7cEDA45aQwkd2XSHDhwQ0NwNCLd4IU05BTF1\nlzsBt8By5eWrbOvRMl4Dl7nDRCGDbOBI+KbL41f0L0h2YYyy8hDg5Av6AvY9\n6cS4ApMrGAimW70QeijU2OgyF9v1T5h42SkfW2OjdkAG+1Nrq3UPlJf3zAI9\n+jRsAuZhpuaIpBWcXo4sOForJu6K31hFg5mYubZd7LM4NelWWJ24DJjJuq2R\nLbUCH+tXoOTawWObuzODdyXptrTunqbyd9AvsFmnJeEKoaZWcf8Wm4FwrLof\ndCH4\r\n=eEo+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHvzebYnxe8sKaZWTzfdZftxYSoRtjFXqNyg70AE42q9AiEA6dQhwrSGx4XL+SAMbeKDl4zPSCutqa3/WJ1dCvFB90Q="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.4.0-next.6_1618530839073_0.8791602677597135"},"_hasShrinkwrap":false},"3.4.0-next.7":{"name":"@skypilot/sugarbowl","version":"3.4.0-next.7","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `deleteFile`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitEmptyArrays(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Classes\n\n-   `StringCounter`\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.4.0-next.7","dist":{"shasum":"d3ce38f7986daf4ff5bdb8a6a51fa79c1f1c284c","integrity":"sha512-EjJOXLgqyFtTrKsToLAvuA43qLPIwzgb3TCuGLmfrcdyyAAP3v1q3Yo0Le9isenSJpAJd2DIT9mWplgMEf5CJw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.4.0-next.7.tgz","fileCount":198,"unpackedSize":120907,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgePfoCRA9TVsSAnZWagAASjoP+waNgzFENoYHQK05scAy\nWZDck/o8tmsUJ53eVoGXZ8DG9ocZ4xRV3/2QKbBCrbmR2dxDYX9i/nt5a/Lu\nsTtW5NW6Y60PumlqnuttPxnJQIrZ375JUkx0Clh5kC0DaKfiSX1QakrPnlzH\ncdEfw/4Hyik15N6sc9rSnjm1r/2nfLw3+9TPe8OV7VnuhdFWd6v4l8n0oBET\nustK6qH5ZvmrnazAPVZZU02T97Hu2UnIGvHgiyhv0mDYUwZIVcAGbLtRMN69\nea5HCAmHQ0i9+QvomR9n7ikPukaugPDCP/FWutVx59GhteZ512dJ2LDaJ/a7\nLQ9/h3Y4GH3Dsn2pnm6XLdgtUjfkzOf7UdQB452VWtIwsQbih3kKUZBirAAu\n74h7pEFINH+DGrWL9rPGlgSxMA1KhWTjrOsdMCm+qXvu+7c03aXP0Z++xYmc\nZH61uFc+Wc+yhMTLskZMORosnjjU8g0ixE1ER9eD887yETpEVgH2gWYWx6kK\nrfyzKKZuJZsKonels3LlK9TgMXnwZsVfvxZBif4abfwF2v5yB5zWhVcNDEs4\nTjvXc9+L8cO3Ojqo3EarV06GxCdndohImbNYGGydAXFGkPRCIRqLe87jTKK2\nGwclKARDdIFNVhp0U+/2396XmBxpqEQcAXSvX/LL9c1H7g19TnlW/Tk+vYtP\nfPRU\r\n=0LQB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCg9H5FpkoSRc8gryAv2QuuXXUvSieV4HwO75czUvq14wIhALvGouEXaMYO8NfRRPzGpouBNW43+iASkJ3USC9USf6l"}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.4.0-next.7_1618540520254_0.2863119050149219"},"_hasShrinkwrap":false},"3.4.0":{"name":"@skypilot/sugarbowl","version":"3.4.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.4.0","dist":{"shasum":"2f6d047e785cae63e8388e6b129f548c739c41ae","integrity":"sha512-NyxDYzB/sx84FRsH0mbAEDtosgCwv7NJmGVPMsuGrVZpcsnH5hrCR0fIwguz5hrMg+CcmfO4KxZYmP1omsGzOA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.4.0.tgz","fileCount":198,"unpackedSize":122227,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgePjlCRA9TVsSAnZWagAAAV0QAJhgNh2nIPeUerLgLhk9\nrXSGrcfIaut9iL3PwFs0Zh7n0zNnaL4TFOX62DW8r+ADM97j8WJvRn56+yVU\npjyTgC/RCAJM18NNFMoPd4uzs5d0tlCtiUypAlAZ4sRLI5Y8vjGbZIc2UdvQ\n80I4bQ+2B0n7cumyqmGLyPj2Uk7Q4c8z5mXbSbhrSyib8f6AN20Dog+lq1p0\nu+hIxWUJGhPjJ7kLGfXuXeHlBadrr3omA1omAlLXiOw/TgEl48mWEudXJmeH\nfsfLXoupHOcFgGyrXL9F7T+A5j/PkwOkBtzWBPUMEttwfc4Jl4XsC5YCWU2l\n4H3aKpb8eaVAQ2VubYgdHmoIbs7DLQ7GsWFlH5WilR0d7EpIpnN6KWAR0WMX\nQ1/Auz+VLq4mSl1S7wJ/N+MOQsHKpNKdsCEGVKlC8qmBPXVWgR9H2TG1v5pG\nxSOrI8RRlQZyE23QszWKAt/Pu6JmLWywmbJYoivMrhXIgs9/A9JU8PucX4vS\nLGgaaq+nkMcqiA+gQ/PdP+39O9KbBJJ5h66FcM8L6T4B1s1kepeOugWkeB8i\n2H4vWCx/ILrSm8oN6XiTLEJWMqW5SbETRwF7r3+ViY0GrMaVOUk2QwkgF3rz\nr9kKm3yh6rKqgklOLlhSMxRHtsdbeAK5uxNiqF2m6AXcn4hOvs3iZUgngdhE\nM0Bv\r\n=uUOu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBHkJr9EdgBt3yUcQBYQTbVxpJN/jsQyVyLeV5JRZSp3AiEA3I2suagagqJjGa2FFOeO70fWn2dRDvZgvJRUGoJUDHQ="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.4.0_1618540772772_0.32771322746164144"},"_hasShrinkwrap":false},"3.4.0-alpha.0":{"name":"@skypilot/sugarbowl","version":"3.4.0-alpha.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `deleteFile`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitEmptyArrays(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Classes\n\n-   `StringCounter`\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.4.0-alpha.0","dist":{"shasum":"27675bfefedfad3d686fcc4b4a29b2fa301ee1c8","integrity":"sha512-00OO2yB+m9P/+QFN2+pPI9AnLg/6Cm+aKpjUhWfYWVoI6lIsiq4zAXunciq6tRbTeuHNsjtSK5p+aMosjFk0LA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.4.0-alpha.0.tgz","fileCount":198,"unpackedSize":122235,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgf6/FCRA9TVsSAnZWagAAhYYQAJhFZfBPH4wJ9Kk/YdKT\nRjkIqZJXZH6bsnLw9i0IXVJN7fA4Wy1wGKC3T5WH5sLGkt4FOVAJAQkXRDqs\nct9hfpQb5rdKMwqOqmF0GrohOscXBDT70Hop8SEruQNQVxM/qstWQAiqk9oq\n9TTeHQ5gyOMw1WDo/Whbz0mFZE96XE2MvDYfUI7oGXoK8JmUBBwT6Cpah9Po\n2pfGWeyI+y9+NjLxNwpi/UI5K3rKxvZ9cmHj5ZXhDb/rHbtXBI3BXP8y8dPw\nFf7dr5WQXiusgY3gfhIcq5DARJvpN2bXiUNg2y75YBxfL1epxus/F3NwRv/2\nTPR/lehZ0XGD2gIbZBSggrI9iOBf1dS9bZHHD9eVyUzJNZLXm7A+MIit/SUw\nm+Gar7iKFoWcbX/E8B+8qTNPzasF1IsJ/3tNW8qzuoj1yKxXEhloIb/Gp3GX\nNzOJ0f9mGBBGSDMcoWK20IYQhMnnruO+s0l2tA/JTxaiwM1oZ/ZcVnIkhPSo\nSUNZE1TJcVYLqn0YKThxAtbDw39lvEjtCVcsC4/eybMajtUY6FawqrB/671n\nhGB/zkD7RmfMMnGyIJ6s/Esch/HvdZ6E112t2mkCAIWN+Inc1a92v3rkkJDN\nk8ls4ObVFJ6AEMkzCbBbMfsux91bzk6zFTArHAeJxOE4hdb4Ohd8ywwFc18y\nTT1J\r\n=b29R\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE54J/yyLlAeryaOEijXkRY6sGj4MJNX6eEqH7TRPewmAiAkfTh2ZNKD9KzR1GYixQuzH5WRQxxs6bRzSy81/iNABA=="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.4.0-alpha.0_1618980804652_0.43389325882291696"},"_hasShrinkwrap":false},"3.5.0-alpha.0":{"name":"@skypilot/sugarbowl","version":"3.5.0-alpha.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `composeFileName`\n-   `deleteFile`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitEmptyArrays(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Classes\n\n-   `StringCounter`\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.5.0-alpha.0","dist":{"shasum":"35df64d602b022150372ea7559f9c5a9c4c6a159","integrity":"sha512-rJ6D4uJxCyB9JdjLZl5Kys0L+5yJm1YLRSfqPB9kNICMWaAv+/b3hkkKZzQfXQhlltvHKysUIN0nLcwbJF5apA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.5.0-alpha.0.tgz","fileCount":202,"unpackedSize":128067,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJggHoYCRA9TVsSAnZWagAARQQP/1FTXdH4nONpis8JjM3s\n3EHJRVA2xMHBmwa/azexSyBKBpbGiAXU8rhg+Gmr35kAlFArbxFWNGStuSQ4\nxE8LYjYHhvYPI9k0ZprTzoVLPojxffhcbA/ZWOCAAA172j/4BvvCVz5v97Rx\nuknnWZdfN0VW8uQoJnf2FU1iLZjuJhUbBCTBsVSLlHuUrrpfjYLL60QRCCbu\nkegYyDnvZvnslFDMd3/DIoxZHVbd/t16WfetMiKZU669rc9TwXOW3beGrW28\nEh0KTdg9hTVSB6G0ThXloRRuDIYHPFgEPKhJx7Y6IjREXL5YMa3Blfc6SXX4\nSiwvi6eI+6LXSAuTypxgDpnVqRfZVC5LXgSKtUEG5ZFvH/Zc2ZDUHQbPTp0+\nY0F0BQueMCV9FQqR3h+QkAebpxdzAb8+LKQGG9hhW4dgY1v6KB00qdv+uUod\n/BdRIGHy8cgVv+fIeb9N1hbNrroUeUb0U6NDq504BWu20lFwLMuV0DYZTQTQ\nyiuA0uFLvmTCEW7PS06Rad3iYyf5dPLGWr/z5GLO4r4i/LNTFEjCmfuqIUWD\nTcUgoqYuZnY9EK3e8oY5nM3eOIy0RIWuiMYVwOHxIwzqjZrBwLC2k3jGg8Ap\nzvc4UYZ1n/kZL6+suLvbbSTtQ0ahvvKtvkK8XFoqQ2cxdQLvyD19BOTsE5zm\n+6BN\r\n=0fgc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBpFfiCkh86q1mr0WvXuIg6tOTp/UaLqw/pm5e7z5AZeAiAzk5EmkiEX+fBPscrw6+bp3YBQ9m3rZjACL4v0xhXhew=="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.5.0-alpha.0_1619032599718_0.2565987004405048"},"_hasShrinkwrap":false},"3.5.0-alpha.1":{"name":"@skypilot/sugarbowl","version":"3.5.0-alpha.1","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `composeFileName`\n-   `deleteFile`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitEmptyArrays(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Classes\n\n-   `StringCounter`\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.5.0-alpha.1","dist":{"shasum":"d6d58c4cf25c73a3415fb403bc634f0e02302831","integrity":"sha512-ngtufpOMUJJszIrIjyGp7hDJ++jlP5sSmnSWy3X+ZI6HTfOjvAYJqnI0yiFO4f7sTrdkE72H09eos+oxsAJR1A==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.5.0-alpha.1.tgz","fileCount":204,"unpackedSize":130104,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJghv2ZCRA9TVsSAnZWagAA9I0P/ju+lat7PyunnCsniUZ4\ndflkCvXe+imHK4Ajy49nu/R2E2tskmNvVGyjgcyAcpWWW4Z7X0T9xuq5wpgS\nxH0GNqbc1SVLG+D0G01P0Ou0CJZron9PpD37DIpdpT77eUp+XMhp5r/+Xngw\nla9yTGsUQeJ2M1LXqObZ2l6dkEoRYQ3GB8jV/q6z/Gi76CIg319ztmUYh5It\nQzbbLS+hbXSgipd3ofj8Mn4+oEjE04F3tsQE6VN1OoI7LltSVaNZ6W0kb1/P\n255af16u9DKkJr7heyXoH7/3InePLN3qMJEB/4zjYhB+2xe9rrJcC+m6JHFi\nrOrteXEyRC4HFR7CYHrY6rnl80zml+9ERclqoEcd0ASdAeRHoGa7QjqQI+Zw\nyBohlUvovinYCXDIKO6HlYW1eD8Y7ulUkqXmX2uzg6WB/r/lGHvIFXcEgTZn\nxw4OjBMTG4VKJt4JcoLhQ1LcmH2Exvci7TbbWOjJd6QU7S4FzcLv/iGY+CTK\n3Eu80G4zg+4K46CCIYkHoJxmAAUuYz1hjnu4ge6A3/0XZrroOSP1LWW5C1FK\nOgfZ60qWKpV1b4AxdIQ7NL7jZA5C+i0EgA+LIOYAHLW1AbT+PlAyZYaGnCKG\n4WR+rjW+vNy2MrAXQ2VGP3/Bqm2voOElDcnpwaXsyafgNwDA/SMNrTMuYsXC\ndo6n\r\n=vPTK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEm85wPxHSaAMhJXRCPElWewp8EoM0kqcBh2r7PIHjrVAiAV7aUxUu/oMZcMMlHpYAVz22A0vWPKbZK9EOizRvsudA=="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.5.0-alpha.1_1619459480964_0.29459720373093834"},"_hasShrinkwrap":false},"3.5.0-alpha.2":{"name":"@skypilot/sugarbowl","version":"3.5.0-alpha.2","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3"},"engines":{"node":">=10.12.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `composeFileName`\n-   `deleteFile`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitEmptyArrays(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Classes\n\n-   `StringCounter`\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.5.0-alpha.2","dist":{"shasum":"a1e6a3814e07f3e48e94f7ab784d74b72b122fd9","integrity":"sha512-Kwsc6KH/7halTj33TITBEPnJk4Q+TZXLa8pNKdmX/dsrMo96zhPrxB06eNfb0JgEy45dXBm61YuV9Lj7hVbLSA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.5.0-alpha.2.tgz","fileCount":204,"unpackedSize":130541,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgh+JVCRA9TVsSAnZWagAAyEQP/R0x4Im+WCIMDw/YN4ob\nsibxkqVFCbD5S5lVPC5/qoPDlU0gpdVyWVKMo8IvYLUvft5ffx2V4mqp7tnp\nDOELvypL4OMkBWcJRovT/A7rhMlcX1VhzV8ESyAiyJ//YXt2oX8L6RyVc4ke\nnmDyNvIUWATeUYAjVHIdAiEcyv34e4RoWgOPNO5XWYmi59ucFCw6OE+2LerJ\nP7EwrbPivUv1G2MNCBOpG2XNeztsgKyLuXLlbxWJ/i05sAv/4WSHOmeqJR5H\njGpbE/Q5ildX6ufErEvuqEjYYa0iW0UeHtPyeUyg98u/P3sc0+7NteRArMO5\nGIVUCf+wVzE4QlkQ5ItSXeCRSzbEz1yycY8OhwRiKSY39xtNDP9+9lqx0uys\nqy48cQTx0Sa5FjDaDqpxH7J/zPTd54zV7HXancTbp2867E4VEgyQsq8CPQI/\nlzO8ccOPb/c+38bYKC+BtUR7TK280J8lKSAKEAoDzx9EMvU0WKLTWYx65nRx\nJg7YQu3yc/+ROlkpgn5GrjgVukAyrJnFMbparcm2b4nmuryytLRo1vvmTByM\nUiZtTixYm9L+NovBnhKOJtoOL8ktJ0JvGbfjgYRZRxFzLM8us7t61X040qhd\nQC9RmsG3mM5zy2LOxHf6kkyyaD2sUJH+EX0lU43I97xdI+GQNZ22+AQbPbdf\nvAZS\r\n=TYEA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAGT6GwujFQPE4prtE5sUkQ3HAf6+6izj/Qy2t3VjTqMAiEAmoX+KvirffdbDUAbWqiOu03fXeOOU9amIbnQP1B3i/U="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.5.0-alpha.2_1619518036470_0.11322933486097231"},"_hasShrinkwrap":false},"3.5.0-alpha.3":{"name":"@skypilot/sugarbowl","version":"3.5.0-alpha.3","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `composeFileName`\n-   `deleteFile`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitEmptyArrays(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `StringCounter`\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@3.5.0-alpha.3","dist":{"shasum":"3faccfb68103a430d675988cbaf05eb35e9638c8","integrity":"sha512-VLri7H642pndpyNhhsG4XPZLRhsyJQuyke+n6qi6UOaYPU4w8j1tTYgrlrhNpvGbYJDjWHUPkN8+DVM+eOFcQw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-3.5.0-alpha.3.tgz","fileCount":211,"unpackedSize":136528,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgiPLfCRA9TVsSAnZWagAAGI8P/1am95iNSzSMIV/g4I/Z\nJ/3VOsiGGjP73vj72ZkZJM6HpM/hP18QzSq0yHOw97yeqk/kNdijaq1eJGv1\n3Skh33oZ5BLxgyaXi+xrGZEJv4ARxmhxQV3paIZ2Fd3BLWva01xOb/VMOtXm\nzs5dPqAZtxYS0IMCpGzOj3KyG4TYCmo9OgN1fauQCB+jS+MQf9LSUNRF4ol2\ns3slRnGs8EiySE25foiJQJC8g++9ELl98v3zSW2Jyjmgvc4w75pXhTPUg8Q1\nAFaqxyRGZbZS3AbITMpxD8g6xstkSyj/6U9wWe9DVKTbFe8AORkHF7VMXeQG\nzt4izR1c7qWL3U6/Uqrn9cLfUJkBtxzxakRiQmw5pokfMS+AWVF8o+LOBHRF\neuNJ276JK5rQTd1mqXSJbm0SRXypAzQan5j0wYOiT6+Ls/6qsQAEFaJ7nk7f\nIx0N2ISYJL2l3OGkDBJ16Vup5tyC7qA4on19/D6Y9pjnqTaQTlG9AlEUC7cw\n9mT99sro7bHLHrC6ffDQ+minSfXIJe1Xly3n7kJe6LUonVy0bxeD92Zsrsom\nOtFnyObLjbZHr3Jh02r9zeW5ivCBnqc0yGbD6ov8GPvYnwvREQkFCwgBsMFT\nnowD6FjZg77kHLQ4sXnapbv95jxIIk5P5L4bDFN4QBlUBYqqhUCX/4I+QhLy\ngUba\r\n=cmjr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHAS0LLH5IP0r7nKNbCP7dvLwYvnLINQfw7t6Pc7YcevAiBpqpeDNnfxdxH4mmhIuqc1VomlM00XiQ33UhCqc1Ke9w=="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_3.5.0-alpha.3_1619587807289_0.36206099994933805"},"_hasShrinkwrap":false},"4.0.0-alpha.0":{"name":"@skypilot/sugarbowl","version":"4.0.0-alpha.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `composeFileName`\n-   `deleteFile`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile`\n-   `wipeDir`\n-   `writeDataFile`\n-   `writePackageFile`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitEmptyArrays(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `StringCounter`\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-alpha.0","dist":{"shasum":"5a3a351bd6ab2116d16998614e7d7400d7209279","integrity":"sha512-GAIlLlVmGU92YdiK/ywe5zSkSNe96v90KVyvkg2SFFQ+58L9uCaSTD2BOxZbzKVrxYD46nRFifdrnxP4S/fxeQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-alpha.0.tgz","fileCount":211,"unpackedSize":136528,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgiPbvCRA9TVsSAnZWagAAh/sQAKCkKBXNr1NEe9TgfOla\n8OtDe5yzi1pdbPcQwcZo3oP0wpycnQu1M+Jhav52gUFjOC7SaPFwZRweTVro\neAALxm7yrbrDOzc86l865NFUG1arGowNCK0R9VWcw/aNceEjfIQwJWLm5AwM\noOdEBWR6EtBYjTmF0o+44RIKfCg/sWFdTzvXnjFFJZ67lOOYmEQFhjXvDW0Y\nwsCTsgRTPX6fKTYaOjroh8vDP0MvxVJbmYitQWsb3J2ITcvugJRlwzEsQfi4\n+gxyj/qCnMpkkqUx7QKhzrImwgZOdSl8ZZDxZET8o/TgxQ2sj5jNt6siSwWg\njHGJcA4aUp1kmvyfVAatu6Q1C/xy50zK6/yUQDVRyRO8KI/2Z0wHXW9D53CR\nw0+TR6+ZJ8IUuSf6xqHNcW6ehxv7eUpDu3fPGxTtc2qGkbuETK4R212YHLkX\nYFJX6IzijMiAR8tQI7pj8HDKICW+9N4ANrULglkYbY63+/3g0tOcI/OnpbfQ\n8NC/xHJvbAvy65hNy2EDdn6bbBu2S3S6J41EULw+b12PJv7vtnLpHp/tJwOK\ntvor6Y4zfSRAziZE35nh/0fJq4TVNBRF/U1/pd/WFjklLN9buPrJwfgTwSjY\np2XInmbypKStCFUxKcUI2RU9/mQrpPBQJ6NaBsdksS4w9b+ya6989Z8yhVC6\nPik4\r\n=Ne08\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB7/SjAJzXW07ekbBlXkuOCgftgIvG09qNhghAVBN4RQAiEAwl3PUGc6liwvGsgqP3+LfeYa5N29+S3s+02bQKEmkYk="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-alpha.0_1619588847219_0.8312169231922395"},"_hasShrinkwrap":false},"4.0.0-alpha.1":{"name":"@skypilot/sugarbowl","version":"4.0.0-alpha.1","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitEmptyArrays(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `StringCounter`\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-alpha.1","dist":{"shasum":"a9a31eca59102f858ff40b335334ad1d789dfa5c","integrity":"sha512-wCg9+fHPztamWqjHNTmzeMu1OLSrmG8HZ1KlTcDp78sTHgzA4DarZ8WFeHkgxlAOF6+hhDZtKUmgwAyuXx+eGg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-alpha.1.tgz","fileCount":229,"unpackedSize":155335,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgjckdCRA9TVsSAnZWagAAK7IP/0Sr+NzauMmgs8X04fBC\n8ex55bUIELkQNABX6QrvEsG42Ex0i4tXDlh7m5UsI3UjO+DSdWQiJ/+EAMSM\n1F31jZgpagVQxF6FkbSdyrRDCOhTZzqpdNPbp4MfAvYedH1Q2O862mxRoMg7\nPNHhKjgpibIVOu5JYv0mGTnXFLoW6W8KvAoju4/JDxpZ14PZic4UQROvQD0j\nXkz00td6w/OypjZLUJf0qk06i2cCome0AdvrkGw+yhfODLCJgfHgA0zkZE/P\nyN0UZJ/gAzzkD6EdWR1ztJdhICbvhavLy2HlAiUv3WrUC9HDejEBLh3frzN6\nSl/Yg1R3OedSLjViVvROEDcyhDwIfaK9GuZ1UHTFzu2dBQIzP0CCF0QHm35f\nNwyDHmzaphC5H41A2GhP9G5irJ97/lSsHMJmVw7KcAhJSdResgwKz/fdnNZZ\nvn7n7avLtBaPSoAyb6antJ9rjCinYtkOVrNNpVSpARpuIBL663IQd1Jm1eWn\n3cjtEVH23ktb4iiQ+Jx6KjTf+oGThRk7ZmLCW8B795F0inhqzRQD7tj9/8MG\nDfIwz338goZMLej3GiBhwJMSfnWb8vWXrL+XKKpFz1fU8uIEmdxD06QApCgV\n+YCDTsaMRroTKs2gAl5+JALEUCshVIW65v5ICL9m+64HAYQAWybeBVjMlA59\n/TBL\r\n=VlCR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE1dfnItc0kKGIzsfy8RpVinvZ/qEJF3iBnw6/SIXJrIAiEA9986xwWOXvLdCI7PhRhKLlO5ureUaxXGoTCubmaZN1o="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-alpha.1_1619904796712_0.40055449650352504"},"_hasShrinkwrap":false},"4.0.0-alpha.2":{"name":"@skypilot/sugarbowl","version":"4.0.0-alpha.2","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitEmptyArrays(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `StringCounter`\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-alpha.2","dist":{"shasum":"308475dc34175ed5740ab4b81c7cc0156d112d76","integrity":"sha512-j70SpQnhHfC8rBHYoqxXM2Br0cMGlyMKGRxweehgQMKoSfKx9ZrqeLz/bTSiJaQY5LnLchs0XsiUxd5vRZg5dw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-alpha.2.tgz","fileCount":229,"unpackedSize":156129,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgjgGOCRA9TVsSAnZWagAAu/EP/2xYgUoYJkin6LR5F5Ei\nVfvvUWO9oTYP4xRmj+xJxuWTgTykGUND4ErHHhKVf3VguY+3KABwaHsYgEnQ\nDdA7J72WPtPP2x4ItV7TOYgLgTgEm2nkTcJxWpf9SJYT9sA6FuNg/QvMe4Ed\nZPomwSSWUmsr8Gyt2NessImKV1HVqE+vKy3OOlKx/POq3qsMDEBjssEN2dps\n+3onlTUMJ/S+X9w+8834uelS+snjp+dtxpIiJFFE9zXI4JatQ+NmWyK3pukw\neL6Ioj519D8FJZICfk/PRKT+7oRkEtZdx52KLEqqLUItMloqpLU2l6OZciOd\nNoFSGSPrWnXezKdA+UCiEObyv/KoHl/PqqbTNUtzvMqHvbaT4cu6AM1nUhVE\nmvlpNp3kR4uAkkVwej+8Ty/kbBhQH4w16EUE+E1gkRHHL8h31vI3oE3MgDeC\nP4soNtBd8b0VlfBy+Jb7eRMTjU2zx3rmG8qxmEBEQ+mo9Et3NM9xH89DOCct\nJlFxejPToqbkEDoigxlTlC3nBzY8m9YyUxF7wl4ZkxrRBAG+A4KgunPzKWeu\nZHCwdo60ESzXM4yZD/JoFKFOVGLIh+Is133PYT8tkde45v3MhBbB0Ba0uzjC\nbPD1TwKUukCvyjSYN9fp6Sb2lyZRGa3kq+7RC2ym2pg0VBf2BY+83SnXNBjw\ncNSS\r\n=1GeX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCbSAJjr8nrK2Og3VnTE/QrhaEoKo01MJuH9Yyk3vf/BQIgCK4rT1aGCFW7ND7nPRfKn8r4wJlegbRK/n9F2pITJKY="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-alpha.2_1619919246194_0.1636091124544672"},"_hasShrinkwrap":false},"4.0.0-alpha.3":{"name":"@skypilot/sugarbowl","version":"4.0.0-alpha.3","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitEmptyArrays(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `StringCounter`\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-alpha.3","dist":{"shasum":"b8603545ef77b959ae2426a1540196b671348641","integrity":"sha512-CD0Ixy3eOJbUr3Y8EspHySGIMtNzeG7/wtvtte/9D6s4RCzPaoI0qi+oP3oDNI4YGWKbh7BvYr+eCAw7/rda0g==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-alpha.3.tgz","fileCount":240,"unpackedSize":159732,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgjvZxCRA9TVsSAnZWagAAPRMP/0IbEXVrl1pRotfE/Wo6\nJoZAkbaeAYQtqSoERyJ5nYSrIWRU1ZuwUoRrNnCz4M6xUoi+Z1Ys37SECiZb\nsBXTLJqeXlKw/a3kXLyQFlLQt11V7R/YsofCNRRews9fhfvWjPWi+UK0pjhL\nSLCGa2hLc8u3gzovTgjINjT0/oyxCodUqZVSzNoejPDHDm3Ge5kAx6J5vtad\n73uDAVPh6/A0gbtXVtlcsO/qW/zpspEtn/rsFVFXOiMVg9pid+81EuasQJzz\nBrE7TNoD6k9cTJ2WwM5f0tf/O+jvDIXE6AmjZwbg80Jx1YLkJP0WPgF+LrEP\nDW07BrSAKquZLmwlHsHB3+TuwEICtQT9ubXf5KamqLZoi2fpbMU5BbIUAPFv\nRuJcoN45+9fi2sD2o6aHs41uqdMlnXoMAjokChGKGyPFujOnK5IQ0vZBdnaq\nWaitPeFQ5AxVEymGE7DnbFr1W0KLaCHfqZklsHg3sU/94iMpLB6ajkp0DotL\nbPdcGkVcE+XmwfUZFYmmzjJ5FOyp3kWrm3heHuKLuuYdv2/HiB9vrVSlXaE6\nKuqdZa3ar01egjn4oHc66Ao15PKiZRbECM8e4UFs+8JbEEy+memPUhr5pMCH\n0HR8lKU8jPXlh/R+7MscesxUtz5K15UV+3o2ZMLg5MJ7lSjF+lCIW4eoqVF/\nfRgu\r\n=RJHZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAQZFy+IVJaPsTk4ANFRSGIWuEM7SIKmYt+pXopWk5LyAiEAtdKq+4v4kp9sy4q357mMa0eKTFO35sUxoeL0abwbQ7g="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-alpha.3_1619981936559_0.5633538752171332"},"_hasShrinkwrap":false},"4.0.0-alpha.4":{"name":"@skypilot/sugarbowl","version":"4.0.0-alpha.4","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitEmptyArrays(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `StringCounter`\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-alpha.4","dist":{"shasum":"3655ca9898f50e93d6820f8f12d2cb823e29690f","integrity":"sha512-Xmvl2JnhOKzh9YbUrj9qwWrcqwfK16CmiVM/liSOMhmqEA4EgK7hLHuPUxvIfR+ADLga6vmi1acA9MFnRqza3A==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-alpha.4.tgz","fileCount":242,"unpackedSize":161615,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgjw4/CRA9TVsSAnZWagAA8VcP/RNN/zP2dTaXkINsvgBB\nLawDkPQndG10Yx3U6yprKGvbuhUm+5rd/Wa15tXJNgZ/elpZSknNWdn26RjK\nVaXmBrGGZ1Yb3JDrEHzZn9dSXJwlc0sByxOVuqvlJJJtf+fhQBb+L1LspPvv\ndUGBDCXG5jJ0IZXZDvnl0h91WzavGkZAEGezrMFlrauW+DxBafZuegB1dImu\nAFnLkzcMADCcm9MldWmfbpbF+6VyPlLasGojFHfaafF+1LjCh3NQ1iK2zFXC\nFn7Y4N5iWeq/4UmaYc0ZxyTkBGycYR6S3FsxaAtriIQQfFdSE0HLFQ3s7g0C\n411VaZrZZqiv0D/3At/Hzl2D2HcbOLiCG9tNcGgBdnMntMfzydgXKITRHi0e\nnpAM6OAHjrL6HkdDJU7j8U00MPpr60K7rcAQPNo0ddY2FbZVMpBOAGtLWCI6\nTFt4HxVtruAJx0WH09MSGdShPuVKW/ihRj8bt1sOwADbj31Tu9tS+d8TU5qf\n1Iv6nw3vmEqnXGwYEI3JJgNlTkhj1eQHu8I/FZ8uRI25zkgss+F4XvsCRMMZ\nULfNXR2e44i2ggexgr8U5clwH3+nA8EX+cQ2pX6st9k/xYDD4PHBKbdC+FlV\nhhBkiqVFgd/kIdXdDWlyc00YdJec02YEIjdQGGby2VNyF42R8dE8Y259L+Qm\nMxrt\r\n=TZX+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFmjR0vY8HfpC4Kd4n5Y/3ivWjDsWCjGusrgPe8pCSxGAiBdFqdVrzTT4SF/7SCHTFiHEpaYjSo1Qz/LOB7QDMMDMA=="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-alpha.4_1619988030444_0.6794484191006445"},"_hasShrinkwrap":false},"4.0.0-alpha.5":{"name":"@skypilot/sugarbowl","version":"4.0.0-alpha.5","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitEmptyArrays(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `StringCounter`\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-alpha.5","dist":{"shasum":"00f0d20931db12b2aab29dd1e66552c948fd4f08","integrity":"sha512-ghc6JfWxb742gzZVTl355dZwOZCLpgo5e81zL8YFhVTH2QmIUjXB6XY0m/9pYWMkhjTYxMT2ouC5NoqPm07vxw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-alpha.5.tgz","fileCount":244,"unpackedSize":162264,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJglqiyCRA9TVsSAnZWagAAf0oP/25AWpXO0lwIhBO9iox3\nPun5iJ2kC3mSORzjRAqFAQ3jiQrrE7GJ7m78Pl9yVFtfN3/KZOIOa6tpWYmW\nuCe0ID/WldC10rzvNc2/XXBTRProYkjpUmy9+eEr4dbopC0UMuTm/0FO2Op4\nLtRe49xsl3MeYrNp9TQ2DILEb3UhAZHIYiD+uBYcHjuuTbOZdi9CEi35MBWB\nEKwPesW1hA3GlBdfw/LEkf0S/NFasy6drkXbvAY+cfumkARMnHn3wzmPOvnJ\nDdFL2NRYtVPqtsAMgJjs/LZei7Etb9mXvQshZDak8yGkotmI7byjRj+lElGZ\n50NXDpVZbgtMRAFhTTwkx/AW4uP8GfJD4RrM88GtTKPrX+GZPv5rbs11cX+X\ngYvLo9nAkCBkqnqHaoCxEPBXlkvpkhbY6J58Pl7t1q0tXhwWUJWSvSwBhyMb\nKg36oAumtwDgwmVc7ss+G23+q6817mDSj1ynDxRmfTOSWbzZrlke/bwudo7O\necMv6ZIeulaqg3hdA1pHst45NTWPuTdBikD2cmh/mMnUG9VRdQ/CxeHlJ/mj\nyK7v8MbN+/Gl9LbNKeFrqeJzBEOuNRR5tAbqzos/EGFDsljXiZIy1c8CjWDH\nqqd8Gm52j6MsMd/vX1NRno1PZ8eERWoQc61TytdsqIkz/uoU9i1wsft3u1dm\nPiuc\r\n=CrX6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDqK8zZGMkMUrh4od2gx2vkR9s0njJ5AHHrZ7vk1hi47AiAOMjLX/q0TodvczgJSoDusXYze++PB5ILS/EBEhrEedg=="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-alpha.5_1620486322061_0.15796263611716288"},"_hasShrinkwrap":false},"4.0.0-next.0":{"name":"@skypilot/sugarbowl","version":"4.0.0-next.0","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitEmptyArrays(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `StringCounter`\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-next.0","dist":{"shasum":"5ac1702d423a40c3e6bb3fa2be3fcf6889aa9b8c","integrity":"sha512-WnFDKKlhjrIH4k37qKe4LTLiEv9vVZW6EpcGADQzXPmhGnka2zsxzEbnRZXBZIuA1LAbCb09EDzbV+sJakD/fg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-next.0.tgz","fileCount":244,"unpackedSize":162263,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgnMEZCRA9TVsSAnZWagAA3CMP/iLMrAFy57JuJB5KwrCv\nisrPZlz7MU9K870bxgK/3jON3Ljq2NJJmZxqydfzVaXbgkbFg5gPQnDY3QHj\nQrqvJoKnefKmzGwN7THshUHuId4SPCDop/jbULLMq3oJJ7W1buHIi+r2UGFk\nKZOLKEmxq/lyQWu6kS2u9EAiuhvfPMIf4g1vySuHrIh1tT+2v5cpQtY/dvcj\nPuwBjCxs/e74O8LhwbgQi2bYvQwbE4+8i2jGh8W+pP6afhXacL5BYlAahLaf\n28ZQkHa4PWXSd9GYH/yYLW+/VgyhgeK35AkTZPLoT9HF8bR+00gkZJvdd5+1\nyBERC/l33J+Cn1z4YgZjmrhOiH3TF+Fz/4x/CjopxpVbjFjDT8vLlnJ/2oXZ\n7tY1w5uj6kLUZieFia4dVdb45KE0gd3ncWU5x3D0fGFasaPhmVY6iWXsSS4/\nB4eBxChbmZoZoEImu8n6GkxZQcOf87TkCP8Y1CXus5xq/+gAcO69rDzniG/P\nGGLOFkIPH0kNIKpB55W7rqDndudlYSXJza7xuzX4sGbgXXoiR1DxYH2a6X17\nacbLmyxSDByYKeKGNotF1qU05IjHlf/xndqkTCHd//CsVT/C8cfAETHn0ZdZ\n+D7Z8ZcIsVe2iB072J0mjQfLBPNf21NYAlriRMQe8ksGKTuVf3KWsPtdBYJE\nGNqT\r\n=mosJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICq6zFYbyW1yCZe9rpF6/1LBPOy15gDgLwdZJQQ1dD5fAiAnvNOyGZURxYUtfC0ye6SKdum7yijYZx3vMlXIxCfLaA=="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-next.0_1620885784709_0.6501668211694556"},"_hasShrinkwrap":false},"4.0.0-alpha.6":{"name":"@skypilot/sugarbowl","version":"4.0.0-alpha.6","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitByValue<TValues, TValue extends TValues>(value: TValue, obj: Record<string, TValues>): Record<string, TValues>`\n-   `omitEmptyArrays<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, []>>`\n-   `omitEntriesByValue(value: any, obj: object): object` **deprecated; use `omitByValue`**\n-   `omitFalsy<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined | '' | 0>'>`\n-   `omitUndefined<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, undefined>`\n-   `omitFalsyEntries(obj: object): object` **deprecated; use `omitFalsy`**\n-   `omitUndefinedEntries(obj: object): object` **deprecated; use `omitUndefined`**\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `StringCounter`\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-alpha.6","dist":{"shasum":"2bd12ff17429542d1c136c39d94b379fa652f0f4","integrity":"sha512-al8vwerd79ou2EfcMeRJFDr7uMQdiCIB2e+gZnsByW847wNyPHkFuw4KBauhTIaAwQbpDnmoI5XAXstuEwwK3g==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-alpha.6.tgz","fileCount":250,"unpackedSize":168247,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgnMKgCRA9TVsSAnZWagAA3GIP+QGHhcapsrKJmXmBZrJv\n8SsR/d0ibr6txDnPtSWfaMf/5qMhuSaJmlPXj7iKnPAlI9hwgAXPK5M7I6ho\nGE3b4y5JmOYULKdYmbRa98Mk1we0Y11blLUUBgGlDfmvbWTFmTw4325P4hlm\nVJO/+j2lZeP/EGe2VaHNA8f+onRHcVkmYR+kYouZMQ90G48jLDjq8T71e1PX\n49Pf9MJYtHzBDCSb4QCLTlHrF7vDjeyF/ab2yRqsgsenrQHx74WR3GAITzMd\n4nWkkRPTlNSNaLjH2yH+FUOcLQ/N42rtjQkyHhZRLJcNv2kWM/OeNA4lQJ8P\n9vfgOhGQKOYdq+GpD0okMwCWuewTVVzMMfT4DIetQ/b9NW9i/KcniezB+RjF\nKe1UvHWR/vAZUHSUix+EeApD/MaQq1RxxpDcSOAfGK4gnU9+f8x/ThO6Rktt\n/BoXiM0/CO7M9t5Z6Qn4/Y6Hrq9Id4iPD6um6pcxCSvtsvswgGeXUdg4xVMV\n2m0F/VDZ5IGJ3X/20S6mkwFZIfup/LW0Oxq4ysQZMXY2Q/Vy12P9qlaFbqks\nPlkha5l9AAhorRG2ucAxdWzd7Ve2GBfnjards074P2QEqMSX5onzSGLGHFq1\nncgK1xJCF9eI/e1PRLP1ON+cQpZ8tX+WbIKkQrVYnsCC00BcK4jLDTwHxLK7\npb7X\r\n=vUGd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGr9ykFnojt7MlXKqhqkN4/qxaSCwM0stMGXLH+W7090AiBL59vViG/QlwL6UXzgY3Zyao2ucwEkeFuWuxdSY89QTA=="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-alpha.6_1620886175879_0.8991117485544589"},"_hasShrinkwrap":false},"4.0.0-next.1":{"name":"@skypilot/sugarbowl","version":"4.0.0-next.1","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitEmptyArrays(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `StringCounter`\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-next.1","dist":{"shasum":"6d8619ab7bf22f47817f8947d182f403ca9b0c5c","integrity":"sha512-vjfrt3cMz5HVR83jgR1mzrRZhZiQKmoeNG+bVDlwXewr+ffRzt2/3PE4aarA7GZFUxJgwnv9VIMcduhwZ6OanQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-next.1.tgz","fileCount":244,"unpackedSize":162263,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgnPHhCRA9TVsSAnZWagAAyFEP/2tdFXX+mFkZ+21BNdMo\nRHbpNuMY6920aGdHbZOZNW2R9pV1+0MXfQO8t+ioHsGyrmR07GDfPFjpXzRz\nU6H0FTXKef38qE0zjZJ8BCU1INQDi411hJJfSKlt1Kttq6aXDGmSDIV7FhU4\n5oh8ixP1ul4GdBMLVRASld2qVrbiSxplzLQ5O47hUyB95zL3avG782rohy6C\nAqIwb72onYfA3PX3c/AMaElW9Sf9uUYk00hIi5FQjl6nchfF+Upug/ZN8sYx\nY6a5gsgDgMCyVmIsR6rPvQPehTDCGDue2PWqvPgK0OwNvbHlpokCxMTkdPVp\nXxekYXhP5y7EKqjWK16SaLADU2uHaQjWgW7q0Fq3DblTGQBNqOaSjVNwv7jO\naqHkg9btH5VvdfqK3bAvOMlN1J4gy5QIZz6UjC+VMFmyQhO+MQYg2dEv/FKy\nrSCAeEZBPXCRfYU9/0OtANOuln/OU0uh5AIO2GrTgL8mudwbUFjvYg9dDlvE\nbwLaGAsl+SqNC45FNPx51vBoPBlP3gRvWvPpbg9XEPxAPYN+uJi8lxUYPh7o\ncu01WoM4WetmAbA2oa0F1unI85l9dn0lqkmTA5H0nr+a2/21x164T/Q85TBL\ndoolKnbO7P1J0cHWsV0mmQ+sxRNfcPUNGhjqZqz8mLKcoKURyYt/ikFfDxpZ\nJFwW\r\n=4cM1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBZVjwwgs/QXjn3P+q+6MzIdNKdFoGzM2THSlfiWfE37AiA7RJniInujXsYhIF9tMp1tTQZqhiCe3C96L8/ACi0Tdw=="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-next.1_1620898272551_0.27865136874561847"},"_hasShrinkwrap":false},"4.0.0-alpha.7":{"name":"@skypilot/sugarbowl","version":"4.0.0-alpha.7","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitEmptyArrays(obj: object): object`\n-   `omitEntriesByValue(value: any, obj: object): object`\n-   `omitFalsyEntries(obj: object): object`\n-   `omitUndefinedEntries(obj: object): object`\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `StringCounter`\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-alpha.7","dist":{"shasum":"f4115fc2dd52f878f770eb40f6d250064d4fb852","integrity":"sha512-0M7z8oq6bQrvtxCNu+3aDIsyLba8hOigfo5rKiNxjlKQ6K6CG/cMUBxtWpC7KYeTbTcTrtHbW85jrXlZdiLJig==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-alpha.7.tgz","fileCount":244,"unpackedSize":162264,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgnPMeCRA9TVsSAnZWagAA/nMP/2k23vANKZ3L72tVYuRO\nx4CidbY54LCjCdXDRuRbBJHrxi5LcLWWygp650h/eQEj/ufWhnwN+KsLbT9F\ndjbUFa6p87tncwbmYIGNr8mirO7vw8bspbpqmz8h/m5OzKa/ca+jNBxNyxFL\n7hXED+RGV4wpcjTGdGOvos6xfXZw8kqjikDySI8LAXAStylL6/QqgiW1s5TT\nQyvolA2W8umYno++ObAMfgs5KoN73cklq5BqZ2GTe4RJGvj6EL6SDdaoGJ1f\nv081wiVHCIsUvxTHLQKwkm9l0OvzIgtazkv8MB4pZtHdPKo1BbO6G9Ho0yNv\nXbpdVWkQU/Nq+Js0qO9rsDNrcpFBvIstrhGVG0OT6Y+eH6hvWvSdO8OgVwN6\nTsjz/aTVARKAYnjtFfQwTF8F71yx4WU7LnfZZzsaWOEeUSO4wYYC30VT8+Gt\nnpI4tczmIuQYv6OefPZ+RMvNkJg1widjLGsmLQBNhYp7swkQLmC8DyrzDtEA\nvIPUmHoceUvfKpR9fxilwEvnHPwR/jB8YeeWM+wcvBDF2LzJwOfr0f+aFXY+\nPfXI7wv/4BTKOQ/2pwOYfVRlzmN/psN8vCzDcrzw7HlfA4PUrewHJHtGPWFs\nSVXkGJTLhckwyPooHfLIyzwc24A51TNFJOMF9FzSWe3nGZ43QlvDOdhGvp5F\nV7Gu\r\n=l4Fd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGOGTnN3yQ6n6E57KwCMvt4SUQgy913ga0Rznfp+UWP2AiEAxnpNod/0R0fctk7Ox6fALVD+yXLAMI2PqKeTUKFoTFE="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-alpha.7_1620898589631_0.8841009399547917"},"_hasShrinkwrap":false},"4.0.0-alpha.8":{"name":"@skypilot/sugarbowl","version":"4.0.0-alpha.8","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitByValue<TValues, TValue extends TValues>(value: TValue, obj: Record<string, TValues>): Record<string, TValues>`\n-   `omitEmptyArrays<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, []>>`\n-   `omitEntriesByValue(value: any, obj: object): object` **deprecated; use `omitByValue`**\n-   `omitFalsy<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined | '' | 0>'>`\n-   `omitUndefined<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, undefined>`\n-   `omitFalsyEntries(obj: object): object` **deprecated; use `omitFalsy`**\n-   `omitUndefinedEntries(obj: object): object` **deprecated; use `omitUndefined`**\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `StringCounter`\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-alpha.8","dist":{"shasum":"ee49a08bfb250018407131637730ed48aa52f20c","integrity":"sha512-W/a/87WrZS5KSYr6Z6L8SKxhbUSUcsMshf9tZrmTcTqmxDJL4CfF6867dHIzsicSf2iJP4A1AKnXmniX3aE8aA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-alpha.8.tgz","fileCount":250,"unpackedSize":167633,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgnV6GCRA9TVsSAnZWagAAgbAQAJCn1kY/uSAcK/UjB0YZ\ntPPs1LURqWAdqdjqfRr9/FS92xDpaJHJpOd6ZT3gMTiW2GwEJnQ9MrIYWn5Q\n7vXUqyhr7gaTq8nB5WgaxLDfY3a09qeAbhT1TCeeK2L2yK0ralp1BurrQmer\nSnNNMjTYcum86rxLyidt5Hvbxicn2e7ARpqTEcWPLVVLCTbsMdCBKtGO6g0j\nLviXgpg+rdWSrpGJQUgKPhDY1K560wj65qYnUFh/yxssIZ3CZ4f1+UV9p2hR\nuDGWpzisF8ZHN88+tS6SnTbEBC6jKSBOGsEu0582+wudvyZT6jf1ywYp77bV\n65UQfOK1GC/iECTfnTyQ09AYIDiPIKIMp7Go4mLBT87srdO6f3TLQ46937Y8\nKqCRtjZj725lkG392XHBO18kuN4hsN9n5ZWrJAlo3HqT0gh0eTyVbrCGXhfu\n3ezz2Gi2gYPtjiBfeP2YKkPFjrqU9d5zEUq8TVH7vjZH1bUjYQfC9IXopJDT\nABCvKRoA2g4b4feli46bRIqRK/77QfIV1ZJ646AX0R4q9tNeogc5e3+0wq00\ni8CpDUTIwxRmo7btqotwxfvC2l76Mn/9lzkZMjcmMLlJsFAzX2JmeqhIK1V1\naPDCkfUnEx0ujcH86LYkDWWDoVpMyuKzZB9GvuV3rAjz/WNetSmA1xNtQM90\nbwzu\r\n=YglN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDhDLLhmPPdssx0Zc62S2kr+RNGk1KBMjaD8ZzjPETr3AiEA+ErcSSBovEWk+TFrASN5qROheVL/UNAa1954o+CV3KM="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-alpha.8_1620926085469_0.36297402791865485"},"_hasShrinkwrap":false},"4.0.0-alpha.9":{"name":"@skypilot/sugarbowl","version":"4.0.0-alpha.9","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3","type-fest":"^1.1.1"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitByValue<TValues, TValue extends TValues>(value: TValue, obj: Record<string, TValues>): Record<string, TValues>`\n-   `omitEmptyArrays<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, []>>`\n-   `omitEntriesByValue(value: any, obj: object): object` **deprecated; use `omitByValue`**\n-   `omitFalsy<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined | '' | 0>'>`\n-   `omitUndefined<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, undefined>`\n-   `omitFalsyEntries(obj: object): object` **deprecated; use `omitFalsy`**\n-   `omitUndefinedEntries(obj: object): object` **deprecated; use `omitUndefined`**\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `StringCounter`\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-alpha.9","dist":{"shasum":"c4d9888819d50d7b3051037dcf9f085706e524d4","integrity":"sha512-DkM0gN5+Ij4DUYWvxDEnC2f5E/mDdAX4EumDF6gWlch8nvFjALiJB46NfdRzzc4Epq7UWAuZE867nXwdjzY9gw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-alpha.9.tgz","fileCount":250,"unpackedSize":169209,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgnXsSCRA9TVsSAnZWagAAVPcP/27fU7gAQWpfNqCcNOZq\npfcg3kwsaleNvyOnZm6nfjspdj7LoHOJU9JFlSpNid+yy5YxH8cuuu6VmeCA\naHqUW2ucdvEh7kp+3sxwMzz9dHGuq4Y4FkparTWH1ffvelAFUSiWKXIjhCq1\ncn2iovabxh7Aaa4icnmcQBPPHFwRnltZRTeUQVy8OY+iB9tvtzAE8vWqbuVQ\nIbemfLu2r09r7+2fGFlH0EnMPJEqHvNNU/Hpsw58fsTcpxoquUdkC3pOYKf5\nasSXm/qgagGwlx3F2Ualg+fWelv/DVKE+i/zC1aAMbvQGTJ9dzNlV50rCY/C\nPbQGCPuZ5orgP2IewF3ZGiKG1e9WztdYNcoFag5uLwxKusyqa8PP2I6K2xg6\nrmJMLi1hgleyHsbw95atzsVxJpUbRv/gJfnVExQzRoct0x1tESiGmGvX8TEW\ntkPAdXS4Ue/5kPTp+iEhHIo65Cn4Xn+wrteRFFR98LYBxWkfMIdy55Bl0beq\nfEOFBIt+4vPZ/CP991F0Z2ceC+D7oEf/nl743MxRa1aOWJ5gn/GuP92Z7sab\njix9WWCSqmpAKuLMS/Dn4NkObJXIRsaMh9vjjWgMCH2YYFFBhMJUAS+LEvnJ\nO5tovVCXx29dy4VUY4bjVOigj1tTt3HsrqDGFSwc76NSAWG7POoK8cEvZ5Um\nc6Ex\r\n=zjRu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCMeYDoN81VbyMr5f+8xIX/y5zlb0VtZN9cME/hUWS2zwIgJ5ricyCw9YwEFCgE0Z2h9Y45GlSbn1PE/4JmS8tx56Q="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-alpha.9_1620933394189_0.9099528081849577"},"_hasShrinkwrap":false},"4.0.0-alpha.10":{"name":"@skypilot/sugarbowl","version":"4.0.0-alpha.10","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3","type-fest":"^1.1.1"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitByValue<TValues, TValue extends TValues>(value: TValue, obj: Record<string, TValues>): Record<string, TValues>`\n-   `omitEmptyArrays<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, []>>`\n-   `omitEntriesByValue(value: any, obj: object): object` **deprecated; use `omitByValue`**\n-   `omitFalsy<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined | '' | 0>'>`\n-   `omitUndefined<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, undefined>`\n-   `omitFalsyEntries(obj: object): object` **deprecated; use `omitFalsy`**\n-   `omitUndefinedEntries(obj: object): object` **deprecated; use `omitUndefined`**\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `StringCounter`\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-alpha.10","dist":{"shasum":"7c0e49897ce4c2538f38186074098127b0195029","integrity":"sha512-4BOWY/ksJrZ4USRDyWlJqPITDkzhizW1Z/5y9w3SzYvPi5Z2PQpeHWCiB9RjFfRnzvUm+Ft4eQNU8Dz0qrBwyw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-alpha.10.tgz","fileCount":250,"unpackedSize":170337,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgngPICRA9TVsSAnZWagAAIV0P/iHgJPIFIILCPJOMLwbJ\njgvD3xx/ba8NBYnaLPS3WUIsOJEz88puwhXsrp+vQj9guAEAdCuEjOhLyQXH\nyzxgqw3p+WUoAYLWXQGrP8eZhQ5qJ+BV+l2Z7G7FfEmHTuTHHDm12SzqS95U\nOFEH7P6Q+1NjWMbD4qYSWaGq3zPgHqlHZvemOSUZTL4cF8Mcy5+YSBiB9g2S\nZoLopzi5ot3SsFDhp6lSZVnVJJzTg2285XwK2WBJ4wBK8QycKYfvM/IHZBKL\nkUCjc+mbufvB2GXeXiXxeBEQr+lVeLZqVdfeLN9/iOcqlr1TrsyhWxjTnivX\n8LzdYjizAvRnB5SxOS1/2BZcOheUrIP0tJf+AxdjDfZmgJ9ZvOOZRjkWsXFV\nH/RwA4psH3zROmcOV9a3PQJXyFZph24c2ulP16UxzD37g4qwperBGwhXnX+w\nUnVnRZ6B7fmH1hVh8iRAcy2hFbkrqYXJWOheJSb9nNkU+6GrFNpc4RDo/uRe\nKkRZOxbx1AMFS0zYwbW6A8WnxuJ9xuBO39LmYCIVmsBqk9F6RlVQobl08x3e\nkbALep8H+bxNjt/IIKGpPvBE6JwdAoQj5sq2L3O7eij7ZFCsPKHYR9tXnScD\n2Xet1NNUkdPDAWajpKXtF/tQt/Ya59KRb/REkA946UCzpM1aP8OVbp+sVltm\n6xL9\r\n=OLlB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC2peKEfBcnSjCeCCq1cL45SymwvfCCchaypHQ6VYR1YAIhAKicn+WpbCJpfHMvH4DHe/q2+d7JVE5V7jLFdYWoYFmT"}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-alpha.10_1620968391543_0.4009155215861786"},"_hasShrinkwrap":false},"4.0.0-alpha.11":{"name":"@skypilot/sugarbowl","version":"4.0.0-alpha.11","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3","type-fest":"^1.1.1"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitByValue<TValues, TValue extends TValues>(value: TValue, obj: Record<string, TValues>): Record<string, TValues>`\n-   `omitEmptyArrays<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, []>>`\n-   `omitEntriesByValue(value: any, obj: object): object` **deprecated; use `omitByValue`**\n-   `omitFalsy<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined | '' | 0>'>`\n-   `omitUndefined<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, undefined>`\n-   `omitFalsyEntries(obj: object): object` **deprecated; use `omitFalsy`**\n-   `omitUndefinedEntries(obj: object): object` **deprecated; use `omitUndefined`**\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `StringCounter`\n-   `ValidationResult`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-alpha.11","dist":{"shasum":"6d8e77f3fdc33addd05946ae418f00ec0f496f0a","integrity":"sha512-gX+pv02DtQmCVBpU4Oc5CfWEIPn5eFiW7/deq7B4kfK+K1NgOi5dxTl+JXBNYq4bsvR4IV9sB3P10FlPiBWqiA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-alpha.11.tgz","fileCount":250,"unpackedSize":170865,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgnhWsCRA9TVsSAnZWagAABYYQAI4iJ/um1wfEGNS9gjnp\nywTHEr3nSSs/TqT5jP/M1PoW/GtRFTQUm1EnLXFpV/HMK5FJyBIPQv3h23Si\ntl+5Pd58FG4+yCKSV2U/C4tcVYVFdeYZD/zeXzCaazmAZtBQhtOsn8AVoFnB\n8aCJQsXKnvEcEqUSFDgtxQ7pSzG12vI2H2Y2MEg0JEWhtpjwpjE0/iQgAnDY\nwCSiiU3cVXmIarenBY6TE79yX8AM6bmvGbCXnueq79FrOO3Js9PFuXyYoUXd\nsiPWx+AoJYyX9lszE5z/rhRrd9s+tG+U3an8j8yrqRMhANC8r5IkHj1KJMIu\nAg0TZIy8SNSLVHu2yioc7osLfBDRg3FBAC1PJdajCOBF/+DjaOsaeGiSrC9K\n8yKOU1JzLiX3flR9QdgoxJcvnxN0qqeyxOKm47Oaw8sODLdCJG3b/b647AVL\n52m0vmy215mVyjo84SY3DpiL/jS9IajnREzG3bX9WtzRh1wFHq5N9+Jg9L1m\nzdWrjLR354GCyUCJJcKyJA30pG/Ftrpnolt/otbMYKUphKlTnc7Tk8KNi8BL\nv84TX/cmMsRg2eTZPKW++Kek7A17wPSoMsCCRbV2Ei7bTDinAgtDkReXe+IT\nEh5qnz/Ofy36VytpCFIKGSLzw1RuhnB9IsjhaOYd4rWKkQ60S/hBsBJr39K3\nxhla\r\n=js2P\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAgB7cm+bHLxnJvDBocUNEtTrHTMiRy4FI+IHftx8RyBAiEA18rWpsvKNZnqHxnlfxbM21+DCZn2NxPXrRH0M9c29pc="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-alpha.11_1620972971677_0.6639596345741117"},"_hasShrinkwrap":false},"4.0.0-alpha.12":{"name":"@skypilot/sugarbowl","version":"4.0.0-alpha.12","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3","type-fest":"^1.1.1"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitByValue<TValues, TValue extends TValues>(value: TValue, obj: Record<string, TValues>): Record<string, TValues>`\n-   `omitEmptyArrays<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, []>>`\n-   `omitEntriesByValue(value: any, obj: object): object` **deprecated; use `omitByValue`**\n-   `omitFalsy<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined | '' | 0>'>`\n-   `omitUndefined<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, undefined>`\n-   `omitFalsyEntries(obj: object): object` **deprecated; use `omitFalsy`**\n-   `omitUndefinedEntries(obj: object): object` **deprecated; use `omitUndefined`**\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `EventLog`\n-   `StringCounter`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-alpha.12","dist":{"shasum":"a298c94377544fab11fb4f7f6ba64c71ceca4e49","integrity":"sha512-TpPa6ngCrfEU95JTP2DsA25NUqSLyqw7DiLXOEKkAYE8zAXCH6iklKPOoXRcG4jrWqmbHPSyLlVqV3ASI9hh7A==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-alpha.12.tgz","fileCount":250,"unpackedSize":171954,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgoIlnCRA9TVsSAnZWagAAmNQQAINvobIJKONvtWmv+1TS\nhGjsRpspqd7RDzanZ1oHkle4sZ1EyASy0WiV0oz9LRq6HdClGSpD3l0zldZD\nUeLoCxAdPjEFP0j1JE7FR7WIgokNleHYCJDQEk2w3/9YMKC7wXDRyitA/Vzf\nhNqqxtm/hOIqA6gQ5Z4limbOHTR7qjqSdRZdK3ZesO502mmtGKg8xOPZtoQY\n1qrMnfJoUT9vlCCElZDgLbO4Q8GqMr8HZG4oD8z3SYF2DxLNm70lovShM4s4\niPi78HyO5ylGAO+K5gKlyGyXlSyBz/FYl3BvxrsHn+q/SpTQemVp2OZOiFUs\nggAHes6QbOLd8mfy5nPvc/ihgNiw4r/YKAmQ+Tr2D7UX3ojwGZt36uxpICuW\np4aiPXZdg+yOj2r9fAFSRdkAp9XOV9/FBBws+HhJ6ashF/UwO8WeY5IIWzRH\nRLV/JfB34vKAhkk7y6XT2GN/hjSAl/iZiZJIgh629/hOacMg0DjEhjm+TNN+\nSzqTrSC1NO6iCLFJJyPRFPNGI108RggCJZ+0yj27+NOA4deS71Dpb4yX3yLj\nxgDeMdfSBwTMnpdvUoCjvysBmjz7b6NaPA2rNeIGUhQVD2ZMwDdgWGjw9+nt\nThaqlA9/gNm1rx7Lxnp8cYXl7iGjarJwvTkFLtdsHQeD6EOmqs3xn5lpaniB\nxwcf\r\n=cFsY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDXmIgliKhiYIICGUSNYgr5cVmOUhiA9DsP3HCFkQ5vmQIgP759skCRm4nMZhfD2+ShnhMUKcnHjDuYHgBA8HFYwEE="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-alpha.12_1621133670968_0.19035401240942829"},"_hasShrinkwrap":false},"4.0.0-alpha.13":{"name":"@skypilot/sugarbowl","version":"4.0.0-alpha.13","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3","type-fest":"^1.1.1"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitByValue<TValues, TValue extends TValues>(value: TValue, obj: Record<string, TValues>): Record<string, TValues>`\n-   `omitEmptyArrays<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, []>>`\n-   `omitEntriesByValue(value: any, obj: object): object` **deprecated; use `omitByValue`**\n-   `omitFalsy<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined | '' | 0>'>`\n-   `omitUndefined<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, undefined>`\n-   `omitFalsyEntries(obj: object): object` **deprecated; use `omitFalsy`**\n-   `omitUndefinedEntries(obj: object): object` **deprecated; use `omitUndefined`**\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `EventLog`\n-   `StringCounter`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-alpha.13","dist":{"shasum":"899b49dedfbfb13b7e49fad988c2f67eafe8923c","integrity":"sha512-J3AiMpUWUeb5fAiEzd6puNKRc4OWVtQ/b75/ucRJm+xv+A9y6Aa1kvvE8jbeJ5nHG+Q1zfjJUsP5+ECVzEQhSQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-alpha.13.tgz","fileCount":250,"unpackedSize":171971,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgoTo/CRA9TVsSAnZWagAACmwQAJFp7byirLeoBcfvK1bT\nS3LCiyDEQTg7fCdyzqEkOQ3TV+BEjLvc0KDIBCWaqay4SBfm5NRgwDeDkGmK\nrA7Ehg5QUnj3yg1F2gH/bdq2Gjm0+EgQjkDfw8kl9UddH9Y8RRdX6Odp5XQf\nhSbXfgsLeZW9PtraUEolYxTS6qMB82z1AbzkLGIaKSVhYmgqDrlbg0+oWATn\nVjepQrFU7eTQsPJ1MxmGihaJqmmZsNA0R4Tm7YKPuGu6ZzKitpCw6jjx+JBn\nU4ijinIEiHGAW+pmZ7+Z2x/NkrKDGVQ8lRQ67ZKHax285EAterIWSegXc+vi\nRNzuETjgWyj/R1RgcUB3zZ+WbuE33itHAbDmwVEQLnSZ4rb65MuRKLP5fE6d\nitLchsr9RGnF1yZauKnuDAUHlZKZKE+0WyoIjiJ4/g8imnqAkYfICRVppxJR\nlg/NDg7yKdioaOeghkd7gGPZ9jTxVWY88derVWQCDA1GYfqT28BY598D/2/S\nKNn64mYN0o4g9R9YRjdPi1n9IJS43xfLfATW+1djdOWtKC0FPJdI4wauSw2q\nLhhGQWNL700zBVAie3BPmIzFrFsASCV+6R2z3g8m6gBUVNRMEDkNao8nLPsJ\n24+HGO7IkAgGPmBeuHlbx2ECC9GbjkJwJujehXjW48z0NTjvd1hjWFJQHt4F\nVxwB\r\n=ixY6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC2aza7sBgarj6gwdwf/MrkJWR+9w4I6uBtEYgl211jGQIhAL5dfTfnSlKtaiApgNdhbgqU7Tm2nEAtGS6Re7ptBaC8"}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-alpha.13_1621178943364_0.8568698456888699"},"_hasShrinkwrap":false},"4.0.0-alpha.14":{"name":"@skypilot/sugarbowl","version":"4.0.0-alpha.14","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3","type-fest":"^1.1.1"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitByValue<TValues, TValue extends TValues>(value: TValue, obj: Record<string, TValues>): Record<string, TValues>`\n-   `omitEmptyArrays<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, []>>`\n-   `omitEntriesByValue(value: any, obj: object): object` **deprecated; use `omitByValue`**\n-   `omitFalsy<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined | '' | 0>'>`\n-   `omitUndefined<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, undefined>`\n-   `omitFalsyEntries(obj: object): object` **deprecated; use `omitFalsy`**\n-   `omitUndefinedEntries(obj: object): object` **deprecated; use `omitUndefined`**\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `EventLog`\n-   `StringCounter`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-alpha.14","dist":{"shasum":"6ddd79dce096b0cf48b890d1cbcd563fe0f0bc46","integrity":"sha512-oGz2m37ASea+zm2DgU8CWU76Y5UAiC/h9245FOHDwE29dmFuggnm8e9qkLMa+RTxxDVOF+ysjaiGW32wZF9lWg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-alpha.14.tgz","fileCount":250,"unpackedSize":172012,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgoUd8CRA9TVsSAnZWagAAqSgP/iQGc1JM+w9JuXlE7Soh\n0C5k4XY3UyswYaRlNx3VKpZIMk/lFaAFZzgb2PXue+tYHxs5SYnHAGXsroEn\nXYXIr3FFiOuZy8KLNA2U3sq4ryTRFdKUz9jeLXOLiHwND4euRRdOlebCFH8E\nrb8yDRXQ24G7wd6Sd67NhQ+ITI4GHNGlBU2QDZKFQbp+aCeKZYF+hBY6sXn0\n0lBZV2KV/BMLfYteBQg6NGG3pU4+Glb+3aoeIa+gBV/j2eg0IeenNeukqQqF\nHwD+XaIseglh0oxyJOT7VwUPQY6FBXcXp56/l9QM6KyRcydOnbI2Bw+RVh+D\nzQ2WuQNjrrr6pY9DLPXU7KkvcTP0RZnthnvder3zcQtf1RQB90/PDjtLFejS\n+kBwd/SyqMjenBd+7mARmeIzOSJbwJgWfFOZEdixL+xcTn/jHAguJ9pVXyo4\nRI+3TfWbl5s7MSiDc34HOt91oDQBLetqhdHaXmN4ZYdrCFFe6qGRcmD4to5Q\nkHBlfzfQhZng/3jYlFUMaVNhR3KI4rUzNZ3IacpHajaq8gzw3QGOFk/1fJmt\nG8KkzLKy0n3JXQYYAjiKVYBpazJr+uTAR+KjN2CzwLW7FGb3YhhKCtL93ia5\n8vggDwpmwMPOBhzexYPc0QaN2sa2T1l+EABedhrsw+7bLV7nPDCfMYjH6TFG\n6oIU\r\n=e+Nb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFnS86iChkF1G/q0CZ1DqFB9K6EmHyikzV1Al2LvIdz+AiEAzSU/qntpYZcJvah8swS+jYWvSGWaTN9x9M1LmkLTR/4="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-alpha.14_1621182331626_0.48367310932205787"},"_hasShrinkwrap":false},"4.0.0-alpha.15":{"name":"@skypilot/sugarbowl","version":"4.0.0-alpha.15","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3","type-fest":"^1.1.1"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitByValue<TValues, TValue extends TValues>(value: TValue, obj: Record<string, TValues>): Record<string, TValues>`\n-   `omitEmptyArrays<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, []>>`\n-   `omitEntriesByValue(value: any, obj: object): object` **deprecated; use `omitByValue`**\n-   `omitFalsy<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined | '' | 0>'>`\n-   `omitUndefined<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, undefined>`\n-   `omitFalsyEntries(obj: object): object` **deprecated; use `omitFalsy`**\n-   `omitUndefinedEntries(obj: object): object` **deprecated; use `omitUndefined`**\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `EventLog`\n-   `StringCounter`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-alpha.15","dist":{"shasum":"34a47ea88a82b63f23f8b279e12ac69a386bead3","integrity":"sha512-3attlHaerK5rhgowP9tV6OotXLogrUteUgvMJVOe/wfFmOgtg13Jyn5UXxd/k7RM9sO0qoQ7CqUWM09jALkiIA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-alpha.15.tgz","fileCount":250,"unpackedSize":172124,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgoVaWCRA9TVsSAnZWagAAM80P/js4we4jSsd1ki7c3pL3\nTJkL8nEnLJpZYiDZSVJ2gymNmbzz1dUMPxjQIqNNZbOiHoUDUTjPehZFusjY\nvJJPGQxe/RbsY0ZzPt8NWufqIkPmMH59+J9NUX/B9q3yj+zF8bWhRf4qV5Tp\nIbcDhtBRTS3U1i4Z2z35h1odMAVqWUOgBuGRQ3xqxSEgAmAkGQDhW2cF8iDk\nM359sUHSex4mOE+q15L50btrjHdBZtKfFfvvWoVInSXSqBdZ9tfrxIVKr2Zf\nsDqTOkxCVqHwor/23a2kaJb2u416PcyH3ZWUWTGd5ccjbOGhASNc5pBq/lW2\njdir7KSMcBYsi0EVRJSY9JaG17if3nf9fIWGF+ycKgqko0l+2HrGsw1aAxdX\nw3CqmXcvLpwpEhmlOnq9jBn+l9rLjregrbZQqmrgn2VwdM9npYo04wTFHqeJ\nUVtLps0OSvGa/CgOhI6CacwI7973Kfwu4cdpf3GYdx4MdkO531BgtQHxVO+5\nOUByx3oWbi91OJ0kHM0XwBsIU/xI5ncwtUTCiKzgF0QMyGmPCglkneVhuvrq\niJEcIuRSQMZSvqT9YuNuepRbNpCrealNNvrq2Dxay9Le5VissIW7BNOFO78Q\nnbq0b0Wx83gIutzpoikusRKZlyOKZTanhti2vFRD0aEsVVRE2iXcH/bzO4aq\ndXZo\r\n=eA1S\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCSJPpkbMct1uqHVuZk0RZdhuJNgK6N6VWoy+WFiVN+AgIgQkneAsaJ1lM/KUMTMc6Qns3mRWh+zU3e35ZnuZFF0qU="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-alpha.15_1621186197317_0.4401952331960808"},"_hasShrinkwrap":false},"4.0.0-alpha.16":{"name":"@skypilot/sugarbowl","version":"4.0.0-alpha.16","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3","type-fest":"^1.1.1"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitByValue<TValues, TValue extends TValues>(value: TValue, obj: Record<string, TValues>): Record<string, TValues>`\n-   `omitEmpty<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {} | []>>`\n-   `omitEmptyArrays<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, []>>`\n-   `omitEmptyObjects<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {}>>`\n-   `omitEntriesByValue(value: any, obj: object): object` **deprecated; use `omitByValue`**\n-   `omitFalsy<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined | '' | 0>'>`\n-   `omitUndefined<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, undefined>`\n-   `omitFalsyEntries(obj: object): object` **deprecated; use `omitFalsy`**\n-   `omitUndefinedEntries(obj: object): object` **deprecated; use `omitUndefined`**\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `EventLog`\n-   `StringCounter`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-alpha.16","dist":{"shasum":"d81f542a38034a30eab8022f26ad9966e13ffc80","integrity":"sha512-nfN7LKDB0KUmNfPI4ny58uEcDrJyeJj54kw36GN/aM+XCUXV0S1g0JzBFi88MA+sBwECKFGmekcSeFFuSUFfNg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-alpha.16.tgz","fileCount":254,"unpackedSize":176626,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgof5dCRA9TVsSAnZWagAAAzUP/0q9X/QSW8zzIdJ/YZKP\nKj4hNxOUBweH7HdM71R96IaYwXp3WffihLiJC8QkR+RUkoURSGZEGNP+E1Bd\nAtsYDVe5ebKgFUpzwARl/IOwUTwQDGLDlXJE1n6dSTQiXkvOyTi2BfWKt/8o\nsygjqzrmZKDSGDj2mELkc8DBmD5dTODBiPygPsiVBjjPWCcdce2z1F4W74wd\nFeoNuhD24kb9ylig7O8lLyxTzd2n48yH28tbyHOO78RZcv/WhFx4Zy/ItOyE\na6chYy6sT0yVkJIqDXMZRH9MqNcDeEc7UpFyVQQNf9A88YnCJtfIagh1OIKQ\n9+YTXK+38OqBIcvMoxt1SfwTR1qYvFfChle0hYLYJdnIJ8BT2fGA7mB/Bx6t\nSLUerHdiQRSw/eyF44ZiEc8ZPExnxpubsv3vmP+2BZ3RvoMdLHf6Yy7s4QFM\nv9xKWNNm4g8vbvZ0yLvmmZg3gH2F0jL8NWJommgIHx+DIboa4qXdrGVyW+RH\nInOX+1g6GAOiESG9hSM4jaj4VXkTobB6O7+5Pz8m8NDRMUj63IKMm0AZK++I\nNQNJE1lHel2z0mxlTzGp0iONs+DXwxmTc3MgW6ia8Ku9jbOXQRJ0q7Sl7/Xu\nytQilwFcCOfmapiLBgekDPu1DZJZgeMOvDuX4QwtpDQaYOGCwzV0Pm3GSYbn\nuLNj\r\n=jT6d\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCItiDUSH7XbacBoy4owUH+PW87HGs6J9EmoEC0HCumIwIgShTZuXuldcIIhzzWncoGFr53W0zLab+YK6YVthmToLw="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-alpha.16_1621229149324_0.8586000301061678"},"_hasShrinkwrap":false},"4.0.0-alpha.17":{"name":"@skypilot/sugarbowl","version":"4.0.0-alpha.17","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3","type-fest":"^1.1.1"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitByValue<TValues, TValue extends TValues>(value: TValue, obj: Record<string, TValues>): Record<string, TValues>`\n-   `omitEmpty<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {} | []>>`\n-   `omitEmptyArrays<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, []>>`\n-   `omitEmptyObjects<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {}>>`\n-   `omitEntriesByValue(value: any, obj: object): object` **deprecated; use `omitByValue`**\n-   `omitFalsy<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined | '' | 0>'>`\n-   `omitUndefined<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, undefined>`\n-   `omitFalsyEntries(obj: object): object` **deprecated; use `omitFalsy`**\n-   `omitUndefinedEntries(obj: object): object` **deprecated; use `omitUndefined`**\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `EventLog`\n-   `StringCounter`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-alpha.17","dist":{"shasum":"f46ec3af1a94e1d7a8d73fccd18a246ba9e14f3c","integrity":"sha512-wYayQ+Fch2bpv9oi9E1tMVcQaoERopQKEpAgKZKk1YbhOQe5VKOw8OKykCiWecGyiuJApACRz2wM50nKbYOsNA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-alpha.17.tgz","fileCount":254,"unpackedSize":176695,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgog/2CRA9TVsSAnZWagAAIkoQAJfDikorbI+nLyyIpvTr\nrw8ZENFUc78o/BhAdhPrCBjyKRs/c/VIyr1HvEP5z3b/jmYppWS3ViFmaEfG\noo6vj01+Nn3Nvr1+KM/pV8+EF/xoKJRYp93yH+zNCFxzjqoUCC4nDUKGcelM\nCId7Wn7hFNP93IS/FvvdRL/05ymupeKR+epJtwagpYLpVkqaO6zKQRK5iAcJ\ncctBxG/h+SO85VZX+abXcXUPkbb3iQvgC3qJ+hRqiQ1JsBQyQfNiIhHSLwPN\nVQKogiUVKrigx9O0/0xo1XLe3p4ye3A4nm94jGSsTc2ijW30T/55G/PkLEEh\n3Inz5rN9kEpmgy+DZZFfd11HYq6HfDVRggfbKdI9TP6BjuEroFHBXKMSujcE\n4LW6QLQVpT/ZuKA7lHWKXMgQfT2IUkkxATRcsh4qBKmp9+NdZeza8sC/uNrv\nfhKK3ArMsGMyKvM45kXpatjstXXItFj5N/mn9RMIZFptI+l9e3ZSFfIbtfJ1\n4bNA4rY7gmj2E4RGCLHy3ubYWmkFEPfs9tfPojBXqPdqEPJxEQSyD0hxVYGk\nzxPdWT6z4CfrVWSD4JqXZ7qjZQgSvUuEesOjMUXo70EE0ome6G54+wqDPgUO\nNFD9M2BbVTymbKtPDK9nEh9wrlaS1J3eHYau1fCZRW8YX6I7Hki7Zh8p7fM3\njSBU\r\n=V3cI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG16KFF+iL69Otc/OAkslkIyZYAZpGd8Axy5upLXW4HRAiEA9ENk9N4psJGGmLTPtnB2Cv6pSZKIFWJQFyPT7QoUie8="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-alpha.17_1621233653590_0.8064810402548628"},"_hasShrinkwrap":false},"4.0.0-alpha.18":{"name":"@skypilot/sugarbowl","version":"4.0.0-alpha.18","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3","type-fest":"^1.1.1"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitByValue<TValues, TValue extends TValues>(value: TValue, obj: Record<string, TValues>): Record<string, TValues>`\n-   `omitEmpty<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {} | []>>`\n-   `omitEmptyArrays<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, []>>`\n-   `omitEmptyObjects<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {}>>`\n-   `omitEntriesByValue(value: any, obj: object): object` **deprecated; use `omitByValue`**\n-   `omitFalsy<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined | '' | 0>'>`\n-   `omitUndefined<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, undefined>`\n-   `omitFalsyEntries(obj: object): object` **deprecated; use `omitFalsy`**\n-   `omitUndefinedEntries(obj: object): object` **deprecated; use `omitUndefined`**\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `EventLog`\n-   `StringCounter`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-alpha.18","dist":{"shasum":"5bc92bfbd4fe66c43f02e1ccb620b9adff4a2b89","integrity":"sha512-sskM9RE0jvqrBvGqSzSm+B48TWeEieITkO0/j+xIIhmL1nvNXwacoK9qzvg4GSVMXK6KASMAcS3w3T9I8otrjQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-alpha.18.tgz","fileCount":254,"unpackedSize":177144,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgokuiCRA9TVsSAnZWagAAlhYP/1jkS0zDaekZhw1hkrFI\nquNOHLzprPoCi4bdfH4gNGeIzBl+sQtgSE6lHP2EIr91opgg/TEYsPaN8bSG\nC6jz13lZi0J62pTuVvpNDzM2F/PSBZvGuI/kNExsfSZeosYO2zzbWlJTa30G\n9aA374n6wOWZ5ZuAf1CuYgAzTd52+dvEeHH5SzQlXvNzNOe9z+CTrxh4fYnQ\nl/xYUsELSXlzcNW9t64ukZL/60bZp5ULH6HDAPLqNNiJNIYNocArSt6K725K\n3wlUt+RoK87rj/GxkjWr8PV7MyyZ0TCoQ7i3WoUWyUAPAPBWVEUnBHo0T0et\nsS0vMFJ13EzmE4V+fV61WSsmv1KRPoJjkz3ntwgArxv5hFy/pP787ERXdZDn\nQqQfXuobcM3GAGFGRMi62VHJNF/5IhGueO8mlWzyvmlMjzJlWncLYYqsWgNc\n4P9ygL6zXslYlyrMHLnCJHK2+2+soVueU5yzE9cny48Qa58dL6TZ4prGwC8d\nRraQPYDzp/hZnkA5fMxjDfeOu9VFKwv5QLx8YeHmDS3UM9g7FXuLPkK+W3Ud\n3woYPM/619XkCPYH6+fW5VPG4JUXlWGbtbcI0pu/Id5xmW80FSE0yn2idFkk\nyPi+YhcyA+vmH6ynaWdAcPaCpLZWIhN62QyWhBg1nLL9JhV3MBOKXj4PbxE+\neMiO\r\n=gXBN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIB5vLvDwIX1S4y6pFiUkMxjzvBl09arREr4AYLUJTBAkAiAe3Ncr4ZD0g14a3WDee9H2nV6l89/ff+YT/itF69RmCw=="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-alpha.18_1621248929828_0.8999436596588792"},"_hasShrinkwrap":false},"4.0.0-alpha.19":{"name":"@skypilot/sugarbowl","version":"4.0.0-alpha.19","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3","type-fest":"^1.1.1"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitByValue<TValues, TValue extends TValues>(value: TValue, obj: Record<string, TValues>): Record<string, TValues>`\n-   `omitEmpty<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {} | []>>`\n-   `omitEmptyArrays<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, []>>`\n-   `omitEmptyObjects<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {}>>`\n-   `omitEntriesByValue(value: any, obj: object): object` **deprecated; use `omitByValue`**\n-   `omitFalsy<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined | '' | 0>'>`\n-   `omitUndefined<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, undefined>`\n-   `omitFalsyEntries(obj: object): object` **deprecated; use `omitFalsy`**\n-   `omitUndefinedEntries(obj: object): object` **deprecated; use `omitUndefined`**\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `EventLog`\n-   `StringCounter`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-alpha.19","dist":{"shasum":"ef0a03f88cd059b1477158b9ff0173656ee408eb","integrity":"sha512-qOCU7LLPTelaHtzDx7MHd3KvsdmBJ463eJAAXIX35v3b8PQ0CX7KP5tHMJ4VctsmOpwtX4GFCzNB4VSNNVf6Sw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-alpha.19.tgz","fileCount":254,"unpackedSize":177789,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgommjCRA9TVsSAnZWagAAucwP/2VNxohJjOzECPuf+mWi\nnuvmNoilWERlQNVaHM7J7oJkIduw0HelAWUNOTT2D/z5dttDA4YMcAWBfXKh\nYFg5M1eu5VbUntp2lWKKoL5Sxxtyym7mpDAW90R6sz/YLcZHDaO1DLiDca50\n+yrMAf2mQOrjkyAcazZ+mVyT63vvqnOZj8x4kwjotleMtOd/sL+4dU9HklY9\nhEyyHvVVmgPBICMWzGWyQBsK0qNU5iKE+R3pEqajz+0MEyG7EhypkM3hPwps\nQ1GEwYztusZn8QrgXEDSJMpZkWSc7F1DtK2as5Yve5xT2omGqQ9GTSE3fSmg\nviSc2pBbzYfMJR/5BuGyQuB08iEnHtxo1qdaC3KlO5yJ+qbbHc7R3+x0L/Da\nulhFWUfCuf6u+Hs866cQY7ve1BeA26nG2cbCaqGDxnVrwqWAgaGpnL17oCve\ns4fM+3HyAkhJ9lG34/wET8unW3CDvW3qq2Ni3xYjJCAJj/NHksqCcQnfOouG\nwjnlr46tR8AKOA4G9TybpAMjdrAxAtMcYL5KWNICLFjyLVtfacm3kPlk5m35\nHGQL6hkOUu9bxH0WdCZuIQkS0H8zGzboJ6KxgjnsbfXG6qw5QAQQuojiYBnx\n8hh2crcdHY+wyTSDm7nQiOmhbNdGmHRAUaD5EndeJXAa840wtyL+a1Ne9B+m\n3oUx\r\n=mvfu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICAhX3rieCW7LDoo816w4wMYoUaGPgYlivKyxXXjji4aAiEAvSTfnS0VzC8skcfPz75fGq8qiPOHheyo3DooQINHO4w="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-alpha.19_1621256610187_0.1803781894677463"},"_hasShrinkwrap":false},"4.0.0-alpha.20":{"name":"@skypilot/sugarbowl","version":"4.0.0-alpha.20","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3","type-fest":"^1.1.1"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitByValue<TValues, TValue extends TValues>(value: TValue, obj: Record<string, TValues>): Record<string, TValues>`\n-   `omitEmpty<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {} | []>>`\n-   `omitEmptyArrays<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, []>>`\n-   `omitEmptyObjects<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {}>>`\n-   `omitEntriesByValue(value: any, obj: object): object` **deprecated; use `omitByValue`**\n-   `omitFalsy<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined | '' | 0>'>`\n-   `omitUndefined<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, undefined>`\n-   `omitFalsyEntries(obj: object): object` **deprecated; use `omitFalsy`**\n-   `omitUndefinedEntries(obj: object): object` **deprecated; use `omitUndefined`**\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `EventLog`\n-   `StringCounter`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-alpha.20","dist":{"shasum":"4e6cc9dfbe9a5a415b8658d18ea1785c89d784f3","integrity":"sha512-6rXxVpCkMaTHljLeHH9O5l0xpzXNlJDOIm7mhURWVHdgI55PZqD8QdUAI3rxagH7o7CgHCc+FUPmxbJJCUjnLw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-alpha.20.tgz","fileCount":254,"unpackedSize":177785,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgo683CRA9TVsSAnZWagAAjzwP/iQJve8cSqQ+IEz5gSeF\nIBsVOVmP+wLScl9GVn2n8TugEfMQ8zFU01lqiBEPtTqefs759zGEVFlDG+fF\n+i3tVcuIps6Mk4U/wOm9eLx8AZ4+wc/q9tj96nGC2uuwLGdzkts4zmCGwDv3\nGp0vlnckmNV45EOC+y33BVSR8H3wOCnjV2+Sv3qlOjzjk6Mn9mx1CzdvVW9X\nCOFN6U/QFhdT3qUR6xo4A8HkYpo5AuSWlcDULjl+bsUJPvHvnc9rxtzEi2nW\npA7lwqbBI3W/L/NcEnxmjq8GciaFuOa9dww9HyeInnJNZqUEUm66joVQBM7j\nVtRC/1J4dnSx7citratuqDzsjVuydAiVil2lLmXCjcIJrcOl5CpSeoxEHPkn\nmPnev5UNUWulzTa6dMQuResoTWCYDwYz19kZl27zJ4fJbxdcf2CuTxsA31lv\nu+5iSIiRAEX7IDIrPqm5oJSOLoHNDJWZskoClXjZz23RH5X3BG5eRiDdiCWd\n7irutOCA/phnDQGKAjHecbTX+bvM4AXE5FLRa3+R5G1LLtiLd8HEeuPC9OQa\nHQnSmRs2A3555v1lTmPM+76zT9KIEJ8fK0orhbbGJ+sZ0Q9gaGN8wvAtL+cf\nGZ6Xoy/+pxhJjKBWIHPTHGL/tVOT2bUGoIn4nbNZMrS9weFJtGE2IJdVHVvB\n5v85\r\n=pZHS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE+E4SWEToUVLmPCacuiO+9kS+Pg1Vz4vbmCUK7t0im2AiAINjaU78WBR7rF92QHrLYBpGpm2XbBuvhmKSYHIzB33Q=="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-alpha.20_1621339958747_0.11533437642331479"},"_hasShrinkwrap":false},"4.0.0-alpha.21":{"name":"@skypilot/sugarbowl","version":"4.0.0-alpha.21","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3","type-fest":"^1.1.1"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `sliceToIndices(startAt: Integer | undefined, stopBefore: Integer | undefined): [Integer, Integer]`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitByValue<TValues, TValue extends TValues>(value: TValue, obj: Record<string, TValues>): Record<string, TValues>`\n-   `omitEmpty<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {} | []>>`\n-   `omitEmptyArrays<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, []>>`\n-   `omitEmptyObjects<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {}>>`\n-   `omitEntriesByValue(value: any, obj: object): object` **deprecated; use `omitByValue`**\n-   `omitFalsy<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined | '' | 0>'>`\n-   `omitUndefined<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, undefined>`\n-   `omitFalsyEntries(obj: object): object` **deprecated; use `omitFalsy`**\n-   `omitUndefinedEntries(obj: object): object` **deprecated; use `omitUndefined`**\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `EventLog`\n-   `StringCounter`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-alpha.21","dist":{"shasum":"c2baebdb2f61432e2e8f7e3419fd624f9ab47bc9","integrity":"sha512-CcxftmnfVodUINNyg0u0/eQW2vqS2Ku7LJA93v+NQzI74R3L5b/lLYGeufSgpOcAgZseT0JPPrU12iE8ShBmVg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-alpha.21.tgz","fileCount":256,"unpackedSize":179245,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgpKXtCRA9TVsSAnZWagAAgoIP/02JR78W2nu51yrX2XXP\nDsxoNciVqxWR2wUZI0/LM6Q82Rbb5THb1besXam+aGtxMfpZYIhVAnFTk/1I\naOX7qTW00AJDNktFGnNhHKY5y7jOPHaINoEdc2jKiG+JepDRBotewf88pgqE\nqXvFcWXm05eilOPfk/x+e8aeF83pmu+sQEKh/xPIJYzfVV4TBmmAap+Eaqhd\njbSqGpqOUV9yXUvSaxfj3FKb4y+mJVMVJt0KFB6U3wUIq+xXMMzj7WhWBy+i\nDKjgpBtSlxeaiP/5Qg1ZubWiMXGzmYmOY1rtjqVO36d6GeQg3/Ujzex7OXqv\nt33w1OnePJT44zDZAQwgdNWc420sDumNpkJykEIE8LFM3sDHbiZq77s/0XW2\njEUeiO2bO3nKVfQ/tNsp13+s4NJRIccC08V7rtCxESZuAdVSAiQPnmCqO+P/\nyvAOPy5wmAqBFBNPeXl0hA6bShI0JpvrvjuHSiQUKhzaCkNc3F6L7nV3c3ao\nDdgcYo9Sxg/SHEHTUfQTk/T8zb2WJS52TDPFO6vc93tP8PTDSPHoycHRpDzp\nOlh9xTphaEy24Ysk7Z20C6A3BMHVw4IsKBCyWLiGuv/8qd/V8TgZfBYNUDV1\nHrCdw5WUMM8Tfq9Fr04GYBpbBY6BtWVq3KnLAzDQEgqzA0zr16vMpCpM8/KD\nGJyq\r\n=WRS+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDdTJGIJdtb4Y55lTfxanfY+qPbCvcIErq8/QjGyJLOggIgMNwJ1+v1mmf1Do3V7LDBTX++iU4OXNVquTjT+jakxBM="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-alpha.21_1621403116493_0.8758508579310464"},"_hasShrinkwrap":false},"4.0.0-alpha.22":{"name":"@skypilot/sugarbowl","version":"4.0.0-alpha.22","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3","type-fest":"^1.1.1"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `sliceToIndices(startAt: Integer | undefined, stopBefore: Integer | undefined): [Integer, Integer]`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitByValue<TValues, TValue extends TValues>(value: TValue, obj: Record<string, TValues>): Record<string, TValues>`\n-   `omitEmpty<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {} | []>>`\n-   `omitEmptyArrays<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, []>>`\n-   `omitEmptyObjects<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {}>>`\n-   `omitEntriesByValue(value: any, obj: object): object` **deprecated; use `omitByValue`**\n-   `omitFalsy<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined | '' | 0>'>`\n-   `omitUndefined<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, undefined>`\n-   `omitFalsyEntries(obj: object): object` **deprecated; use `omitFalsy`**\n-   `omitUndefinedEntries(obj: object): object` **deprecated; use `omitUndefined`**\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `EventLog`\n-   `StringCounter`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-alpha.22","dist":{"shasum":"125d9a70aaa983817d62cb1f6213c87ff1c83495","integrity":"sha512-AuXlv8hhDUzPY7mzB52KAv4LQ+i6jMGsJ2JaAZQGH3hK6SoriTt7AHim8A15Ziu0IypoYia8OlPZJr9NtynQtA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-alpha.22.tgz","fileCount":256,"unpackedSize":179484,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgpKysCRA9TVsSAnZWagAA0pUP/0CFREOv6WUulIyKxLHo\n7upRohAla3pdhsX1yl8vgSkN6jtSDmtbXnwFKaNAoTmcJUy3n3CzGH+vLENc\n8sstHJYIew/3VIMDvJxnmKOe0M50AVFJ8iCLmLhG0ujszNfOG1KqPu9UW/6C\nY4FYY3RcO+LEpNX5YQ0dI3seCYYKVebI7y3Khly0m0kT61mF0Wkzn8yI6oJn\nlGhSk+nd+L6Gpvo/32RBk2UK/s0gArleDgzAaQ2YdLxcJ8r0BArZ7CmmCVJw\nC76D61ajskpQzskxk6Xn+9bLrHLB1HjilUdtolZFdKpG/iI8QCVwIGhVnAqD\nkoXQmaQ28KJm0WV2Osi4spM7i1s2A6bC4mLA6jts1gvvcF66sQr4gTiHSkLf\nXPBSxPiH3+OEKHNWiPfupk4I6I8Sr4/7JHkz0Lu/VDCZ0Ze3iiXOlCEqvX3k\nTpiqHZfVTzt8tcLEza8WSJqoMZVSWvcOlCLuZHTFU1csvanZ6R/WytlmU6s4\nyUjHaVKlBX7KTWd30vR8shfkuvDUo/tpXS7qpI47m3pVzd71wkIoQeW+XXfH\nP6FZx2xFI8GT1aKJlqKs4wSztr+u7jRh8aT0ty3qnPvcVm6jdv0tulpYbH8K\n2Jiktcs06cxb6fYp3LCD+ihsWSAb2G/hvO67qos3Wwy/4La/MtrQarFvv3zX\nJNhe\r\n=NUUp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICM0BZYsk3G24xVp0le9MQ0yEa5eTFSGF35/f2xY1fxZAiEAimlMYQeaXQAwqV29DYP2D1TynQDED5P8IarH6h41g4M="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-alpha.22_1621404844023_0.7362988453150467"},"_hasShrinkwrap":false},"4.0.0-alpha.23":{"name":"@skypilot/sugarbowl","version":"4.0.0-alpha.23","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3","type-fest":"^1.1.1"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `sliceToIndices(startAt: Integer | undefined, stopBefore: Integer | undefined): [Integer, Integer]`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitByValue<TValues, TValue extends TValues>(value: TValue, obj: Record<string, TValues>): Record<string, TValues>`\n-   `omitEmpty<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {} | []>>`\n-   `omitEmptyArrays<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, []>>`\n-   `omitEmptyObjects<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {}>>`\n-   `omitEntriesByValue(value: any, obj: object): object` **deprecated; use `omitByValue`**\n-   `omitFalsy<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined | '' | 0>'>`\n-   `omitUndefined<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, undefined>`\n-   `omitFalsyEntries(obj: object): object` **deprecated; use `omitFalsy`**\n-   `omitUndefinedEntries(obj: object): object` **deprecated; use `omitUndefined`**\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `EventLog`\n-   `StringCounter`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-alpha.23","dist":{"shasum":"5d5790c4ce8a39692dc58f00bcf7ef9efee71e63","integrity":"sha512-GPi6+uPV447c346hLAXB4emT9aUHUe7Ja3OvCsxKDWFNaAQppHdZ8mMb6d75hi1ugOHkmeJq6PKrTupC7yJcQA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-alpha.23.tgz","fileCount":256,"unpackedSize":179551,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgpL0DCRA9TVsSAnZWagAA4igP/AoxhhyDjPkokJK7z0EZ\nCUJOczlWMJOWAm9sD/HSKtg7QnvwjjdEZ0gj6zRkmUy/Kq146/BAPRa4Fu81\nYuelRll9ZtpAGbDt2BXn3/wnfinM2FmInflyp64DbQfduZNc3Kgfhiv1vnQR\nK/hruSPg4Y6nSSVsVts6ufOt0s8G2F82kcvN5nar5abbNXd3XVpaPOH1N0iZ\nj/9GFtZG65P46vX/W6qXIUeQXUS9x/Hs8biV/O9h0IOv3ydamD9KboxoDvvP\nlIxPiIqXWqimHyvOIsMUtO84rlLzmDnrmlQU6AqAaRPUaIt27/R6mwsIfmh6\nePG+aYCs/bvA/WyqTlB1HE2b9fouJQmzGwRdOUqMW+qhKRIv3DEMOVFVTgnY\nWBbk5p8YDxj8pamqiLlCRVag/7FAwiHcUyT8gs1U2bhyEt+5aA8DNQ7IdY5a\najRFuJp3QZKUWT+uyTp2aHv5hMt7kxn24MYtPNDZ/iy/s9X7T+cx1JkOhCdQ\nhQ/4cFg32H95Y9sdPQQuds5q+mzgakaZtgb2rqGq9JNGUxJhJrVYTfMsfVal\ndT3vf7WFUMXMg8Tn4uTQvKDm2iNK8NVm13Zo/uyts9cbLQpvqUjIp6hmVdYH\nSqC/JpHL2rGGifkbzLWOtMQwvTv/HNvHqWA6jVu9+dScsMRVvO7mUOuVJAul\nmAgx\r\n=caRi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDdAG1JNF51OZd0YARDXMJLlS3rQtHbZy868Pt2OsUnswIgMoy7cNuIXWoxmAQg4ZyTeHU+JG47gpZevzGlMuuY9gU="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-alpha.23_1621409027011_0.8691181876082879"},"_hasShrinkwrap":false},"4.0.0-alpha.24":{"name":"@skypilot/sugarbowl","version":"4.0.0-alpha.24","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3","type-fest":"^1.1.1"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `sliceToIndices(startAt: Integer | undefined, stopBefore: Integer | undefined): [Integer, Integer]`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitByValue<TValues, TValue extends TValues>(value: TValue, obj: Record<string, TValues>): Record<string, TValues>`\n-   `omitEmpty<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {} | []>>`\n-   `omitEmptyArrays<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, []>>`\n-   `omitEmptyObjects<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {}>>`\n-   `omitEntriesByValue(value: any, obj: object): object` **deprecated; use `omitByValue`**\n-   `omitFalsy<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined | '' | 0>'>`\n-   `omitUndefined<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, undefined>`\n-   `omitFalsyEntries(obj: object): object` **deprecated; use `omitFalsy`**\n-   `omitUndefinedEntries(obj: object): object` **deprecated; use `omitUndefined`**\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `EventLog`\n-   `StringCounter`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-alpha.24","dist":{"shasum":"ff209ac3af4fd8b2db4ba0f0cb9ef556575b40a6","integrity":"sha512-F2xlpDnPzKZsc2A0JsNShrE1nWIQsLYS4xMlZLq9oNOQjxz0sUYgIgurnGdaS/BoNs5VN76fOEUP76oxtABPWw==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-alpha.24.tgz","fileCount":256,"unpackedSize":180042,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgq91/CRA9TVsSAnZWagAA/hQP+wc0N2M4Xsg3bFqnq/pF\nDzMBK/FQR/kmTdcWLdsgpktwCdHC1UJl0CUWqF6zPDX/AgAxFPQdDfDre/hY\niVPLEdnxDEZfMsZ2WkXjWzlomyr2FLb+5cDkL+laAlQ4MCj1JhTJt2yFdHNr\n4bV+ZJXR/sr2/haNvmcb45Zkf780MKsIa+8vAmqYhPGfjAo8oLCHvnu/uWRB\nHMKq+hU02pUmkhdSS3R9sK5p9pqDgByvAD3yJOuCHZpi9wex3PL7bjJCrPsC\n7IhO3s90PdU82tstM0wUHFovjA/KM11rgNtPkBo06lXbs10eIFJzUzOgivZa\n6QvTA38DBkWEGpHhG3c2F8xVOW2XQUbw9J6tIibAWJj02oxXi4rj+2zZ3Ew5\nJAF8X0ZrRCh6BH8zr5KjbqcNeU8VbiSc/X208lJA6vOW7r6mrRM7hvj/FzlD\nkkNGO4uXkZV1qNN359E4MQM8dq5Cooa8w86z5mmsFTfs2VkXGAf6lXAbI19S\nDW1x8zpif6i2ZfeRT21pVKNf1PnmADbI/T3f1zFcVinXHUhTAO0ittyTGRyG\nO/tgwX60mIL1k0JFSkPABhdPZuF9VSSMNjqLrY4XTtyKJ+hqfBbvAI8VokEz\nQHLAJsJEsAaflPwZqeCuAt3IJltOEB6EhWwbaOkF8Xk2XAGjLxxwCnTo6HRd\nRTQl\r\n=nSNC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD4anSHIwm1TNDnGaPPjb/m5BSsBxmlLk8RM7xj40XtXwIhAJzBkxLrzcvoIxAq1SEtTwUpCZ9eoC7xAtnR43smYtF/"}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-alpha.24_1621876095063_0.6637736847367783"},"_hasShrinkwrap":false},"4.0.0-alpha.25":{"name":"@skypilot/sugarbowl","version":"4.0.0-alpha.25","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3","type-fest":"^1.1.1"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `resolveSlice(startAt: Integer | undefined, stopBefore: Integer | undefined): [Integer, Integer]`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitByValue<TValues, TValue extends TValues>(value: TValue, obj: Record<string, TValues>): Record<string, TValues>`\n-   `omitEmpty<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {} | []>>`\n-   `omitEmptyArrays<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, []>>`\n-   `omitEmptyObjects<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {}>>`\n-   `omitEntriesByValue(value: any, obj: object): object` **deprecated; use `omitByValue`**\n-   `omitFalsy<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined | '' | 0>'>`\n-   `omitUndefined<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, undefined>`\n-   `omitFalsyEntries(obj: object): object` **deprecated; use `omitFalsy`**\n-   `omitUndefinedEntries(obj: object): object` **deprecated; use `omitUndefined`**\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `EventLog`\n-   `StringCounter`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-alpha.25","dist":{"shasum":"7c430b6ec017df7e0dc01107965b8ba6f130be47","integrity":"sha512-YXaaxrXzTB4TTvF/gHGHXpYqVIXY9uEceIk4X0vY0/o47Bf3jO68si0RRAeTdTzxjouVLq6STG9sZyQ2jLoz0g==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-alpha.25.tgz","fileCount":256,"unpackedSize":180625,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgq99YCRA9TVsSAnZWagAAuHIP/3CHlUrs/pcW64yJaH7M\nW7Q/Jt+QS9WWOwVaPY5HiIkNWev8p6bW8M8BgQ8s+iTJlNSg8d+EDZfc89xf\nI1BDtsc/EquvIyzQscuyU9VXou9Hlmi+EVfsowAEzfI41mR3jrmfH5V6KfsN\n9MbNUQD+DeJP0w8O28KXd5kGydROKIxAkAsg63jTeDFGqE5ERjMKRVakshKh\nldpHAhoaYLQRzqc1exOWANaE0rckqBMqvO/fHX/mayAvq3+gB9XAIBRVxxb1\nQpWSDPnoLiqSNoDgg+YYuUuEdZS4sCcqTVKwtLQGOB40LjY2W+apLbM/OVdm\nKo5v992sCNZzY3sL8Zw/YPnPFlqtmiyv4EZwjYZJQ/uOO7l0CzEubyevVf+X\nW1UlUSM1JwnUP2Ky69fBdlVX9UH8WcmHUmczhtPgVoqI+/0PzZoOtgJFXf3V\ngmgcPzJyBplGflfQqTbsuGtwGiUcK68jZwxAzMEUAAX49BUHs0MuEYJHx2X+\nqteziZiEpjhlfmPKWp91HMM41BRoVKww5xvyU1/vM3dbqBW0fE8LFPVvhwrj\nSaI1AFYfXTKjCSa2Mkxn/OYC7XBbyi4jZ3dMrksMZfzc5Jgf/VQqSL9RsDco\nT0fepui4RN290OMI0elQs3sQuZkCaxhPBJrdyxNuOGKqHb3azsfkD2fkl0Lz\nF9ej\r\n=87pG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHqZ8XtHdeyvcUg4+hD0xkU9ngq3od3MBeNvSAzL/++CAiA8HtuXhuaLJhFjRfkf5gpUzFjEhoy7cuyrvfnpUH7hlA=="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-alpha.25_1621876567604_0.04407665789731552"},"_hasShrinkwrap":false},"4.0.0-alpha.26":{"name":"@skypilot/sugarbowl","version":"4.0.0-alpha.26","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3","type-fest":"^1.1.1"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `resolveSlice(startAt: Integer | undefined, stopBefore: Integer | undefined): [Integer, Integer]`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitByValue<TValues, TValue extends TValues>(value: TValue, obj: Record<string, TValues>): Record<string, TValues>`\n-   `omitEmpty<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {} | []>>`\n-   `omitEmptyArrays<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, []>>`\n-   `omitEmptyObjects<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {}>>`\n-   `omitEntriesByValue(value: any, obj: object): object` **deprecated; use `omitByValue`**\n-   `omitFalsy<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined | '' | 0>'>`\n-   `omitUndefined<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, undefined>`\n-   `omitFalsyEntries(obj: object): object` **deprecated; use `omitFalsy`**\n-   `omitUndefinedEntries(obj: object): object` **deprecated; use `omitUndefined`**\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `EventLog`\n-   `StringCounter`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-alpha.26","dist":{"shasum":"f674b3a754f8d344639b2f202830d4e61033c45a","integrity":"sha512-4Stf98hQsJC/IcnTiqUxy6Rv78CtARLv9iIL6tOXx3eX9jcXFHVxKB9gOehgrcCBjsZXJFT9XoaQB/wQ0vCY3Q==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-alpha.26.tgz","fileCount":256,"unpackedSize":180627,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgrYVGCRA9TVsSAnZWagAAL2IP+wbU57tY3XNO0Xkdvc0J\nCY9t08/93ANOpZM/NnVUbtFDDN2IrOBJT60zTCkFmA3bcep/vECEvWKY3q/x\nrA3GkJU50DzpvQRZmec2SjQWnJh54OWV0zinS816t9If3yvPq0tPnT0ywUOY\nwMkkkxUPLxL+8Kcej/nlkKZ28VxRCrucxXEgQooFl3JM9awU3s6ssHbVHc20\nhenyUZwlgvMpQtCU0x1PhHfdAVPhh0Ky6CGnYSvmwRUHjLg/8zyj6hN/LNUx\nOVti9BG0N1WeXXhnybmPIgsF5+azGOR6k5NruWAyVa0vc2FV4tpHHaXntZjF\nOzG+MrlBWrIRjnRwdzwDlP9S0Pza+AqrN0qrlm/mXYRc9oFcSGcSHnJ7TJ+l\nkxLfm9Zp2AKw0hXQbBbed9m8pDyMhKR/DSzAcvg6Y9811BCoyhon+YlWKOqe\n0PbuahgNx9EKZg01EvGKu3o+5chj/wlgQY81ebvVW3OHQBPRh93MT07zlOzj\ncanLqviYzcTq4reGbzmPt++hofUfTF6zV34r6z+gdVuX3AgJE2k8G8KRwXzz\nOQ2FIoONHaVjjPBCTC1JxLMkAwtBUPJH8uqJ+ukWjtIRfe1CYFvYCttbra5G\n4E+fArcaol97LlgYtYMgbm3PES02o201qi7OCUyfaWYFW2W/3uCXr686eJOs\n01iB\r\n=kI3B\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICQa2j4hmNDx4QM8gKw+gcR5XhX0RuHMKjFB16mJR/2oAiBYWiTn7bEFkzbIUhpk2/w+7nD70oAmbMQKVPQKVwQoqg=="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-alpha.26_1621984582112_0.5926290600060109"},"_hasShrinkwrap":false},"4.0.0-alpha.27":{"name":"@skypilot/sugarbowl","version":"4.0.0-alpha.27","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3","type-fest":"^1.1.3"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `resolveSlice(startAt: Integer | undefined, stopBefore: Integer | undefined): [Integer, Integer]`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitByValue<TValues, TValue extends TValues>(value: TValue, obj: Record<string, TValues>): Record<string, TValues>`\n-   `omitEmpty<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {} | []>>`\n-   `omitEmptyArrays<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, []>>`\n-   `omitEmptyObjects<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {}>>`\n-   `omitEntriesByValue(value: any, obj: object): object` **deprecated; use `omitByValue`**\n-   `omitFalsy<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined | '' | 0>'>`\n-   `omitNulls<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null>`\n-   `omitUndefined<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, undefined>`\n-   `omitFalsyEntries(obj: object): object` **deprecated; use `omitFalsy`**\n-   `omitUndefinedEntries(obj: object): object` **deprecated; use `omitUndefined`**\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `EventLog`\n-   `StringCounter`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-alpha.27","dist":{"shasum":"4443bfbaf7f7ade1eb3fbc4d74ac977915d16be6","integrity":"sha512-yg7JpOC+CV0cGEQmx/fvDpsXZcGfCGhsdlnfzuPQuFX5JNxhz0B4zr5mIABfvlo48NTMnSsnTKUuddrAmg9QtA==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-alpha.27.tgz","fileCount":258,"unpackedSize":182951,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgsafTCRA9TVsSAnZWagAADbYP/RjPZNQK7gANsQf/XrZk\ndFnZZ6RUEzMgUCypybUeabe+6CdK8858uGDt46ZPAs5Es82CGetZvKhv5c+s\nXG0cIJMDt+yXwjhS+dDfUR2cDTr2cLBA6nazoq+wg3Pu4R+kRqiiqZdb8NGH\nRL8ZZ5gnKROzRnefQRQQEN9zSwOLUIJVGQW1r3/NRtfOiElK+MEeNJ0zTsNm\nj7hWnfecshAOueaY5BPFBr8hDY7NDEq4StW71xGvcXeq8F/nJCfBse/RtFh8\nIB3/EnGea3LAkQ6VEznHmVZ3ogHDDN9AL9i6QNfqEKdvNDlqOWiVsn/FumC2\n/05RdHNd+o7RCn7Ne1zyC3nPucoV0y7L4FUzSljZXEdxW3F3ibcIKMvd78Yc\n4KGXwu5WAnDeo6cmn+KPidRn7LQm3IVCS/esvrUZ4qG9satfHNCu8TLaMd+s\nq2W29kXFldveeO4tnumag60gBbxUURNTlfHxjZkRwF0m6LeJcvXPEh5kbb3X\npGgeKE5IC2U0HyhNgeVdLWHbz0Yjq6P8hK61dX7gXe/IpRhV7XjCZ/GnVEGj\n2zZVb5HNXDL81N47bhgrfmzwc+8QXuLeewBHFioJkg0gEysAaCkchuP7Rj2U\nBzBujTWh444jtIm8IZ2mFfNBDZcimCErp+hZYcMj/ZmxQTlwh+qIQyO3PwAk\n50w+\r\n=Uldq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCYdaBc9iYh30wLNHMgG1T/6j+dcl6wW2ILoWgFziZDEgIhAMzAGxDcqfEQRFCLNYj3QupojYaYN2plTu5qYmfukaTA"}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-alpha.27_1622255570568_0.09756872483529966"},"_hasShrinkwrap":false},"4.0.0-next.2":{"name":"@skypilot/sugarbowl","version":"4.0.0-next.2","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3","type-fest":"^1.1.3"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `resolveSlice(startAt: Integer | undefined, stopBefore: Integer | undefined): [Integer, Integer]`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitByValue<TValues, TValue extends TValues>(value: TValue, obj: Record<string, TValues>): Record<string, TValues>`\n-   `omitEmpty<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {} | []>>`\n-   `omitEmptyArrays<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, []>>`\n-   `omitEmptyObjects<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {}>>`\n-   `omitEntriesByValue(value: any, obj: object): object` **deprecated; use `omitByValue`**\n-   `omitFalsy<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined | '' | 0>'>`\n-   `omitNulls<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null>`\n-   `omitUndefined<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, undefined>`\n-   `omitFalsyEntries(obj: object): object` **deprecated; use `omitFalsy`**\n-   `omitUndefinedEntries(obj: object): object` **deprecated; use `omitUndefined`**\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `EventLog`\n-   `StringCounter`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-next.2","dist":{"shasum":"65b8873bf089c8278a64b4bad154c7646f59f78a","integrity":"sha512-FdC3ZmozMN6ap+rLtu7BWNs57ENVHBSMKb5R3r4tXohG9ZFagofr6xZebm5S9PYFZeGVdXEwSOl77NKjZcyiSQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-next.2.tgz","fileCount":258,"unpackedSize":182949,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgsahVCRA9TVsSAnZWagAARBAP/1PlCGkzO8sxzTdnPzEa\ng0g2q4QjfRi2bJwCB6VQvYVcJI79W5JWGbbelNLzNDuBUsk3dL21U2Ia9WRt\n4c3qfnydWdhHyYrJZHWdj4Hm2xHSXvpJr1GuzUU50Itn491k2DXueJjrQ4Qp\ncbLltlTU+x2jq3WVoMfNJMrqYCW0jiTByhIj0RH9G/oT1aTT4Mg8/mZYK3OX\nL3ha/Ah+S7KcaINKXqJAASVeYpl4E9ILO1eFu1vAf0aNGtcwGSVQupIGaIYw\n1ynDFDXYy7XoL3gD0V9wypc3E2YI/SnLlYsQC852LqL1secX+e94Jtqb/zGx\n0GDAPa/CjEGdmaqleQmlxy9OXGR3lnW19YnpFAlcADuUh6eakNK6islCby2E\nn0TXXaMfS7RGkRrTlylj4FaHc8wNs+YzKAPriJx6+16H98QXWOkVrdW/Lytr\ngXjVx080peZ/Yprs5a1V3iLLw9KfSfV7Dj6Y+6iU/iXh7/OGYVxKwNh+4zn/\nZHfxJedHXKFFvvPNPd3hlRvT8dTRHcJUDiiX5koywHgWZr/9Y8rol7qwJkP7\nxAao2EGgRF2KwD++VnC6lV0/3zK6E5sdp34bET4XHdp8TpyNuj00CWDf8acG\nEdDmGKCXFwAS4k5W+lc/UQZ9S8Xj5L4RH6XyZyBlI9B/bMd4Ox7XX3hyFmkG\n3A7m\r\n=9gF9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQClQVzOuhLosHyE0UWfTqUtVz1UXv98uqzMBV7lmX6JjgIgdB42E1N8Iyi6bu/phMCb5ijSEPGpW4yB1bLzRD5jgac="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-next.2_1622255701034_0.8324408569914596"},"_hasShrinkwrap":false},"4.0.0-next.3":{"name":"@skypilot/sugarbowl","version":"4.0.0-next.3","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3","type-fest":"^1.1.3"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `resolveSlice(startAt: Integer | undefined, stopBefore: Integer | undefined): [Integer, Integer]`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitByValue<TValues, TValue extends TValues>(value: TValue, obj: Record<string, TValues>): Record<string, TValues>`\n-   `omitEmpty<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {} | []>>`\n-   `omitEmptyArrays<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, []>>`\n-   `omitEmptyObjects<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {}>>`\n-   `omitEntriesByValue(value: any, obj: object): object` **deprecated; use `omitByValue`**\n-   `omitFalsy<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined | '' | 0>'>`\n-   `omitNulls<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null>`\n-   `omitUndefined<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, undefined>`\n-   `omitFalsyEntries(obj: object): object` **deprecated; use `omitFalsy`**\n-   `omitUndefinedEntries(obj: object): object` **deprecated; use `omitUndefined`**\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `EventLog`\n-   `StringCounter`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-next.3","dist":{"shasum":"5e07695f197a673c38e0e0812668f49b4ee0a180","integrity":"sha512-v43dGkYDcZohvF/7+7iPbDVJVjYSvZ4HK9gnaVwkGFXHrtk0gzhIQjfUmSJgkgUt/nRU2J6G4L06EuV5OwLKWg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-next.3.tgz","fileCount":258,"unpackedSize":182949,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgsak+CRA9TVsSAnZWagAA+tIP/RF19CPC8siizeay2d88\nqEIS7PZcuWZBxXfAQLvvU3dbn0nROCKMaC7DYgmMXDk5cdzcwm4IAU0QHDgz\nxSTvAxR9R6JHdhUOT68+vA78YMfs0dV8pzEUV5YCu04a925RzARGAAYYo2Eg\n6XAruZ60uFHzgPl3HiqdpvvS4ytFa+bRgsjibt1HPLqWLbxcNfHsy1dNKyum\nzhgTTGD7Tw6VoHRvbD7lWmJSFPMjI4cJarF0+RiClkzgEFTEKLMf3yjOGy/q\nMB2rJySAsHbQ7XjMC5YtYHxibLNwjh5++LdI2Gl+xYMHCge0oSj0Cze6IZAm\n0O52e62mtm0zyED6VNvu4r7JscCRqRGf0mLUoguJnd+VtBhx5nAZ4fhsgkOG\nCbLx/kzVj7MqQqO0lYTBrdEPfK+Vci43oCLzVjnP2vwg99MpNnE6bM/xLzPr\ndON6ft/RW8dZHFKmJp9YSU2uHgAq3GetRD9J6lmfpog0/GmXEp77FiPnIVJ/\nV8T9jl9NWKTIutNQMeNC+mzI2s6AeTrQlYarIkG/+9GS6pZN+8spwkaZXTNx\nzfBi06kKi9Ql+vme9Bqyf3dYINEWziRKLbXZuuNSGInL55rMA4Y8vQLOiD0H\n99GtcErpqVJtP+pyqPOKZ0RdaoGCa/5EgiKcXQVeV9t2i3CUBkeKy6Q+PWOu\n3qH3\r\n=W4IY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDM9oVl4oQmu98pm137kTXu0F8oR4Fc4XKZDRpXs0bThAIhAJfIHuD013T5Jx0uncghYBK4PGAwu+ctKahf9CfqFxBA"}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-next.3_1622255934382_0.8875934361940874"},"_hasShrinkwrap":false},"4.0.0-next.4":{"name":"@skypilot/sugarbowl","version":"4.0.0-next.4","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3","type-fest":"^1.1.3"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `resolveSlice(startAt: Integer | undefined, stopBefore: Integer | undefined): [Integer, Integer]`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitByValue<TValues, TValue extends TValues>(value: TValue, obj: Record<string, TValues>): Record<string, TValues>`\n-   `omitEmpty<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {} | []>>`\n-   `omitEmptyArrays<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, []>>`\n-   `omitEmptyObjects<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {}>>`\n-   `omitEntriesByValue(value: any, obj: object): object` **deprecated; use `omitByValue`**\n-   `omitFalsy<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined | '' | 0>'>`\n-   `omitNulls<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null>`\n-   `omitUndefined<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, undefined>`\n-   `omitFalsyEntries(obj: object): object` **deprecated; use `omitFalsy`**\n-   `omitUndefinedEntries(obj: object): object` **deprecated; use `omitUndefined`**\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `EventLog`\n-   `StringCounter`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-next.4","dist":{"shasum":"24665ae3fafdfef4423d624bf44ae72cf9505452","integrity":"sha512-MFjGaIBt2YwJdf7gJ1fNI3nlDS2sCRjxgslLCjyuQzvBtmru5jvS68LzJM+Cvc++2IkFE0QYrlc+SE8kXwnvFQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-next.4.tgz","fileCount":258,"unpackedSize":182949,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgsa2pCRA9TVsSAnZWagAA04MP/1bWl18JRoNvmGnZJBlP\nM7CErkOI82mQmNXX7owSh4NhDlhDF3VR97REJHRqF84z3C4Mc/qjFqeQlqNs\nXMqkKDWQ3GJcucxsdmdmBy8DvNewwVvXjZ1xI9xL7QccPe+8ExrYhSYt8qTI\nC9bN6+hYLjFv8KmLUl3kxarbHCEfJV+EABuwcK16O8FQHlr80O5JCSSdV49T\nrPlUirIeXdd3qlR0mvfFc7K1wY7EBFqZ68VT2xUorbkgtn/mzjW3sa0cX5pU\nJeYXSY17ruNyGMEu5Ck0+j7N+adHki45Do8esRaJmNjU7FkdLNWAM6NhPrzt\nAny+pNkaY4FFixICOBobflq8WnhF9dpA8bcnw4qTJuCgQ2CTxvtLPDNFJrHX\nk+eKOHYjHjr8mgXMKEOhwil4LkbC9txLdp8g7slos257qmNXbEh5KZ1nAJYI\nqrA1Q30IQ/8jlPyMo7aAKd40MKqfBJWSvPgzfg8dQ1+8diYlKbYzBGrinECt\njuCQy+Px4z+uGb0IPbpo/wvzj4FmJuu00JJKYpoeTAgP3RB0EfncKedC/swE\neOFnf7AGGSWGABbPZBOjIfE3s97VMbodVvhof7ZzvJp6jbQkKe1g7uAHfITn\nfHEp7VwT5FQeqQfArdC+FAzSRbVcgv3r99CQ+7BWD13g6Zri/a+a/vqD3Fzw\nrgz3\r\n=yI2G\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCJgOZ0lA83GwMkvLFaKh8SCcPKckm+uWBuFvUv6AVunQIgAji68ZDce2XZ2y7YnK/3u9+ZQ7y6evSPYs2mRmBdrAI="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-next.4_1622257064892_0.3045040988048875"},"_hasShrinkwrap":false},"4.0.0-next.5":{"name":"@skypilot/sugarbowl","version":"4.0.0-next.5","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3","type-fest":"^1.1.3"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `resolveSlice(startAt: Integer | undefined, stopBefore: Integer | undefined): [Integer, Integer]`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitByValue<TValues, TValue extends TValues>(value: TValue, obj: Record<string, TValues>): Record<string, TValues>`\n-   `omitEmpty<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {} | []>>`\n-   `omitEmptyArrays<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, []>>`\n-   `omitEmptyObjects<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {}>>`\n-   `omitEntriesByValue(value: any, obj: object): object` **deprecated; use `omitByValue`**\n-   `omitFalsy<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined | '' | 0>'>`\n-   `omitNulls<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null>`\n-   `omitUndefined<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, undefined>`\n-   `omitFalsyEntries(obj: object): object` **deprecated; use `omitFalsy`**\n-   `omitUndefinedEntries(obj: object): object` **deprecated; use `omitUndefined`**\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `EventLog`\n-   `StringCounter`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-next.5","dist":{"shasum":"0497592b49e2fd1d35a50aed22851fb4b89150bf","integrity":"sha512-hc+ffZon83HwERWhZKuL8bWIdSFuQFNRdikuS7dO+huxvC8t7p+hwtcZRRo+ltX+OPErYGzMsaTNJ/aFNxFx9Q==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-next.5.tgz","fileCount":260,"unpackedSize":184258,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgspMgCRA9TVsSAnZWagAAxmgP/3uJ3DVoNO/yKEqqcdOR\nIUg8pxRR6B38/+XRSdF1ZduBcAFukKNN27cOOIYz0qYvM+Qm2k0n5JRi4UZ3\n82RQplxbI+tPYeRf0uTPAHKQJMeBjTD6/IXUJQujBAJy6pxe12udM9Ny6DCb\ndZEAZ0V3QZawMjE1WaIOofuK1fEopuG6z8B5n03idr6FkhYNBssF+nx8G+U7\nlyfg6I86VJu/jDmCQT/c/q3UVBMIg+IIdugrvs90SgUygIMVeUNG1t2aLhzF\nX6DO+pU3EsR88Hrtbi+nW4/ziTQKC0mXI+cOSal40fRj1adpKJwPWOak8TmO\nLsoQSKsfZtv/GUH195PcSHLRe58Ud7HLqmTTRgqIhntwBiBU238XrHyAgGu2\n+HSbuexB7YYsFVWXPIClSk+v/GLhPFg4BpeWNUjuflvtJw9rPxQvO90zbc7K\nGmeiPUaTGUSGNO9WBPiAbHJTPdk4gWwEpJLNm5jFpMXjKFbIBOYACmbncI2E\nrnmsWsmmh/lZcOUa8stxuvU4ybXpbNn8eLryzT2m3aygKABe2Nq0cTqhTb36\n8Ug3cX7awKD/uanLeu8lYGcfvxEDayKFFTi2Gw6Lc0U8F7fhmoIpokQdWD0E\nPMuCZrICDEaXKpPly31JuXVGwnSvzV+HPkh3vOdESQXOFVcukKegvRUkngEI\nfL7+\r\n=GIMf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG7nt3uw0PH8eHhWK+yW8WFT9eedQsI3wZS/juHP17P+AiAy4vhuKFFKgVNUuGLMeyyZJZTDtpSQqppO1OQqOrv0uw=="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-next.5_1622315807528_0.8269589651757112"},"_hasShrinkwrap":false},"4.0.0-alpha.28":{"name":"@skypilot/sugarbowl","version":"4.0.0-alpha.28","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3","type-fest":"^1.1.3"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `resolveSlice(startAt: Integer | undefined, stopBefore: Integer | undefined): [Integer, Integer]`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitByValue<TValues, TValue extends TValues>(value: TValue, obj: Record<string, TValues>): Record<string, TValues>`\n-   `omitEmpty<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {} | []>>`\n-   `omitEmptyArrays<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, []>>`\n-   `omitEmptyObjects<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {}>>`\n-   `omitEntriesByValue(value: any, obj: object): object` **deprecated; use `omitByValue`**\n-   `omitFalsy<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined | '' | 0>'>`\n-   `omitNulls<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null>`\n-   `omitUndefined<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, undefined>`\n-   `omitFalsyEntries(obj: object): object` **deprecated; use `omitFalsy`**\n-   `omitUndefinedEntries(obj: object): object` **deprecated; use `omitUndefined`**\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `EventLog`\n-   `StringCounter`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-alpha.28","dist":{"shasum":"e7dc4089f4fb177d093f3d494a02991987bacd40","integrity":"sha512-fp8/GSaF5w45joI5WzAlEeVNOgvbuUda8ghgNU+8vmQJXQ1cGpGAkbgBMnjyBgGbzwBB0EHtGG9Qtrn1RPwDQg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-alpha.28.tgz","fileCount":260,"unpackedSize":184260,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgstIhCRA9TVsSAnZWagAAHogP/AnH4c8hI7Q6bPmQxlQy\nX+/GV5Q6Rvra8bqia9RxkVGVKYnKIt35oZkA9l/TL4qHbyvWTuD/ze1B7gOi\ndBKVVO42Zs6JyBIrM7HREozKoTUsweLWO40Dl1dJ0RK/5TNXWQYZHZqGNMwt\nXnAEQlOdv3vP99Y9Cd8T5ksf14F+JfEtY2BWOKXlFegSzmqagsKriAE285P5\nQO/nCzeB1Lgc+AuIANYtngKt+hURp2MFuyU93OzCU0UKqItopT4b9Z9v5ahn\nM1ERoySavNz2Cp7EiBZOnFiMzJCT2R+S3yik7q3woPR94HlTrEPUYBK8aGUy\n/Zh6RHhNBypO1ExxCnwl5lqH7YsAeMSSBbnn7vU2Bnq+Aq3OAtmldiozljrT\n8Lol768aYebrONy9WbI6Lb4SrzEaIp56BCVlKCR3pP1/mvoXm/VEmzSkOdIF\nvTJEz1MSnCIEfh1n8V8NxGQuJN3d5YcpnikWD1xqoH1f0ZrHF6Ibkmpl7Qv9\nu2yFRP5gUlIh1NxWWMvvZ6vvCfrFDtT4fyOaiGn1PnObDw5X00/37yoW6TlX\ncA4KlcCtCHy6Pr/q+/1lvKZCPXf+v+PdV6l+pf9OGsjlsz9z8GalPjfoSlAe\nc5bVuoBdUs5D+dKvuxA2xGdK/3JOTcjaGP+vWikh19OVBBTKQg1K2/sz+xjb\ncBlv\r\n=ahn5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAH7hF59O5tlBInEt04hVfminogU2oQrzHFaHQXBrQeZAiAtwAVwIwTiCCNIhF9eOojByFH81Codo9hb0azuBgQqmQ=="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-alpha.28_1622331937378_0.9415140752092992"},"_hasShrinkwrap":false},"4.0.0-next.6":{"name":"@skypilot/sugarbowl","version":"4.0.0-next.6","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3","type-fest":"^1.1.3"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `resolveSlice(startAt: Integer | undefined, stopBefore: Integer | undefined): [Integer, Integer]`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitByValue<TValues, TValue extends TValues>(value: TValue, obj: Record<string, TValues>): Record<string, TValues>`\n-   `omitEmpty<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {} | []>>`\n-   `omitEmptyArrays<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, []>>`\n-   `omitEmptyObjects<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {}>>`\n-   `omitEntriesByValue(value: any, obj: object): object` **deprecated; use `omitByValue`**\n-   `omitFalsy<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined | '' | 0>'>`\n-   `omitNulls<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null>`\n-   `omitUndefined<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, undefined>`\n-   `omitFalsyEntries(obj: object): object` **deprecated; use `omitFalsy`**\n-   `omitUndefinedEntries(obj: object): object` **deprecated; use `omitUndefined`**\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `EventLog`\n-   `StringCounter`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-next.6","dist":{"shasum":"70284d54e03c924b47f05a08bb124257b3a9c86c","integrity":"sha512-mIzK17dnxH7O0irkcF+KEIHSWNbmnlf3c6rNJnHeEKVsyCkY3MUgBItR++8OGKFoVg11og7UKPYUNzXj0zmLng==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-next.6.tgz","fileCount":260,"unpackedSize":185676,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgstn8CRA9TVsSAnZWagAAgv8P/Ah6HOlDOiB12FpE+6nu\nEdyiYbaL8dODxbJ3xRU7Zc6vpcPk7jOcsDthwMlTB8xpWRzOr7WhZbDfueXH\ndBH0i6l+yQVKSa4jZlVskZhhDnOR63UOYUXrzKih/5E/cjLp6g2HvXlcnrcH\n5J2ENBhFqzp38nUbzEMUkXtGrbL1LpGCrB4ID+rbhEMYinR+4KQnCEtNRtf1\nZNH3C+Qgl1DANdWer04l0ydkB+kbeXeDZo8L56nBtFgXhP4VxuXlnYYm6h7G\ntNqt4CrPZJosFWzP3vd4W2DhlpHfXcgcxOf+A2XGZKcFdTAjeRNd1BFjHBrs\n9sZbWGatoJa0ObgOMe8P45M4oIMfoDIiP+lEJHax9R4xxtuVwOeuWYcZqQIe\nGHpTyjLC5vN3KwkdacanCS9xjOFCTp2VX0xUIDmxbIVFdjpHRrGVQXb6VZ46\nBGR9TaAxjfCLN2n3/9v6WOYSy2OraK7xE9ESRzVbtUmXM1B8xHWVNXqKZduF\n6PBV9o0LtfICzBdmzjcA+CMuCq3xqolPkkAx3KqIV0PhAejbXbsS8fvSxn3h\nw2iTdmu0OhiPcg5k2QNoNQF70OQ7CRvw9qwk8TxnN38TPzOIt/u89XGsVx41\nOI/FOUvckEP+OQIuRW57FBQXxZedfg25itrhmVeoutjlQTdYj9xA8RU0uCSl\nhDH6\r\n=Lzcz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDqgI5dLypiexOzba9h91k8ISm9IavaFWShDdr5NJmawwIgSGB9nmdeA138IkXFTATgVDFq5Jz2bSn4EgH/fK57euE="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-next.6_1622333948260_0.06340934143485577"},"_hasShrinkwrap":false},"4.0.0-next.7":{"name":"@skypilot/sugarbowl","version":"4.0.0-next.7","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3","type-fest":"^1.1.3"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `resolveSlice(startAt: Integer | undefined, stopBefore: Integer | undefined): [Integer, Integer]`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitByValue<TValues, TValue extends TValues>(value: TValue, obj: Record<string, TValues>): Record<string, TValues>`\n-   `omitEmpty<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {} | []>>`\n-   `omitEmptyArrays<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, []>>`\n-   `omitEmptyObjects<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {}>>`\n-   `omitEntriesByValue(value: any, obj: object): object` **deprecated; use `omitByValue`**\n-   `omitFalsy<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined | '' | 0>'>`\n-   `omitNulls<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null>`\n-   `omitUndefined<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, undefined>`\n-   `omitFalsyEntries(obj: object): object` **deprecated; use `omitFalsy`**\n-   `omitUndefinedEntries(obj: object): object` **deprecated; use `omitUndefined`**\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `EventLog`\n-   `StringCounter`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-next.7","dist":{"shasum":"099208663de15e3e38c4456dd41ccb427cb3a080","integrity":"sha512-lsRzlgLp97/e+Uf1VhxGMgnur+Oql1Orq2jH6leJFj+AjmecZ8Ez33iHPEj70JfsXxdrpRBH61h75ZnS4adoyQ==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-next.7.tgz","fileCount":260,"unpackedSize":185921,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgs7hfCRA9TVsSAnZWagAA+hMP/R5Ro0NWwuiMSzGbeVM8\nE7Eb26OdWhFqY6ue3/OuacvhZQDWVeg1H/FJixTfJm6MD0PKVyplRam/GxoW\nc+m/7oizQZZvLaTFm0d8l+J0GuOQFer+fGoHyfaQzaI89/X7r9fkG8nPrfZv\n8axxNPdjmQfilq6IregICToONUq695xvpLv8I+7tQ0esZWGWl1iBZmy0shpt\ncu+6agstoQYu9Ut2+du2sW719wuCJ7O2njKMWKmzlH7SE38QthVD+21ORTKu\nsMCPztXWXEHNnC/L8vpE6ssdU+zxaaCyji8Ygie6lW74T2ZLWP51f1cFG1rp\nQLu9ATrkDuQxHKhGQwIhvCMwNIpQW6plWBqobFh4WwOBhSmNWwpx2Eiu9LeE\nX+Rjt9CxSHxAMjTHKarsM4Vfko6h49/uQbRqTSrCrHhWuGyJDn+S41Ron754\n7Ar7D0EGx8mceYAwseSL0IRN7yZLZzUrkH2D5gAVkDVMPIoes6xyHfUHYGtp\nRfCoawMlZbCOPfYZxO0nQQg+wGnrtjbf+A2IPN6rvl28ius3WlPnvudU7gHk\ntQhy3euFHhVA3AUbQp+oIYFSOWsm+REoxpxvpRXho6D3ppQPhdyhrlOjM+Lo\nr0g1wOQxnUtHI15G6+X+00HW3yr65kWVU6KwDlceqNUVueTAK+TQMi63s5aq\n8Q/6\r\n=MvzO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDj1O4tI/pydqyCPqpyfBwHzQ8axZdopym8M8vhGTHAIwIgFqkxaTZW7LISvjT/BhrGzK7vetsUSVKKIUgucoqZqlM="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-next.7_1622390878728_0.861977452880778"},"_hasShrinkwrap":false},"4.0.0-next.8":{"name":"@skypilot/sugarbowl","version":"4.0.0-next.8","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3","type-fest":"^1.2.1"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `resolveSlice(startAt: Integer | undefined, stopBefore: Integer | undefined): [Integer, Integer]`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitByValue<TValues, TValue extends TValues>(value: TValue, obj: Record<string, TValues>): Record<string, TValues>`\n-   `omitEmpty<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {} | []>>`\n-   `omitEmptyArrays<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, []>>`\n-   `omitEmptyObjects<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {}>>`\n-   `omitEntriesByValue(value: any, obj: object): object` **deprecated; use `omitByValue`**\n-   `omitFalsy<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined | '' | 0>'>`\n-   `omitFalsyEntries(obj: object): object` **deprecated; use `omitFalsy`**\n-   `omitIndefinite<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined>`\n-   `omitNulls<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null>`\n-   `omitUndefined<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, undefined>`\n-   `omitUndefinedEntries(obj: object): object` **deprecated; use `omitUndefined`**\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `EventLog`\n-   `StringCounter`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-next.8","dist":{"shasum":"ad4e90d71e9c75bd461c02549f329c917e258480","integrity":"sha512-9UFm46lVCNRUA1F0LhsbOw1b1bP92roLfo8gpSFCwBUzXcVDmL+vMya4nEVkT+glGn7+lvgUP/t87yrI79mOMg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-next.8.tgz","fileCount":262,"unpackedSize":188198,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgzq1zCRA9TVsSAnZWagAA1rAP/3AIG5mUNxec8tCkmCxs\nYClLj1x0olCH3WK2LXtblms5LGANXJifTAtM+RAPtaC9C09XmVamfKfhsIHy\n+4JBoxczSZHoSsqSzhNg2xpok894LcMfi3xk9vgo2RelkYES0fM5NDu9jcxc\nWuIUL82MoVYHV8g7UC4sM6re4JgfvQ2r2aLOEOVf208ROEFmCLwSiXpppd1H\nTzmqgyk1VK4h+m75kqISC2UyMVlYP/VCPA24URFj1hJiDT7qpUKK2CQ4wDuF\nKfcjAshxWu1VHENjXLC4wromnT0SgvkaCjIZbe7iFVxTUNS00APKfdNqoKfx\nZdZ+8pxMOMInAj5S1GFpnhdKcU1vMXx3nYhCUmyhG6S+osTdznz2FW/5sz9e\nZ9aewzHS+SK2B34AV8do5hXWFKdzId23zNr3iUL3Bm7eImnEKZT7HMUsOKs2\nzH+l92cWRTJRR90+CnJ1hopfR6f3ke55w0PvDKu2yaFDYes+oNDefHrkrfFE\n7bIW8r1rY7G6+rLngwW5JCO/cxw2aOMaavt+LtRnc2/Z88bEsmfjY7mblZPR\nOTl83gVe4jddwwuCctZJwP/HnnMIpab/WhIhFTeXYSyHTbJCwXs6aXd0DGWo\nSjOcZZvyGyLs89nfIOBtnoJnlCGjK64hflXRvPmtZ4m0YR9AOruUqThfNvro\nn/0b\r\n=wrlI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEzgfVeJDC5kuRzrHDfYqUkhXaA7f4UgayVSt4YR/PqMAiEAgtI6urznsBBf4ucx4tPOV2VfoRNbvwaV9mp0sffSY68="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-next.8_1624157554749_0.5822943333529103"},"_hasShrinkwrap":false},"4.0.0-next.9":{"name":"@skypilot/sugarbowl","version":"4.0.0-next.9","description":"A collection of convenience functions for JavaScript & TypeScript","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"homepage":"https://github.com/skypilot-dev/sugarbowl#readme","bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"license":"ISC","author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"all-ci-checks":"yarn run all-cq-checks && yarn run build","all-cq-checks":"yarn run typecheck && yarn run lint --quiet && yarn test","build":"rm -rf lib && yarn run compile-ts","check-types":"tsc","ci":"yarn run all-ci-checks","compile-ts":"babel ./src --out-dir ./lib --extensions .ts --ignore '**/__tests__/*' --ignore '**/*.d.ts' && yarn run generate-typings","cq":"yarn run all-cq-checks","ct":"yarn run check-types","generate-typings":"tsc --project tsconfig.generate-typings.json","lint":"eslint --cache '**/*.{js,ts}'","prepublishOnly":"yarn run typecheck && yarn run lint --quiet && yarn test && yarn run build","publish:default":"yarn publish --non-interactive","tc":"yarn run typecheck","test":"jest --config jest.standalone.config.js","test:all":"jest --config jest.config.js","test:int":"jest --config jest.integration.config.js","typecheck":"tsc"},"dependencies":{"json-beautify":"^1.1.1"},"devDependencies":{"@skypilot/common-types":"^2.3.0","@skypilot/toolchain":"^5.2.3","type-fest":"^1.2.1"},"engines":{"node":">=12.13.0"},"publishConfig":{"access":"public"},"readmeFilename":"README.md","readme":"# @skypilot/sugarbowl\n\n[![npm stable](https://img.shields.io/npm/v/@skypilot/sugarbowl?label=stable)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![stable build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Stable%20release?label=stable%20build)\n[![npm next](https://img.shields.io/npm/v/@skypilot/sugarbowl/next?label=next)](https://www.npmjs.com/package/@skypilot/sugarbowl)\n![next build](https://img.shields.io/github/workflow/status/skypilot-dev/sugarbowl/Prerelease?branch=next&label=next%20build)\n![Codacy grade](https://img.shields.io/codacy/grade/218540d35b43406f802719cd8af93a10)\n![downloads](https://img.shields.io/npm/dm/@skypilot/sugarbowl)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nA collection of typed convenience functions for JavaScript & TypeScript.\n\nAll functions are typed, and it is expected that they will be used only in\ntype-checked code. This keeps the functions lightweight: they do not\ncarry the overhead of checking argument types or handling type coercion.\n\n## Exports\n\n### Array functions\n\n-   `flatten`\n-   `getDuplicates`\n-   `getFirstIntersection`\n-   `getIntersection`\n-   `getLastItem`\n-   `includeIf`\n-   `includes`\n-   `omitSequentialDuplicateItems<I>(array: I[], { evaluate? }): I[]`\n-   `pagesToIndices`\n-   `pickRandomItem`\n-   `pickRandomItems`\n-   `pushIf`\n-   `range(start: Integer, end: Integer): Integer[]`\n-   `shuffle`\n-   `resolveSlice(startAt: Integer | undefined, stopBefore: Integer | undefined): [Integer, Integer]`\n-   `toArray<T>(T | T[]): T[]`\n-   `toUniqueArray`\n\n#### Array-function factories\n\n-   `Slice(startAt?: Integer, stopBefore?: Integer)`\n\n### Date & time functions\n\n-   `isValidDate`\n-   `makeDateTimeStamp`\n-   `sleep`\n-   `slugifyDateTime`\n-   `toUnixTime(:Date, decimalPlaces?: Integer): number`\n-   `toUnixTime(timestampInMs: number, decimalPlaces?: Integer): number`\n-   `truncateIsoDateTime`\n\n### Filesystem functions\n\n-   `checkIsChildPath(targetPath: string | string[], referencePath: string | string[]): boolean`\n-   `checkIsInBoundary(targetPath: string | string[], boundaryPath: string | string[], scope): boolean`\n-   `composeFileName`\n-   `deleteFile` **Replaced by `deleteFileSync` in v4.0.0**\n-   `deleteFileSync`\n-   `findPackageFileDir`\n-   `findUpTree`\n-   `getFileSystemRoot`\n-   `listFilesSync`\n-   `makeTempDir`\n-   `readPackageFile` **Replaced by `readPackageFileSync` in v4.0.0**\n-   `readPackageFileSync`\n-   `safeWipe`\n-   `safeWipeSync`\n-   `toPath(pathLike: string | string[]): string`\n-   `wipeDir` **Removed in v4.0.0**\n-   `writeDataFile`\n-   `writePackageFile` **Replaced by `writePackageFileSync` in v4.0.0**\n-   `writePackageFileSync`\n\n### Higher-order functions\n\n-   `curry(fnToCurry: Function, ...args: any[]): Function`\n-   `extendFunction(fnToExtend: Function, ...extendingFns: Function[]): Function`\n-   `pipe(...fnsToPipe: Function[])`\n-   `toMapFunction(...itemFns: Function[]): Function`\n\n### Truthy/falsy/defined functions\n\n-   `isDefinite(value: T | null | undefined): value is T`\n-   `isIndefinite(value: unknown): value is null | undefined`\n-   `isNull(value: unknown): value is null`\n-   `isTruthy(value: T | Falsy): value is T`\n-   `isUndefined(value: unknown): value is undefined`\n\n### Input/output functions\n\n-   `consoleIf(:boolean): (message: string) => void`\n\n### Number functions\n\n-   `generateRandomInt(minValue: number, maxValue: number): Integer`\n-   `isInteger(value: any): boolean`\n-   `isNumeric(value: any): boolean`\n\n### Object functions\n\n-   `entriesToKeyedItems(key: string, obj: object)`\n-   `filterLeavesByKey(key: string, obj: object, options)`\n-   `getOrDefault(obj: object, key: string, default: any)`\n-   `isObject(value: any): boolean`\n-   `mergeIf(conditional: any, :object)`\n-   `omitByValue<TValues, TValue extends TValues>(value: TValue, obj: Record<string, TValues>): Record<string, TValues>`\n-   `omitEmpty<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {} | []>>`\n-   `omitEmptyArrays<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, []>>`\n-   `omitEmptyObjects<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, {}>>`\n-   `omitEntriesByValue(value: any, obj: object): object` **deprecated; use `omitByValue`**\n-   `omitFalsy<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined | '' | 0>'>`\n-   `omitFalsyEntries(obj: object): object` **deprecated; use `omitFalsy`**\n-   `omitIndefinite<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null | undefined>`\n-   `omitNulls<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, null>`\n-   `omitUndefined<TValues>(obj: Record<string, TValues>): Record<string, Exclude<TValues, undefined>`\n-   `omitUndefinedEntries(obj: object): object` **deprecated; use `omitUndefined`**\n-   `setValueByPath(path: string | string[], value: any, target: object, options?)`\n-   `swapKeysAndValues(obj: object): object`\n-   `TypedObject.entries(obj: object | Array | number | string): [key: string, value][]`\n-   `TypedObject.keys(obj: object | Array | number | string): string[]`\n\n### String functions\n\n-   `capitalizeAllWords(stringToCapitalize: string): string`\n-   `<code>capitalizeFirstWord(stringToCapitalize: string): string`\n-   `computeHash(stringToHash: string, length: Integer = 32): string`\n-   `countOccurrences(str: string, substring: string): Integer`\n-   `digitsOnly(stringToParse: string): string`\n-   `inflectByNumber(howMany: number, singular: string, plural?: string): string`\n-   `inflectQuantity(howMany: number, singular: string, plural?: string): string`\n-   `isEnclosed(stringToCheck: string, startDelimiter: string, endDelimiter?: string = startDelimiter): boolean`\n-   `nondigitsOnly(stringToParse: string): string`\n-   `parseInteger(stringToParse: string, options): Integer`\n-   `parseEnclosed(stringToParse: string, startDelimiter: string, endDelimiter: string = startDelimiter): string`\n-   `randomAlphanumeric(length: Integer): string`\n-   `removeExtraWhitespace(str: string): string`\n-   `removeWhitespace(str: string): string`\n-   `splitOnce(stringToSplit: string, splitter: string>): string[]`\n-   `startsWith(string: string, substring: string, startFromPosition: Integer = 0): boolean`\n\n### `String.prototype` wrappers\n\n-   `padEnd`\n-   `padStart`\n-   `toLowerCase`\n-   `toUpperCase`\n-   `trim`\n-   `trimLeft`\n-   `trimRight`\n\n### Test helpers\n\n-   `makeTestDir`\n-   `makeTestRunDir`\n-   `makeTestsDir`\n\n### Classes\n\n-   `Directory`\n-   `EventLog`\n-   `StringCounter`\n","licenseText":"\nThe ISC License\n\nCopyright (c) 2020 William Thorsen\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nThe software is provided \"as is\" and the author disclaims all warranties\nwith regard to this software including all implied warranties of\nmerchantability and fitness. In no event shall the author be liable for\nany special, direct, indirect, or consequential damages or any damages\nwhatsoever resulting from loss of use, data or profits, whether in an\naction of contract, negligence or other tortious action, arising out of or\nin connection with the use or performance of this software.\n","_id":"@skypilot/sugarbowl@4.0.0-next.9","dist":{"shasum":"72a34cdac5d576c47b7364767ca20e7f520e6e59","integrity":"sha512-NGgV+X9cboiWfYzqlJnjlqx4mwpMLj3pQtkLnC0QR1KjjIZF2NvUHLneFQ2EoH5meSe7X18FUgpm9JuRV0Ingg==","tarball":"https://registry.npmjs.org/@skypilot/sugarbowl/-/sugarbowl-4.0.0-next.9.tgz","fileCount":262,"unpackedSize":188198,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgzq4aCRA9TVsSAnZWagAAiSUP/iWmUyxdgclX7TAiB0Gm\nbyJ2K4ieu1NTHe0VAsAQruaCe/1VE8qihqzgVbee5GgAeXfgUdViLrq9f1aH\n7587lVda0zmhU+rGNfGiSi/z+ByQuU4NEloH1pcbbX+VK3PJsNEE6P2KA9Xp\nCXxwZZGlQpNtfDSlbNZkfnDnsjG5yDp5keOgBUOJ0IxIsmdgy2pd9IP3Z+FY\nLLrkCiLsdD7YRXIJvP463l05TL09/1H+eOkKtaU/qmodch8KBFcI8RNu3kjm\nA/Ngpe0LupuLV8XZk19IF/kWWhLXtfiuDRB2slhBuzRQVKOQ7mfO5s9WRyCI\n0Kiwj9dcM0DH1qmJz45cdiiMJv/giEfOttX87sAdrd9zDlrfM8vq2dUND1wt\nN0b481m6AmsnN8v+cfpVMzSqlTOxXjjCgK3do0qUbUaZMtETtnhCHrQKpgB+\ntFT1grNvladziUsl4reDE5oE04edCBS/vQ3rKsERnuTzHfD6ZLejBdMwJEsU\nYAjBMmfutyCgSpDiEIP+f7D/qTP71zqkAw6FyDmqJHstiHZxM6FdqyExO3il\nbB8ASLZio+EDBAZef3nNKH+NrHxDVB4CHnz1DzXc+k87RuYIfi6W51BcUUqZ\nhGKSCv8zOURiashPj8s3UV3H8bQg2T9iCYLN3bMaZhi3A10blFguZmJE/ONF\nup+T\r\n=LZV4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHp9PVEQgKdO9JA1Pe3udhbXeDOuyd9m91dul8Qv/oHrAiB6sOLnTWBnSR1FU7+EiRQwgUY++v9zH610Zza+uzaq6Q=="}]},"_npmUser":{"name":"williamthorsen","email":"wthorsen@skypilot.dev"},"directories":{},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sugarbowl_4.0.0-next.9_1624157721288_0.19913681664265792"},"_hasShrinkwrap":false}},"time":{"created":"2019-06-22T20:34:13.533Z","0.2.0":"2019-06-22T20:34:13.843Z","modified":"2022-04-07T00:06:18.205Z","0.3.0":"2019-06-23T17:30:08.756Z","0.3.1":"2019-06-23T18:05:34.648Z","0.3.2":"2019-06-23T19:54:06.052Z","0.4.0":"2019-06-24T18:43:57.664Z","0.4.1":"2019-06-24T19:03:03.108Z","0.5.0":"2019-07-06T17:29:59.192Z","0.6.0":"2019-07-07T16:14:23.824Z","0.6.3":"2019-07-14T23:58:22.674Z","0.6.4":"2019-07-24T19:23:31.982Z","0.7.0":"2019-08-02T23:20:26.257Z","0.7.1":"2019-08-09T17:21:46.632Z","0.8.0":"2019-08-10T17:44:44.529Z","0.10.0":"2019-08-16T13:17:17.910Z","0.10.2":"2019-11-01T16:05:36.234Z","0.10.3":"2019-11-03T04:02:48.023Z","0.10.5":"2019-11-18T20:40:48.123Z","0.10.6":"2019-11-18T22:40:42.600Z","0.10.7":"2019-11-18T23:06:12.260Z","0.10.8":"2019-11-20T01:09:58.148Z","0.10.9":"2019-11-20T01:29:24.082Z","0.11.0":"2019-11-23T15:44:06.413Z","0.12.0":"2019-11-24T03:34:18.137Z","0.12.1":"2019-11-27T23:46:25.536Z","1.0.0":"2019-12-01T00:31:43.628Z","1.1.0-beta":"2019-12-01T19:01:42.321Z","1.0.1":"2019-12-06T23:54:13.739Z","1.1.1-beta":"2019-12-13T20:00:08.476Z","1.2.0":"2020-01-07T21:02:44.183Z","1.2.1":"2020-01-07T21:09:59.512Z","1.3.0-beta":"2020-01-08T22:41:13.848Z","1.3.1":"2020-01-14T03:59:32.015Z","1.4.0-edge":"2020-01-14T19:47:58.105Z","1.4.1-edge":"2020-01-14T19:53:04.240Z","1.4.0-next.0":"2020-02-06T05:25:06.009Z","1.4.0-next.1":"2020-02-06T05:37:58.326Z","1.3.2":"2020-02-06T05:43:25.776Z","1.4.2":"2020-02-06T09:02:22.884Z","1.4.2-next.0":"2020-02-06T17:51:57.858Z","1.4.3":"2020-02-06T18:53:29.809Z","1.4.4-next.0":"2020-02-06T21:46:58.225Z","1.4.4":"2020-02-06T21:50:47.000Z","1.4.5-beta.0":"2020-02-10T10:33:59.611Z","1.5.0-next.0":"2020-02-11T01:16:05.200Z","1.5.0":"2020-02-11T01:18:18.118Z","1.5.1-next.0":"2020-03-12T03:31:35.172Z","1.5.1":"2020-03-12T03:50:09.041Z","1.5.2-next.0":"2020-03-14T16:25:11.021Z","1.5.2-next.1":"2020-03-14T16:26:46.562Z","1.5.2":"2020-03-14T16:28:59.739Z","1.6.0-next.0":"2020-03-27T22:53:11.149Z","1.6.0":"2020-03-27T22:57:39.992Z","1.7.0-next.0":"2020-04-05T13:53:58.749Z","1.7.0":"2020-04-05T13:57:36.964Z","1.7.1-next.0":"2020-04-19T03:36:08.677Z","1.7.1":"2020-04-19T03:59:19.987Z","1.8.0-next.0":"2020-04-20T07:12:00.397Z","1.8.0":"2020-04-20T07:16:44.359Z","1.9.0-next.0":"2020-04-28T23:59:39.185Z","1.9.0":"2020-04-29T00:04:10.145Z","1.10.0-next.0":"2020-04-30T00:33:11.034Z","1.10.0":"2020-04-30T00:37:59.619Z","1.10.1-next.0":"2020-04-30T00:55:27.330Z","1.10.1":"2020-04-30T00:57:18.244Z","1.11.0-next.0":"2020-04-30T16:12:35.222Z","1.11.0":"2020-04-30T16:15:17.194Z","1.12.0-next.0":"2020-04-30T17:17:55.288Z","1.12.0":"2020-04-30T17:22:11.641Z","1.12.1-next.0":"2020-05-01T17:59:25.557Z","1.12.1":"2020-05-01T18:02:16.270Z","1.13.0-next.0":"2020-05-02T15:38:05.209Z","1.13.0":"2020-05-02T16:29:12.179Z","1.13.1-next.0":"2020-05-02T16:45:22.496Z","1.13.1":"2020-05-02T16:51:04.740Z","1.14.0-next.0":"2020-05-05T14:56:37.926Z","1.14.0":"2020-05-05T15:03:26.821Z","1.15.0-next.0":"2020-05-05T16:03:37.665Z","1.15.0":"2020-05-05T16:08:08.895Z","1.15.1-next.0":"2020-05-07T14:29:16.002Z","1.15.1":"2020-05-07T14:31:51.722Z","1.15.2-next.0":"2020-05-08T01:13:22.493Z","1.15.2":"2020-05-08T01:21:19.503Z","1.16.0-next.0":"2020-05-08T17:23:58.449Z","1.16.0-next.1":"2020-05-08T22:22:15.897Z","1.16.0":"2020-05-11T21:25:10.366Z","1.17.0-next.0":"2020-05-13T01:58:53.942Z","1.17.0-alpha.0":"2020-05-17T02:27:09.321Z","1.17.0-alpha.1":"2020-05-17T18:57:14.382Z","1.17.0-next.1":"2020-05-17T21:14:55.966Z","1.17.0":"2020-05-17T21:19:51.728Z","1.18.0-next.0":"2020-05-20T04:58:15.975Z","1.18.0-next.1":"2020-05-30T17:49:38.172Z","1.18.0":"2020-05-30T18:55:04.444Z","1.19.0-next.0":"2020-06-02T02:22:36.675Z","1.19.0-alpha.0":"2020-06-09T04:11:00.238Z","1.19.0-alpha.1":"2020-06-17T00:00:05.911Z","1.19.0-alpha.2":"2020-07-31T08:18:01.531Z","1.19.0-next.1":"2020-07-31T08:24:15.673Z","1.19.0":"2020-07-31T08:27:37.769Z","1.20.0-next.0":"2020-07-31T21:14:08.659Z","1.20.0":"2020-07-31T21:16:23.315Z","1.20.1-next.0":"2020-07-31T23:43:07.955Z","1.20.1":"2020-07-31T23:47:49.842Z","1.21.0-next.0":"2020-08-02T04:21:03.678Z","1.21.0":"2020-08-02T18:27:42.897Z","1.22.0-next.0":"2020-08-03T02:26:30.963Z","1.22.0":"2020-08-03T02:29:53.743Z","1.23.0-next.0":"2020-08-05T04:50:26.088Z","1.23.0":"2020-08-05T06:22:38.494Z","1.24.0-next.0":"2020-08-07T19:32:50.167Z","1.24.0-next.1":"2020-08-07T20:10:22.096Z","1.24.0-next.2":"2020-08-09T01:13:55.322Z","1.24.0-next.3":"2020-08-09T01:17:51.536Z","1.24.0":"2020-08-09T01:21:48.192Z","1.24.1-next.0":"2020-08-16T05:59:07.091Z","1.24.1":"2020-08-16T06:14:00.209Z","1.25.0-alpha.0":"2020-09-23T23:23:20.364Z","1.24.2-next.0":"2020-10-04T01:29:31.891Z","1.24.2-next.1":"2020-10-04T02:54:39.420Z","1.24.2":"2020-10-04T02:57:41.561Z","1.24.3-next.0":"2020-11-21T03:46:15.675Z","1.24.3-next.1":"2020-11-21T23:59:46.091Z","1.24.3-next.2":"2021-01-02T20:43:34.207Z","1.24.3-next.3":"2021-01-02T21:24:35.773Z","1.24.3-next.4":"2021-01-02T21:43:14.947Z","1.24.3":"2021-01-02T21:54:09.690Z","1.24.4-next.0":"2021-01-10T01:45:23.328Z","1.24.4":"2021-01-10T01:57:32.525Z","2.0.0-next.0":"2021-01-18T18:27:19.363Z","2.0.0-next.1":"2021-01-18T21:21:58.156Z","2.0.0":"2021-01-18T21:24:21.572Z","2.1.0-next.0":"2021-01-18T21:56:56.105Z","2.1.0":"2021-01-18T21:59:13.721Z","2.1.1-next.0":"2021-02-28T03:50:23.184Z","2.2.0-next.0":"2021-02-28T04:01:49.368Z","2.2.0":"2021-02-28T04:12:14.942Z","2.2.1-next.0":"2021-02-28T06:30:56.839Z","2.2.1":"2021-02-28T06:34:21.565Z","2.2.1-alpha.0":"2021-03-01T19:35:46.852Z","3.0.0-alpha.0":"2021-03-01T21:30:59.295Z","3.0.0-alpha.1":"2021-03-02T02:54:27.952Z","3.0.0-alpha.2":"2021-03-08T04:00:15.619Z","3.0.0-alpha.3":"2021-03-13T21:48:21.255Z","3.0.0-alpha.4":"2021-03-13T21:56:58.455Z","3.0.0-alpha.5":"2021-03-14T00:12:54.143Z","3.0.0-next.0":"2021-03-14T00:17:52.165Z","3.0.0":"2021-03-14T00:23:29.048Z","3.1.0-next.0":"2021-03-16T19:34:23.058Z","3.1.0":"2021-03-16T19:41:47.947Z","3.2.0-next.0":"2021-03-22T00:08:25.212Z","3.2.0":"2021-03-22T00:33:23.629Z","3.3.0-next.0":"2021-03-24T05:57:21.106Z","3.3.0-next.1":"2021-03-26T20:47:46.851Z","3.3.0-next.2":"2021-03-26T21:01:51.399Z","3.3.0-next.3":"2021-03-26T21:41:20.709Z","3.3.0-next.4":"2021-03-26T22:03:04.301Z","3.3.0-next.5":"2021-03-26T22:21:41.397Z","3.3.0":"2021-03-26T22:45:21.108Z","3.3.1-next.0":"2021-03-28T22:54:22.228Z","3.4.0-next.0":"2021-03-29T00:10:40.694Z","3.4.0-next.1":"2021-03-29T00:28:06.242Z","3.4.0-next.2":"2021-03-31T03:15:23.740Z","3.4.0-next.3":"2021-03-31T04:07:34.799Z","3.4.0-next.4":"2021-03-31T05:36:08.017Z","3.4.0-next.5":"2021-04-01T10:34:27.882Z","3.4.0-next.6":"2021-04-15T23:53:59.196Z","3.4.0-next.7":"2021-04-16T02:35:20.419Z","3.4.0":"2021-04-16T02:39:32.907Z","3.4.0-alpha.0":"2021-04-21T04:53:24.800Z","3.5.0-alpha.0":"2021-04-21T19:16:39.841Z","3.5.0-alpha.1":"2021-04-26T17:51:21.104Z","3.5.0-alpha.2":"2021-04-27T10:07:16.583Z","3.5.0-alpha.3":"2021-04-28T05:30:07.446Z","4.0.0-alpha.0":"2021-04-28T05:47:27.435Z","4.0.0-alpha.1":"2021-05-01T21:33:16.910Z","4.0.0-alpha.2":"2021-05-02T01:34:06.534Z","4.0.0-alpha.3":"2021-05-02T18:58:56.685Z","4.0.0-alpha.4":"2021-05-02T20:40:30.604Z","4.0.0-alpha.5":"2021-05-08T15:05:22.265Z","4.0.0-next.0":"2021-05-13T06:03:04.842Z","4.0.0-alpha.6":"2021-05-13T06:09:36.083Z","4.0.0-next.1":"2021-05-13T09:31:12.760Z","4.0.0-alpha.7":"2021-05-13T09:36:29.773Z","4.0.0-alpha.8":"2021-05-13T17:14:45.626Z","4.0.0-alpha.9":"2021-05-13T19:16:34.413Z","4.0.0-alpha.10":"2021-05-14T04:59:51.887Z","4.0.0-alpha.11":"2021-05-14T06:16:11.862Z","4.0.0-alpha.12":"2021-05-16T02:54:31.129Z","4.0.0-alpha.13":"2021-05-16T15:29:03.533Z","4.0.0-alpha.14":"2021-05-16T16:25:31.832Z","4.0.0-alpha.15":"2021-05-16T17:29:57.495Z","4.0.0-alpha.16":"2021-05-17T05:25:49.440Z","4.0.0-alpha.17":"2021-05-17T06:40:53.784Z","4.0.0-alpha.18":"2021-05-17T10:55:30.014Z","4.0.0-alpha.19":"2021-05-17T13:03:30.424Z","4.0.0-alpha.20":"2021-05-18T12:12:38.919Z","4.0.0-alpha.21":"2021-05-19T05:45:16.655Z","4.0.0-alpha.22":"2021-05-19T06:14:04.186Z","4.0.0-alpha.23":"2021-05-19T07:23:47.185Z","4.0.0-alpha.24":"2021-05-24T17:08:15.290Z","4.0.0-alpha.25":"2021-05-24T17:16:07.773Z","4.0.0-alpha.26":"2021-05-25T23:16:22.275Z","4.0.0-alpha.27":"2021-05-29T02:32:50.702Z","4.0.0-next.2":"2021-05-29T02:35:01.274Z","4.0.0-next.3":"2021-05-29T02:38:54.598Z","4.0.0-next.4":"2021-05-29T02:57:45.021Z","4.0.0-next.5":"2021-05-29T19:16:47.729Z","4.0.0-alpha.28":"2021-05-29T23:45:37.487Z","4.0.0-next.6":"2021-05-30T00:19:08.447Z","4.0.0-next.7":"2021-05-30T16:07:58.887Z","4.0.0-next.8":"2021-06-20T02:52:34.934Z","4.0.0-next.9":"2021-06-20T02:55:21.452Z"},"maintainers":[{"name":"williamthorsen","email":"wthorsen@skypilot.dev"}],"description":"A collection of convenience functions for JavaScript & TypeScript","homepage":"https://github.com/skypilot-dev/sugarbowl#readme","keywords":["arrays","functions","javascript","objects","strings","typescript","utility"],"repository":{"type":"git","url":"git://github.com/skypilot-dev/sugarbowl.git"},"author":{"name":"William Thorsen","email":"wthorsen@skypilot.dev"},"bugs":{"url":"https://github.com/skypilot-dev/sugarbowl/issues"},"license":"ISC","readme":"","readmeFilename":""}