{"_id":"kiss-and-type","_rev":"59-b8e5f793bdadb6730a11446ce511d048","name":"kiss-and-type","dist-tags":{"latest":"0.8.0","next":"0.7.0-20"},"versions":{"0.1.0":{"name":"kiss-and-type","version":"0.1.0","license":"MIT","pika":true,"sideEffects":false,"dependencies":{"ramda":"^0.26.1"},"devDependencies":{"@pika/pack":"^0.5.0","@pika/plugin-standard-pkg":"^0.6.0","esm":"^3.2.25","hamjest":"^3.2.5","mocha":"^6.2.0"},"esnext":"dist-src/index.js","_id":"kiss-and-type@0.1.0","dist":{"shasum":"b3311192afb019719c6d4a463ea1168ec8a88037","integrity":"sha512-GwHWqfbNMNHJmsMQOI7h0DoR5KIldrITIr04ng6TdznvOmSb/1NddYSaXqNCtWwczhC11Iqb2GCIy58/8Swr0A==","tarball":"https://registry.npmjs.org/kiss-and-type/-/kiss-and-type-0.1.0.tgz","fileCount":5,"unpackedSize":1910,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdeX1HCRA9TVsSAnZWagAAjboP+wZMSmqA/vPeUwA5bM9F\na9j3q5OiCyeCxRNkIyLPAn8eFkI1hUcMWsPhQkWU3xXch6sQ++LycYwsSNFD\nx+BRB8FdMq+rYR99SG22uTefaQF/HxNGfViFMSW7nVhNG/lc6y0hxW0z6vmI\nUsZbZlgApLpw7D5+r+2i8iqg3aOoaaxpAjhMwebPT56gLDASXMIoBr4nnZLs\na8rFXlVq+HOVTtXphlYCAhSzsqva+Kftuau7pAeIXc+SUvqGsjliu9M7p9vP\nZTz9+O8NStvfIrJlQwBzMAhUzDb6tZGrj1fk6E7n0sqAjrcpoEdawV1p9VwT\nZTosS2St+ZIXX/+0GV+L8B1VPFL1gJdRzsJeOke3IFbS4efYY2TM3U8EtjKo\nv8sGSVFLVHoJPEmOKuRE7LQQ3YcgiGbdXvkA9l0EOSvSbUUrhg0RUL7nPWch\noiZkjNWfLs+N1J68NPXRRHhmVZ0a0XXfzhQ8WB/89dO7avTrVub1Pxmekhgu\n70F1acEPkcdOJxshFzJFkSfRPmq5oYUzBymaCPmkW5na61OXgqkDyIdWQMGd\ntAeV83DQUuyhZPJnpyJryhHuh2+RrzDMiR4jn7Cj99vxyBjN/HCQcUNsB3Cy\nqG+WltjvK6SuEtpChi/OGmeLXasaKgOu9w2pB7BmE7tA/E179e9KgziKZ1Sh\ncExj\r\n=SG/K\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGNZAYBh3lKBupC3NEPPn0oNggGSynE6KMgznublW0jTAiA5OZvk/tG4711KBV9UPvMCLlEZmWEMPktTOsx4Y8C//g=="}]},"maintainers":[{"name":"alexbepple","email":"alex@bepple.de"}],"_npmUser":{"name":"alexbepple","email":"alex@bepple.de"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/kiss-and-type_0.1.0_1568243014994_0.7904555517269714"},"_hasShrinkwrap":false},"0.1.1":{"name":"kiss-and-type","version":"0.1.1","license":"MIT","pika":true,"sideEffects":false,"dependencies":{"ramda":"^0.26.1"},"devDependencies":{"@pika/pack":"^0.5.0","@pika/plugin-build-node":"^0.6.0","@pika/plugin-standard-pkg":"^0.6.0","esm":"^3.2.25","hamjest":"^3.2.5","mocha":"^6.2.0"},"esnext":"dist-src/index.js","main":"dist-node/index.js","_id":"kiss-and-type@0.1.1","dist":{"shasum":"0f6990b00cb42b92f2b9bb8b170da7945235a3fa","integrity":"sha512-f8GcXFDlWEsIG3CXLF4Qy2CfxS8NEOqeZQhY69WL6sfo6Cx3uupE4alvwM2NZVrV/c6JEGJ66fBl6/8EVoVJlQ==","tarball":"https://registry.npmjs.org/kiss-and-type/-/kiss-and-type-0.1.1.tgz","fileCount":8,"unpackedSize":7265,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdeX+vCRA9TVsSAnZWagAA6OQP/Rqp1PClkHeb85hbMhPr\n/cQUpWn555kWCoek4fPDBloRqxN0yxY4lElC+hBNdlXV+huWxv4e84rbaJdy\nTnVT6TwM6bxe6boL21x0FZCGX2bI9hTtE1nADbAuyRApG11CPiFj1D08bYiY\n9VtGkKuhuwOv38rEwp4+g0+WKOOnybncxiaYR8srpvYBK9ImakTK8qYn8EDg\n5d399xtNNaJfW1Har5Nn8ikfq1TDZz9AE1885cfRXD42lKTC7X6NZQWaJUhX\nku+LMO7P8jfi5Sg0qValm8oCdTnY/E7f8z7mPALW7/6rMF8j4tJCEfMqQbjp\nHqD+nihqpUMNal1hMD2WXoongAUiQNjMrBP7qdHAcJW0FRGCMeA26pc7YB0Y\nbxMn+1Lj+PWjnocuwzz8HQB2qB+/YwgSq8zlgWKsZAebQ2XsIWS/0H6otKmn\nAymJ5phMMhDCnQbvdDDPZPICkAQ4a+bv29MMUOcPJhuXwWq7DTtnqsqtc47W\nTomwSMwx44GCxjkW8PAqU1dfSoAiCDB0VGAaOtOzaQ8dQPnYu0RC19pMcErx\nm0U5yD3EWbnG+N5JBWYKp48uPHFcwbLRrgax+zHv8bW0QXwSQNGKbt3MrS/B\n6wScbDSjNF8pX4k9+mairi+gdWJZNXCNnD8mQmOEtQ12if1wgGxjwnj4WGjt\n+qtn\r\n=vyaw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCCGjQ0OHEFDeTHyP3jkNtdbfU8qDD4cfjB7vBqdzmn7wIhAICp1BfAV+n+jTIUwv/UPdI9wmgKxvLxce0lwG3KRlCr"}]},"maintainers":[{"name":"alexbepple","email":"alex@bepple.de"}],"_npmUser":{"name":"alexbepple","email":"alex@bepple.de"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/kiss-and-type_0.1.1_1568243630370_0.9436685765881698"},"_hasShrinkwrap":false},"0.2.0":{"name":"kiss-and-type","version":"0.2.0","license":"MIT","pika":true,"sideEffects":false,"dependencies":{"ramda":"^0.26.1"},"devDependencies":{"@pika/pack":"^0.5.0","@pika/plugin-build-node":"^0.6.0","@pika/plugin-build-types":"^0.6.0","@pika/plugin-build-web":"^0.6.0","@pika/plugin-standard-pkg":"^0.6.0","esm":"^3.2.25","hamjest":"^3.2.5","mocha":"^6.2.0"},"esnext":"dist-src/index.js","main":"dist-node/index.js","module":"dist-web/index.js","types":"dist-types/index.d.ts","_id":"kiss-and-type@0.2.0","dist":{"shasum":"d810c2ea78fdc1292d6a5c7024bd711a64842d31","integrity":"sha512-GVE9yqadywNx+mtkHYsGlOUbKColg2PUrghpazt0UdyFStMlLnCOjHaWZr/ilJM0Fo08GVKxFrlq+C7IuWz47A==","tarball":"https://registry.npmjs.org/kiss-and-type/-/kiss-and-type-0.2.0.tgz","fileCount":13,"unpackedSize":13210,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdesa2CRA9TVsSAnZWagAA0+8P/2dYqRJk90oCTUwi7eiN\nSUphQfNLrgWcE+kzw8WQbuMMjSxCdY70l+Qa2goE9K0uj0++qmDNa4QPDqO2\n2EHP6Pr3KUApOEu4tETOGPNE4uB2fqhZIn3Z3K6aOnBAqgR6PG9Z65rDnD8S\nbup9q4wkqq/TxPW1UWCH56tRonhzy5ryS8Sipg0fYFRK97+TY68bHaGYz7Fa\nNbaVqsDTlRxL+Iqw6wSeiPrOveqpWcJB9sqVzd7fylLpWd3iLcLSsSKJarvf\nObcu+6pB9MLKAiBqPi9wET6u7UC9kqJW8wMromvPdPQmGuCn1xN45O5JR061\ngX/Epcc5GOOwTsj2oB/3XDJXjhtIhX/QU8WJVTOk6DD82nwWBlhNPrB0LOEw\nwm+ix36ltvF8SU9s2HcrdPJAqil3KraAn1AfScOHwleZZ60b1Wp4tddaVkVb\n/TvubD+C1Mpd/TYrhVUAJ879WvZBNNZSxIt3qDRxYsB1Cr4JjMa3TK1DUphb\nc2hbIun36JCTM3rUE/JxjXVTx8B2JLlp1kMQNpPJli/CEh30WpT8+bXRzKNm\nKIP7+LjxnRmGU9YUVi9hT81auU/PB4+KRV8HXhXxZ6cI4EGLseQy/VWwoqbD\nZFG56zfKVE38j+boZkhNATYAp1eVbOsEDFJNecUeQjN481jdiFRS32389ZcF\nZq8l\r\n=S2xt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDAjQtDgLCBf28kLJ2MoDovsxL9b5y1upmnzAdbIHi64wIgAnM/TJUl/lSn9M6yrmOCyTgrfJGLulhaoMrVB7lv+UE="}]},"maintainers":[{"name":"alexbepple","email":"alex@bepple.de"}],"_npmUser":{"name":"alexbepple","email":"alex@bepple.de"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/kiss-and-type_0.2.0_1568327349789_0.8739884952412638"},"_hasShrinkwrap":false},"0.2.1":{"name":"kiss-and-type","version":"0.2.1","license":"MIT","pika":true,"sideEffects":false,"dependencies":{"ramda":"^0.26.1"},"devDependencies":{"@pika/pack":"^0.5.0","@pika/plugin-build-node":"^0.6.0","@pika/plugin-build-types":"^0.6.0","@pika/plugin-build-web":"^0.6.0","@pika/plugin-standard-pkg":"^0.6.0","esm":"^3.2.25","hamjest":"^3.2.5","mocha":"^6.2.0"},"esnext":"dist-src/index.js","main":"dist-node/index.js","module":"dist-web/index.js","types":"dist-types/index.d.ts","description":"A lightweight approach to typing in plain JavaScript.","_id":"kiss-and-type@0.2.1","dist":{"shasum":"49f44578db29330953c35737a2b3bb1523b559bc","integrity":"sha512-O7reUOWgdOxIOyrZkVtt/ZdDcO0SfXjlfJqY8DgYfJVCtajMr0nvAgOoIr3gnMVUsPJLVICGOsA7etMDBk0LPg==","tarball":"https://registry.npmjs.org/kiss-and-type/-/kiss-and-type-0.2.1.tgz","fileCount":14,"unpackedSize":20212,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdh4PSCRA9TVsSAnZWagAACqMP/2s++W77ompxZQXdJijb\n4yOiLJv2K1sbbUU4tXyNtEknUgUaO+IRItnJbKWSH8Y7MXTgPY0mqRsVBOmt\n/yshsqFkgk7K9hZXFStOYYY1APFj70UAKV3lm+kz8Z0mDi0tXIBh77ALpt1Y\niKLHCx2oUrNT1blL/ew4+xhlE0nWZ4A9O71KCliyudpx1oylhM/TT9jndc5D\nywS8Ry2xKzk1lysuweHmwejCErubeEjlNTRpmaR4JzwWAi450gx0+60o44Gf\n6642+177K7P0j6DgKjFmfMJ55xlmMBEe6W9+tqZRRcxPA3vvEi8wKmWm0csU\nnKFl7ih3TYurUuvOR6NUQwzlfDfo9KfOY1OH71xa6Dpn/WHEPwrPR1Sj4uGk\ncgzgo+e1+cFgLfXjUWz8tc0Q+B1ynWyXfM7tFRMPAc5O4Z9qLSIXi5/k6bfx\nCQaypSzUozk0obi7qD9y+HgnN1VYBVd41oi4TqKwxm+qm4iX8JVAxo+QpenU\nyuxiGBmz0Lxb5gXRbPfS+lNuJ2XEkA1/+y7FqqqD3llxnmc6keo+YSrffJtM\nJFH9jqzxI+Tx8HeCSbxmT51jBRQkdPG/l9ze39OXhR7ZJt9draaRVGWsUnKV\n3yyuXmUxFcHACFU8Et+vKMteGwVePVuqEpwt2x95+twUDoOLuIbBu3+rTGo9\no0IO\r\n=6S/K\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCDAVBSStwmxVM/yW0VXXJoE3/HUuo+ROUiBjSBmWkoUAIhANgE6bLLzBOXMrBDjxQnASqNmXe7li+IcJADVUiGpbTC"}]},"maintainers":[{"name":"alexbepple","email":"alex@bepple.de"}],"_npmUser":{"name":"alexbepple","email":"alex@bepple.de"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/kiss-and-type_0.2.1_1569162194324_0.6486366932507728"},"_hasShrinkwrap":false},"0.2.2":{"name":"kiss-and-type","description":"A lightweight approach to typing in plain JavaScript","version":"0.2.2","license":"MIT","pika":true,"sideEffects":false,"keywords":["fp","functional","types"],"repository":{"type":"git","url":"https://github.com/alexbepple/kiss-and-type"},"dependencies":{"ramda":"^0.26.1"},"devDependencies":{"@pika/pack":"^0.5.0","@pika/plugin-build-node":"^0.6.0","@pika/plugin-build-types":"^0.6.0","@pika/plugin-build-web":"^0.6.0","@pika/plugin-standard-pkg":"^0.6.0","esm":"^3.2.25","hamjest":"^3.2.5","mocha":"^6.2.0"},"esnext":"dist-src/index.js","main":"dist-node/index.js","module":"dist-web/index.js","types":"dist-types/index.d.ts","licenseText":"MIT License\n\nCopyright (c) 2019 Alex Bepple\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"kiss-and-type@0.2.2","dist":{"shasum":"609c8ea416304951c3b3e0856dc16403b22e149d","integrity":"sha512-8nW7SkEz8ZPDkrBBW5/lKg1+zFkgO5OPRUxlMi61QOqJxLMsiAJF/zigtaRFlA1BZZ95cr+OhY/3kgUhM5VaYA==","tarball":"https://registry.npmjs.org/kiss-and-type/-/kiss-and-type-0.2.2.tgz","fileCount":15,"unpackedSize":21477,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdh47ICRA9TVsSAnZWagAAq4kP+wRjqddsE7kiAErZUdWA\n/IprDlkLBsk8OhOTdZ0kGq/tKt0YiD0x2LAt9zYA9sWfvVfLGyvLNWpZR4xe\nIhdPG813ciAwMhwVIrCL0eVl2F+ChAjYPKdLMDJqfc+P5R96KMI6xtGZ1lv5\nreDchbfgUH/SaxbEBOsbhYbMWrK8aUMUIZOS6yHCoW50YnC7VgjOl29WKLA+\nwHdHrvoi079T55nMh77Bu1Y69m6EJ3fwj7zt3w9veiMbwJhb0wqoY3JyMBsb\nO6iyqcyF4ojTNnSS6s8msvgc0lG4EBb6jV5zPiBm4F3gEhB9z/z+fK+DbaN7\nn/u6rrNbFntJSnv3VVs78Q90he1RHEXJAMbUmEh2GLzWCYB7JWJpV1//BnOM\nHCzgW6hDefIPrEZQK0kJirdburfSf6a9IOLKcTE3wfQwPA+Of007kbJgK3lt\n9WP/EUOUT432/Au51tUYP98skLCfw/OQEUH6dvxZKrL21mdYqwWxSkmuM32a\nbIUSxthFQoZi1siNedXE8o5nYQPNd0mLiSnmFKZvOrnbRyvII3s90pZuayT3\npPVpPufVyXau5auqqAmq7BKC5b9eJjJV40Y2ZLzmZ61P5+Q0r0iTYEWNE0ES\nWWWojhqFvVGh4JRnuQXMax7WcxseuVs6gvUrcXOTajQjDI2GT4mXuUy/O+hK\njuMD\r\n=GPQf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQClt0/rMIEdHxZPabdDNxlejJ2JBnRDgTsuC8SpR0FCxwIhANO/WeLktaXJogDwb74fst1yPxWSJXOlX5QSh7LQe3v0"}]},"maintainers":[{"name":"alexbepple","email":"alex@bepple.de"}],"_npmUser":{"name":"alexbepple","email":"alex@bepple.de"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/kiss-and-type_0.2.2_1569164999708_0.2138050665743163"},"_hasShrinkwrap":false},"0.3.0":{"name":"kiss-and-type","description":"A lightweight approach to typing in plain JavaScript","version":"0.3.0","license":"MIT","pika":true,"sideEffects":false,"keywords":["fp","functional","types"],"repository":{"type":"git","url":"https://github.com/alexbepple/kiss-and-type"},"dependencies":{"ramda":"^0.26.1"},"devDependencies":{"@pika/pack":"^0.5.0","@pika/plugin-build-node":"^0.6.0","@pika/plugin-build-types":"^0.6.0","@pika/plugin-build-web":"^0.6.0","@pika/plugin-standard-pkg":"^0.6.0","esm":"^3.2.25","hamjest":"^3.2.5","mocha":"^6.2.0","xo":"^0.24.0"},"esnext":"dist-src/index.js","main":"dist-node/index.js","module":"dist-web/index.js","types":"dist-types/index.d.ts","licenseText":"MIT License\n\nCopyright (c) 2019 Alex Bepple\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"kiss-and-type@0.3.0","dist":{"shasum":"97b7674daea92d75ca5f4944b1d98c4dcad726fb","integrity":"sha512-fntA0zT9s9SpwM97Bxh5b8f4SzeOm0IKltK7hhsflElCZo3NTsG8Uk8bRMZ52UwdeTbJBpDX2BMyDHCRl253BA==","tarball":"https://registry.npmjs.org/kiss-and-type/-/kiss-and-type-0.3.0.tgz","fileCount":15,"unpackedSize":25808,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdh/DICRA9TVsSAnZWagAABIQP/jfWa1OzIRAciAcgA1Rz\nEJdz2jmy9Y2oWEM8TRrSzlPwnx1siQ+ANXHoz5wADS6RiVX9OSpUsETYbFwL\nw5zlR+yEZbWmwE0rWKSvZY+Gy/WuJ8sD0awraEVMi3X9bAsgGX/2bB28L9ki\nH4v+VlCYzKzlGsvAKvka0BHghyWjPIdxPQwwSkIATLjukMpif2vH1LuYVLub\nZhQtaDv3n+M36+81CT9Ibgwomcp/h2MOCrhieaFJacr7xBlDXigytNmpxUH9\nDzFaaKXzrB8GdhX3O+8y/7LnFS2/6h0gcMqGc6aNNL1w/dm2fpUh6wOp7MWU\nYbDM7ZF7wwH5vLx40Rb64MsermxWPStx4fVKZkCu/rlksBw4WDuDoRtXS1Fp\n8Vgq4ew4CK9Txbplv4HZ4ha+p/mZIN/gGSKM7G7mKaANJaUAr4RDc+PLHVIo\n+WyTjFOQ+4+ml0rkrNMRE/dYZuJmejNt5Ck/K4EQjoTVOmdzYiLCc4xdy8pP\nbOZThAYdtalWpDbhn7199X91x0jCJsZuX7BR1IQB5G7eZOKxJJ0XyQqeRC/G\ntaSnCoXl9S5DAiC6kyzwMx4Y/VErnSVUFXjOGd6nDbP5DgMhfCoysGhtgkVe\n/7PuhNQDmPM3gch+Eb1Fot9I2JoNC2hcDwVMIMunfePQskOV9j3ttWrMjdNX\nxwJU\r\n=L1+6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDTnJo5u1i62WPSmdyI3vEYqiTP3TF2pF+J0kESLSB4CwIhANx04m5FcnvGtQxaGmfohkAEQHrUqDqSo+fjcw7BRS3j"}]},"maintainers":[{"name":"alexbepple","email":"alex@bepple.de"}],"_npmUser":{"name":"alexbepple","email":"alex@bepple.de"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/kiss-and-type_0.3.0_1569190087740_0.0555399234368259"},"_hasShrinkwrap":false},"0.3.1":{"name":"kiss-and-type","description":"A lightweight approach to typing in plain JavaScript","version":"0.3.1","license":"MIT","pika":true,"sideEffects":false,"keywords":["fp","functional","types"],"repository":{"type":"git","url":"https://github.com/alexbepple/kiss-and-type"},"dependencies":{"ramda":"^0.26.1"},"devDependencies":{"@pika/pack":"^0.5.0","@pika/plugin-build-node":"^0.6.0","@pika/plugin-build-types":"^0.6.0","@pika/plugin-build-web":"^0.6.0","@pika/plugin-standard-pkg":"^0.6.0","esm":"^3.2.25","hamjest":"^3.2.5","mocha":"^6.2.0","xo":"^0.24.0"},"esnext":"dist-src/index.js","main":"dist-node/index.js","module":"dist-web/index.js","types":"dist-types/index.d.ts","licenseText":"MIT License\n\nCopyright (c) 2019 Alex Bepple\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"kiss-and-type@0.3.1","dist":{"shasum":"179d7a4b07d0fc5d91932210db98dee4b949889f","integrity":"sha512-UzvamvRBOnGPsIwC2SsUteNfa7GSQBy5KxerzjZaY8AMSTI2ld/taBWL0qlXHWZ3EImJLkonCjiUd6jvZhY1eg==","tarball":"https://registry.npmjs.org/kiss-and-type/-/kiss-and-type-0.3.1.tgz","fileCount":15,"unpackedSize":26314,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd4CUQCRA9TVsSAnZWagAAP5UP/1EGeb5hDTs64tdrJmQX\nrRuzG+Vye+JEhfT9uNae7AuRj7hUj3jMeAbDDpWb0SxniQSCjIEUx3padWk4\nUcY8R4PJ5pPixbzd22ElWN87x4Tt+tGZnNcyVldy4kTplqc3+lj6eT4det7p\nx9zAAdgFB+Z9dxHRqGbuLs1QJnBhIBi7fGYolJOqyauQ0GQhtrrLfRHKxq8i\nEF50+ZeSeeSpWpUSVYWwZ9ZwkWasCSdfuFl5X6Xd+/w1ik+hGGZjBWQA932t\nUu4Aig5RrVgLMH1x1Ffe7MDL32zol3Ja1SEoZ6kCbpp0H6uK4Gaxv+BaWgJp\nrCkedR6IWmLIdd858x7buKoRewaynq7ZQM0V2qTgCxz8FNPuP7TN7tv6/W//\ndQEN/patmIsNhVxv+sEoleREQ/lRP05X080Z9cximmz5knZczQIs42ARbHq0\nw2k05iMJnRESXcMPt3UP+RmE0ZTlCM7hFndSWK1Q3Cmi41yJozoh2udbhiy6\nwsV8Ja55WKgK4s8tQ/5Asy7TnGx1Esdb3lGZrSDXgYnawFod+GfeQbRcRHFK\nD+oqPpOlDTW/tNZQltdQeolBdRG6BCXj1axaomjr2zpAruNjJgMJFtaPv3Gn\nGl0fkSZB2GGzmM3Jk7ImHDb3gGJvvfi9XU/g4tYhNOnh6zgv052Ke7UN4Ufs\nOCmK\r\n=T46a\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFYtVe2Ei1zpvFOuf+EvuHx7zLSuTrEQ7lkdk/S01KHNAiAXYxMj4t9I2uvoZ/Y7ngf70oUScUgnaDX6GksegnXi/w=="}]},"maintainers":[{"name":"alexbepple","email":"alex@bepple.de"}],"_npmUser":{"name":"alexbepple","email":"alex@bepple.de"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/kiss-and-type_0.3.1_1574970640288_0.7490409170261512"},"_hasShrinkwrap":false},"0.4.0":{"name":"kiss-and-type","description":"A lightweight approach to typing in plain JavaScript","version":"0.4.0","license":"MIT","pika":true,"sideEffects":false,"keywords":["fp","functional","types"],"repository":{"type":"git","url":"https://github.com/alexbepple/kiss-and-type"},"dependencies":{"ramda":"^0.26.1"},"devDependencies":{"@pika/pack":"^0.5.0","@pika/plugin-build-node":"^0.6.0","@pika/plugin-build-types":"^0.6.0","@pika/plugin-build-web":"^0.6.0","@pika/plugin-standard-pkg":"^0.6.0","esm":"^3.2.25","hamjest":"^3.2.5","mocha":"^6.2.0","npm-run-all":"^4.1.5","xo":"^0.24.0"},"esnext":"dist-src/index.js","main":"dist-node/index.js","module":"dist-web/index.js","types":"dist-types/index.d.ts","licenseText":"MIT License\n\nCopyright (c) 2019 Alex Bepple\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"kiss-and-type@0.4.0","dist":{"shasum":"964705f45413df6997b02edd95cf5ba65c004383","integrity":"sha512-2zPNqn59N1QZBqIBaVXpoFxDho1b3rxJtiLKokAkUsZ1q457veymYzMIATi+ZTdlfObneiQNWoY+0O+o7S1n/w==","tarball":"https://registry.npmjs.org/kiss-and-type/-/kiss-and-type-0.4.0.tgz","fileCount":15,"unpackedSize":27394,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd4Eb/CRA9TVsSAnZWagAAApMQAI99KCCuC6VZRdC8fMoj\nokFl/0EOS2bzbKNJRvlDU+ohWj11nlQrx2rdAr72cbFq0UaYdwuoa/4UpKQv\nMUTr8718vd9iTKf8LaoM+Q0LbiWHlJ8N7zPczvsutP1yKrjj3LMbX/3jy2ZZ\n3+OdKNhDZHWCMuK6RrNOzxzWkfax+PP6ch4vGKdhZSLcwgQBr02trUyvn8oI\nJ4+QQv/5kd/BS0lRhlcouETcRhVJ19KaLy9TdMokYD/+mTgVzRbDpwE6eyhP\nbU1pE/qpz5lwkJP0SSdVzI7CUuOXARij0OFezTMmiTGH6Awz+ayGfM50L0iu\nIuO3N62Uh2sFWbhD1bT6wFxp45DAKmVYf8ldh4Nfn5v72Lgu+86pLI5E8M8c\nekeMKPQAYPI6y8bMLMbwecMVfKyVhXNT2NMhydCLtwYnJca2djz+lz92egtr\nAmQWVq0OFR67c8uWqvUSadofZr2ZsXJZtnV6+fsnekmGPBTsLSQDyQmKvPsU\n9szY5qLs2fj4KXot+Bsf+RyEGKa/VtCrKV1JFhdbsbJ/0Gi+ZuEE7s1iXXlp\nEEpWVoE4zVqx1o3i8ryXSNTvTACVOaQuwH04ItnZvPdUPpmAQi31RsSqKXFX\nAg1QNqRCap3E3gXFkI4X7oWAOQN8J0ZLZkwiUZSMTFAfOU/I6guYonlwRmXY\n0h53\r\n=h1X1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHzM/FTz7mdDfNTsYu86Y6NcjFfSg00Q4ul0+kp/jesnAiBbdhglVBkO5ZD7P8rThYfnjhL5SlfTy090MVAAWws34A=="}]},"maintainers":[{"name":"alexbepple","email":"alex@bepple.de"}],"_npmUser":{"name":"alexbepple","email":"alex@bepple.de"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/kiss-and-type_0.4.0_1574979326586_0.31702514215166766"},"_hasShrinkwrap":false},"0.4.1":{"name":"kiss-and-type","description":"A lightweight approach to typing in plain JavaScript","version":"0.4.1","license":"MIT","pika":true,"sideEffects":false,"keywords":["fp","functional","types"],"repository":{"type":"git","url":"https://github.com/alexbepple/kiss-and-type"},"dependencies":{"ramda":"^0.26.1"},"devDependencies":{"@pika/pack":"^0.5.0","@pika/plugin-build-node":"^0.6.0","@pika/plugin-build-types":"^0.6.0","@pika/plugin-build-web":"^0.6.0","@pika/plugin-standard-pkg":"^0.6.0","esm":"^3.2.25","hamjest":"^3.2.5","mocha":"^6.2.0","npm-run-all":"^4.1.5","xo":"^0.24.0"},"esnext":"dist-src/index.js","main":"dist-node/index.js","module":"dist-web/index.js","types":"dist-types/index.d.ts","licenseText":"MIT License\n\nCopyright (c) 2019 Alex Bepple\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"kiss-and-type@0.4.1","dist":{"shasum":"4f9a4fdc7028a1660de3c01c4c1d90c85c5fe404","integrity":"sha512-3hFp+nvMJHHllxvpKwlnFk6V/yGrYOVVhZw8ufDSKZuWBQYKt+15c0kYSmSefF7Z2oELlM2pexSLNrz0DAKDkA==","tarball":"https://registry.npmjs.org/kiss-and-type/-/kiss-and-type-0.4.1.tgz","fileCount":15,"unpackedSize":27477,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd4EgjCRA9TVsSAnZWagAAJM4P/jDlqZZh4hy5MYC2hvnF\nlq1KUKl0duYqb/oJX5AjqvP8uPzVj9EJ7NpO2RcxCTm+xjMLeva29i20D6C/\nrL3bxGfeObVb0xM8ewOUn+t/47cAn/jMtosLr2V9G09HZ738zv3i6FJsR9KM\ngxVSYZmlJno7pYmyt2+GamIi4hOwXdGljhUmmfSIaHNaYwkS8mylfs8lx0WR\ngMqFf4zppMKcbvOZDvBghRzTm3D0g5EKUutSi0l+Z03tNphkuDY1sk6bYpy4\nEVHnTN/JiSg1e3678U7kP0BwhRg4G+yK1E5gzH30/fs2jYjAUKakNnec3JsJ\n/ieiMmeEiNNnsYXEjCdTbJy/ywxUMnFRC2ZfHwUEc7MlAKKsXMGsjhuMvKB+\ncMzKfIrHa6qZYpM17mixcnaUUsVuJjhTyfUM9jOeuMZAnFPT45qvJOvSzkg0\nVuyDH3KI5VobKkdgoZspatgkPl0+KnlhvD4+Oy5t6fYZ8ytRaUfWt3pczk9v\nHUY9BY3HKAUR+HP7lxVMNJGhlkQ9su/k4Wompey43BeeFNbRoeevGaAY7auE\nSU78y2wh25lfD1TWImzSS7VRgg8q91YSxsRzV4o1UPbPO8r1W5gvig9RUKZV\njbioXCair6Tcrrdf8oe2S6BOZ5vNe9MXx7ornS9h9uU3arpmcjJqWsjffhIc\nIQaF\r\n=CsYl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCz2Gx3/VOblBh0ExRZyaD7KyvMeVxiabSlwbF0Fh/tlQIgbl+9IGQuTmpS1rMal8dof+m8cWthfuKB1F+bRCLLRvQ="}]},"maintainers":[{"name":"alexbepple","email":"alex@bepple.de"}],"_npmUser":{"name":"alexbepple","email":"alex@bepple.de"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/kiss-and-type_0.4.1_1574979618816_0.8303065295563699"},"_hasShrinkwrap":false},"0.4.3":{"name":"kiss-and-type","description":"A lightweight approach to typing in plain JavaScript","version":"0.4.3","license":"MIT","pika":true,"sideEffects":false,"keywords":["fp","functional","types"],"repository":{"type":"git","url":"git+https://github.com/alexbepple/kiss-and-type.git"},"dependencies":{"ramda":"^0.26.1"},"devDependencies":{"@pika/pack":"^0.5.0","@pika/plugin-build-node":"^0.6.0","@pika/plugin-build-types":"^0.6.0","@pika/plugin-build-web":"^0.6.0","@pika/plugin-standard-pkg":"^0.6.0","esm":"^3.2.25","hamjest":"^3.2.5","mocha":"^6.2.0","npm-run-all":"^4.1.5","xo":"^0.24.0"},"esnext":"dist-src/index.js","main":"dist-node/index.js","module":"dist-web/index.js","types":"dist-types/index.d.ts","gitHead":"fb9fb505a9e4e1b36781830b4e9b396a17d44974","bugs":{"url":"https://github.com/alexbepple/kiss-and-type/issues"},"homepage":"https://github.com/alexbepple/kiss-and-type#readme","_id":"kiss-and-type@0.4.3","_nodeVersion":"20.9.0","_npmVersion":"8.19.4","dist":{"integrity":"sha512-qm6DU9+D5qNPAlnZ2IVeAct+hhgSGf/fnpxqT0Ui1A77IaaDVgSrtmDhYC1lzpuRT31Th9elke+LVQCCqKBr3Q==","shasum":"c843f63c0cda537558535a0fce3fc1d258278fef","tarball":"https://registry.npmjs.org/kiss-and-type/-/kiss-and-type-0.4.3.tgz","fileCount":10,"unpackedSize":27476,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC0qOP1c4Nm4SvkfrSEs2tauuyaXFemBbnvD8N5/1CX3QIgZYgalDgPc9pKirus9MUfxP+ZHBpa9xTX8roJJFzb5mg="}]},"_npmUser":{"name":"alexbepple","email":"alex@bepple.de"},"directories":{},"maintainers":[{"name":"alexbepple","email":"alex@bepple.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/kiss-and-type_0.4.3_1708686558882_0.582159156050746"},"_hasShrinkwrap":false},"0.5.0":{"name":"kiss-and-type","description":"A lightweight approach to typing in plain JavaScript","version":"0.5.0","license":"MIT","pika":true,"sideEffects":false,"keywords":["fp","functional","types"],"repository":{"type":"git","url":"https://github.com/alexbepple/kiss-and-type"},"dependencies":{"ramda":"^0.26.1"},"devDependencies":{"@pika/pack":"^0.5.0","@pika/plugin-build-node":"^0.6.0","@pika/plugin-build-types":"^0.6.0","@pika/plugin-build-web":"^0.6.0","@pika/plugin-standard-pkg":"^0.6.0","esm":"^3.2.25","hamjest":"^3.2.5","mocha":"^6.2.0","npm-run-all":"^4.1.5","xo":"^0.24.0"},"esnext":"dist-src/index.js","main":"dist-node/index.js","module":"dist-web/index.js","types":"dist-types/index.d.ts","licenseText":"MIT License\n\nCopyright (c) 2019 Alex Bepple\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"kiss-and-type@0.5.0","dist":{"shasum":"a9128ae46f2d437788dcc6e164f417432a77c157","integrity":"sha512-8ASAj4CJgGefTmaPjynRQ/1RbOYyqp7JBiEHICBfgjlM2rEblhH379hHmpIsBWgdnZBTGK8ctVOhTNMe0I7qNA==","tarball":"https://registry.npmjs.org/kiss-and-type/-/kiss-and-type-0.5.0.tgz","fileCount":15,"unpackedSize":28847,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFohuMSeftDQv+sjnZ/o83zekcXhFarOssIlyojmQVbbAiBKRZH+IqYT+TiQbYjtzu5R3C+7GK0/3ore0ICmDkXDMQ=="}]},"_npmUser":{"name":"alexbepple","email":"alex@bepple.de"},"directories":{},"maintainers":[{"name":"alexbepple","email":"alex@bepple.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/kiss-and-type_0.5.0_1710507224993_0.2934774721970459"},"_hasShrinkwrap":false},"0.6.0":{"name":"kiss-and-type","description":"A lightweight approach to typing in plain JavaScript","version":"0.6.0","license":"MIT","pika":true,"sideEffects":false,"keywords":["fp","functional","types"],"repository":{"type":"git","url":"https://github.com/alexbepple/kiss-and-type"},"dependencies":{"ramda":"^0.26.1"},"devDependencies":{"@pika/pack":"^0.5.0","@pika/plugin-build-node":"^0.6.0","@pika/plugin-build-types":"^0.6.0","@pika/plugin-build-web":"^0.6.0","@pika/plugin-standard-pkg":"^0.6.0","esm":"^3.2.25","hamjest":"^3.2.5","mocha":"^6.2.0","npm-run-all":"^4.1.5","xo":"^0.24.0"},"esnext":"dist-src/index.js","main":"dist-node/index.js","module":"dist-web/index.js","types":"dist-types/index.d.ts","licenseText":"MIT License\n\nCopyright (c) 2019 Alex Bepple\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"kiss-and-type@0.6.0","dist":{"shasum":"3d76f03bcd8a5a4f0159024678d9175a1eadcf50","integrity":"sha512-gvPdJG+C2Lx29oad2+ZRpbZddRJON3Q+Z/CAZIQrE55RbQRqgUgDUMb0exJkyL6dZKDpmjwtKcD4bIndi2FfLQ==","tarball":"https://registry.npmjs.org/kiss-and-type/-/kiss-and-type-0.6.0.tgz","fileCount":17,"unpackedSize":33267,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFOogra9sbs+rORxKI3O+1znSs8w1TIfTQzuIHYGI+HLAiEA9pdOeBn+aAM2XuiiyBtytpoKMMYvXzeNAW/mBu7BFDI="}]},"_npmUser":{"name":"alexbepple","email":"alex@bepple.de"},"directories":{},"maintainers":[{"name":"alexbepple","email":"alex@bepple.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/kiss-and-type_0.6.0_1710514448426_0.20895805669862066"},"_hasShrinkwrap":false},"0.7.0-20":{"version":"0.7.0-20","scripts":{"prerelease":"run-s check build","release":"np --yolo","check":"run-p lint test","pre-commit":"run-p lint-fix test","lint":"xo","lint-fix":"xo --fix","test":"mocha","build":"unbuild","version_":"be careful with npm life cycle!","publish_":"be careful with npm life cycle!"},"dependencies":{"ramda":"^0.26.1"},"devDependencies":{"hamjest":"^4.1.0","mocha":"^10.3.0","np":"^10.0.1","npm-run-all":"^4.1.5","typescript":"^5.4.2","unbuild":"^2.0.0","xo":"^0.24.0"},"devDependencies_doc":{"typescript":"required by unbuild, even if unused"},"type":"module","exports":{".":{"import":"./dist/index.mjs","require":"./dist/index.cjs"}},"main":"./dist/index.cjs","publishConfig":{"registry":"https://registry.npmjs.org"},"mocha":{"spec":"src/**/*.test.mjs","reporter":"dot"},"xo":{"envs":["node","mocha"],"prettier":true,"rules":{"capitalized-comments":"off"}},"name":"kiss-and-type","description":"A lightweight approach to typing in plain JavaScript","keywords":["fp","functional","types"],"author":{"name":"Alex Bepple","email":"alex@bepple.de","url":"http://alex.bepple.de"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/alexbepple/kiss-and-type.git"},"readmeFilename":"README.md","readme":"[![npm version](https://img.shields.io/npm/v/kiss-and-type.svg)](https://www.npmjs.com/package/kiss-and-type)\n\n\n# What is this?\n\nA lightweight approach to typing in plain JavaScript.\n\nYou might enjoy some advantages of more common type systems without the need to change your language and tooling. You might enjoy some unexpected advantages as well.\n\n\n# Features\n\nLet’s look at the practical aspects first. – If you are really interested, more general and slightly deeper thoughts on typing are [further down](#on-types).\n\n\n## Some safety\n\n```javascript\n> fooT = createType([ 'bar' ])\n…\n> fooT.get.baz\nThrown:\nTypeError: Unknown property 'baz'\n…\n```\n\n## Immutable\n\nBy default, all operations are immutable.\nHowever, immutability is not enforced in any fashion on the objects.\n\n```javascript\n> fooT = createType(['bar'])\n…\n> foo1 = fooT.set.bar(0)({})\n{ bar: 0 }\n> foo2 = fooT.set.bar(1)(foo1)\n{ bar: 1 }\n> foo1\n{ bar: 0 }\n```\n\n## Functional programming\n\n### Data-last and curried\n\n```javascript\n> fooT = createType([ 'bar' ])\n…\n> fooT.set.bar(0, {})\n{ bar: 0 }\n> fooT.set.bar(0)({})\n{ bar: 0 }\n>\n```\n\n\n### Composition\n\nAll functions need no binding and thus lend themselves perfectly for functional composition.\n\n```javascript\n> fooT = createType([ 'bar' ])\n> r.pipe(\n  () => [ null, {}, { bar: 0 }, fooT.objOf.bar(1) ],\n  r.filter(fooT.has.bar),\n  fooT.pluck.bar\n)()\n[ 0, 1 ]\n```\n\n### Familiar lingo\n\n`objOf`, `has` and `pluck` in the above example are inspired by [Ramda](https://ramdajs.com/) lingo.\n\nSo are `pick`, `pickAll`, `eq`, `over`.\n\n\n## Aliases\n\nIn practice I have found it very helpful to define aliases for props. \n* Under some circumstances the cost for a deep rename might be too high. \n* Or you might be unable to change the prop name at all, e.g. when using an external API. \n* Or you might actually want to have both, a simple name and a very precise one. Say you have a prop called `f72OriginalClosingDay`. This name is very precise in the domain of [Schlussnoten](https://de.wikipedia.org/wiki/Schlussnote) and we might want to keep it for reference. At the same time, it is a pain to use. So we might want to alias it to `originalClosing`.\n\n```javascript\n> fooT = createType([ {someVeryLongAndOrCumbersomeName: { alias: 'bar' }} ])\n…\n> foo = fooT.set.someVeryLongAndOrCumbersomeName(0)({})\n{ someVeryLongAndOrCumbersomeName: 0 }\n> fooT.get.bar(foo)\n0\n```\n\n## Progressive enhancement\n\nYou get getters and setters out of the box. If you want, you can enhance them.\n\n```javascript\n> fooT = createType([ {bar: { get: r.defaultTo(0) }} ])\n…\n> fooT.get.bar({})\n0\n```\n\n```javascript\n> fooT = createType([ {bar: { set: Math.floor }} ])\n…\n> fooT.set.bar(0.5)({})\n{ bar: 0 }\n```\n\n## Relationships between types\n\nInterfaces, inheritance, mixins are largely unexplored at the moment. The value of this approach to typing seems to lie elsewhere, either way.\n\n\n# API\n\n```javascript\n> fooT = createType([ 'bar' ])\n{\n  props: { bar: [Function] },\n  get: { bar: [Function: f1] },\n  pick: { bar: [Function] },\n  pluck: { bar: [Function: f1] },\n  has: { bar: [Function] },\n  eq: { bar: [Function] },\n  set: { bar: [Function: f2] },\n  objOf: { bar: [Function] },\n  over: { bar: [Function: f2] }\n}\n```\n\nPlease refer to the [living doc](./src/living.doc.test.mjs) for details and examples. Should anything be unclear, kindly open an issue, or even a PR.\n\n\n# On types\n\n> Types, huh, yeah!  \n> What are they good for?\n> \n> _– Edwin Starr_\n\nI just thought of this and it made me laugh. It is not my actual position on types. Nor is it Edwin Starr’s.\n\nSo what are types good for? A few things come to mind immediately.\n\n* Autocompletion (simple tooling)\n* Refactoring (advanced tooling) – Nothing in the JS world (nor even in the TS world at the moment) comes even close to what an IDE can do to Java safely.\n* Documentation\n* Type safety\n\nWhen we discuss types in the broader JS ecosystem, in my perception, we talk almost exclusively only about these aspects. These are all valuable things to have. They are not free, however. I generally agree with Eric Elliott regarding the [Type(Script) Tax](https://medium.com/javascript-scene/the-typescript-tax-132ff4cb175b). Loosely summarized: 1) JS tooling isn’t too bad[<sup>1</sup>](#1); 2) if you practice TDD and code reviews, type safety does not save you from too many additional bugs; 3) the cost of working with TS types is greater than the incremental advantages of TS over JS.\n\nBut wait, there is more. Nevermind structural typing. We need a place where to put the behavior of our things. As our things grow and can do more, we naturally put related behaviors close to each other and unrelated behaviors farther away. As we build cohesive modules, we naturally build types.\n\nThis has always been my main motivation for types. More importantly, I naturally gravitated towards building types in this sense in JS, a language that does not exactly force such constructs on you. When building cohesive behavior, of course, you also access the same properties time and time again. \n\nThis coincided with the desire for a simple way to encapsulate property access. It was driven by the wish for some safety. This became a major concern for me when a team that I was working with was writing quite a few tests just in order to guard itself against mistyping property names. The team gave [Flow](https://flow.org/) a try, but found the type tax too high. – I also wanted to be able to progressively enhance the property access.\n\nFinally, because of an intensive use of [Ramda](https://ramdajs.com/), functional composition became a major concern.\n\nThe marriage of these three – behavior honeypot, property access and FP – led me to this type construct.\n\nI use `createType` to scaffold the property access. I then add interesting behavior as it emerges.\n\n\n## Footnotes\n\n1. <a class=\"anchor\" id=\"1\"></a> \nOn [episode #90 of JS Party](https://changelog.com/jsparty/90#transcript-64), Chris Hiller shared how he used TS tooling with JSDoc in order to type-check plain JS. I have not tried this. But it sounds as if you could get most advantages of TS’s type checking without switching to TS. See also <https://www.typescriptlang.org/docs/handbook/type-checking-javascript-files.html>.\n\n\n# What’s with the name?\n\n[“Keep it simple stupid”](https://en.wikipedia.org/wiki/KISS_principle) came to mind immediately when I started looking for a name. There is a distinct lack of sophistication to this approach. Yet, it is useful. – So, “KISS” and “type” were there. I liked the association of “kiss and tell”. So I kept it.\n\nAdded bonus: 😽 and type.\n\n\n# Thanksgiving\n\n* Abelson & Sussman for [“Structure and Interpretation of Computer Programs”](https://en.wikipedia.org/wiki/Structure_and_Interpretation_of_Computer_Programs). Polaris.\n* [Leonie Dreschler-Fischer](https://www.inf.uni-hamburg.de/inst/ab/sav/people/dreschler.html) at the University of Hamburg for introducing me to FP.\n* [Ramda](https://ramdajs.com/) for making FP practical in JS.\n* My colleagues in recent years, who supported me in exploring FP and in developing this approach to typing.\n\n\n# Hacking\n\n* `yarn run check` lints and runs tests\n* `yarn run release` checks and publishes\n\nTypical concerns\n\n* semantics: use enhancer or not?\n  * hypothesis: in most cases probably yes\n","licenseText":"MIT License\n\nCopyright (c) 2019 Alex Bepple\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"kiss-and-type@0.7.0-20","dist":{"shasum":"af2707139a59d670b00c46ac8c9e0a7c1d950ded","integrity":"sha512-FgCMRdT/8cH2ifWhxEkEKJDaFiiIFMtZKlW1/VrcnlEmGXqb6ySrttqFJzwJ0oejHQ8+1/XzdL7EcyoMWf4uHg==","tarball":"https://registry.npmjs.org/kiss-and-type/-/kiss-and-type-0.7.0-20.tgz","fileCount":7,"unpackedSize":17354,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHj7h8AmbQPeLi+g1n4IU94M3CjyP8tYgosajdECDgO+AiEAma9Rdh1z1ebOALdhk6EyVJ+51ZZNuDS758qEE7KyGKo="}]},"_npmUser":{"name":"alexbepple","email":"alex@bepple.de"},"directories":{},"maintainers":[{"name":"alexbepple","email":"alex@bepple.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/kiss-and-type_0.7.0-20_1711109411655_0.9304254473841707"},"_hasShrinkwrap":false},"0.7.0":{"version":"0.7.0","scripts":{"prerelease":"run-s check build","release":"np --yolo","check":"run-p lint test","pre-commit":"run-p lint-fix test","lint":"xo","lint-fix":"xo --fix","test":"mocha","build":"unbuild","version_":"be careful with npm life cycle!","publish_":"be careful with npm life cycle!"},"dependencies":{"ramda":"^0.26.1"},"devDependencies":{"hamjest":"^4.1.0","mocha":"^10.3.0","np":"^10.0.1","npm-run-all":"^4.1.5","typescript":"^5.4.2","unbuild":"^2.0.0","xo":"^0.24.0"},"devDependencies_doc":{"typescript":"required by unbuild, even if unused"},"type":"module","exports":{".":{"import":"./dist/index.mjs","require":"./dist/index.cjs"}},"main":"./dist/index.cjs","publishConfig":{"registry":"https://registry.npmjs.org"},"mocha":{"spec":"src/**/*.test.mjs","reporter":"dot"},"xo":{"envs":["node","mocha"],"prettier":true,"rules":{"capitalized-comments":"off"}},"name":"kiss-and-type","description":"A lightweight approach to typing in plain JavaScript","keywords":["fp","functional","types"],"author":{"name":"Alex Bepple","email":"alex@bepple.de","url":"http://alex.bepple.de"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/alexbepple/kiss-and-type.git"},"licenseText":"MIT License\n\nCopyright (c) 2019 Alex Bepple\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"kiss-and-type@0.7.0","dist":{"shasum":"ef693cae6fd9c637d6d811d607f27039bddb8b5d","integrity":"sha512-eh02HeasIHcWiZ6cp+W0C25B/iCjOq6UMcbY637TqH10Oe9FDZWYgmdJHRsvPcpYhvTlUpadli8hPleTV//wJA==","tarball":"https://registry.npmjs.org/kiss-and-type/-/kiss-and-type-0.7.0.tgz","fileCount":7,"unpackedSize":17351,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCpfrsAnQ3Bl66vMHRBjtd6pREAnfL/vc652bmRDN75xgIhAPDSyTz6ZA8yYzWqdNX2eFqTyKYgEzXYz7YDRKJxjG82"}]},"_npmUser":{"name":"alexbepple","email":"alex@bepple.de"},"directories":{},"maintainers":[{"name":"alexbepple","email":"alex@bepple.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/kiss-and-type_0.7.0_1711109653123_0.7596794583415305"},"_hasShrinkwrap":false},"0.8.0":{"version":"0.8.0","scripts":{"prerelease":"run-s check build","release":"np --yolo","check":"run-p lint test","pre-commit":"run-p lint-fix test","lint":"xo","lint-fix":"xo --fix","test":"mocha","build":"unbuild","version_":"be careful with npm life cycle!","publish_":"be careful with npm life cycle!"},"dependencies":{"ramda":"^0.26.1"},"devDependencies":{"hamjest":"^4.1.0","mocha":"^10.3.0","np":"^10.0.1","npm-run-all":"^4.1.5","typescript":"^5.4.2","unbuild":"^2.0.0","xo":"^0.24.0"},"devDependencies_doc":{"typescript":"required by unbuild, even if unused"},"type":"module","exports":{".":{"import":"./dist/index.mjs","require":"./dist/index.cjs"}},"main":"./dist/index.cjs","publishConfig":{"registry":"https://registry.npmjs.org"},"mocha":{"spec":"src/**/*.test.mjs","reporter":"dot"},"xo":{"envs":["node","mocha"],"prettier":true,"rules":{"capitalized-comments":"off"}},"name":"kiss-and-type","description":"A lightweight approach to typing in plain JavaScript","keywords":["fp","functional","types"],"author":{"name":"Alex Bepple","email":"alex@bepple.de","url":"http://alex.bepple.de"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/alexbepple/kiss-and-type.git"},"licenseText":"MIT License\n\nCopyright (c) 2019 Alex Bepple\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"kiss-and-type@0.8.0","dist":{"shasum":"0cf36eceafb45c4ccbe2830a110f4377db582c3c","integrity":"sha512-MfqEeVuEZisATb5y6V6NHelkLbjiyhJHEG6s2hhH60Q8mozFEQKUmxFeCrsZ2g8o6QUjmXzeoRRyVJcvjxLcTQ==","tarball":"https://registry.npmjs.org/kiss-and-type/-/kiss-and-type-0.8.0.tgz","fileCount":7,"unpackedSize":17648,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCx8Su5aLVTlyLMZhGQYjcoqBTY0IzlBysP9BIi2M7RwAIhAP8jW0cRUJrSX2Av4YUzOHqyeCX1WdHojP2ykCZcXXuY"}]},"_npmUser":{"name":"alexbepple","email":"alex@bepple.de"},"directories":{},"maintainers":[{"name":"alexbepple","email":"alex@bepple.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/kiss-and-type_0.8.0_1711120625279_0.3356420600915828"},"_hasShrinkwrap":false}},"time":{"created":"2019-09-11T23:03:34.993Z","0.1.0":"2019-09-11T23:03:35.090Z","modified":"2024-03-22T15:17:05.837Z","0.1.1":"2019-09-11T23:13:50.481Z","0.2.0":"2019-09-12T22:29:09.929Z","0.2.1":"2019-09-22T14:23:14.471Z","0.2.2":"2019-09-22T15:09:59.823Z","0.3.0":"2019-09-22T22:08:07.915Z","0.3.1":"2019-11-28T19:50:40.398Z","0.4.0":"2019-11-28T22:15:26.724Z","0.4.1":"2019-11-28T22:20:18.965Z","0.4.2":"2024-02-23T09:50:18.687Z","0.4.3":"2024-02-23T11:09:19.062Z","0.4.4-0":"2024-02-23T11:41:26.190Z","0.5.0":"2024-03-15T12:53:45.196Z","0.6.0":"2024-03-15T14:54:08.559Z","0.7.0-0":"2024-03-15T20:49:12.753Z","0.7.0-1":"2024-03-15T21:04:04.363Z","0.7.0-2":"2024-03-15T21:22:33.349Z","0.7.0-3":"2024-03-15T21:29:32.113Z","0.7.0-4":"2024-03-15T21:33:06.364Z","0.7.0-5":"2024-03-15T21:36:38.235Z","0.7.0-6":"2024-03-15T21:46:24.493Z","0.7.0-7":"2024-03-15T21:47:46.797Z","0.7.0-8":"2024-03-15T21:57:26.012Z","0.7.0-9":"2024-03-15T21:58:33.295Z","0.7.0-10":"2024-03-15T21:59:58.351Z","0.7.0-11":"2024-03-16T14:37:46.290Z","0.7.0-12":"2024-03-18T11:56:43.621Z","0.7.0-13":"2024-03-18T11:58:36.096Z","0.7.0-14":"2024-03-22T09:37:21.786Z","0.7.0-15":"2024-03-22T09:43:21.465Z","0.7.0-16":"2024-03-22T09:45:58.641Z","0.7.0-17":"2024-03-22T09:48:57.798Z","0.7.0-18":"2024-03-22T09:55:25.034Z","0.7.0-19":"2024-03-22T10:31:17.907Z","0.7.0-20":"2024-03-22T12:10:11.819Z","0.7.0":"2024-03-22T12:14:13.334Z","0.8.0":"2024-03-22T15:17:05.423Z"},"maintainers":[{"name":"alexbepple","email":"alex@bepple.de"}],"license":"MIT","readme":"[![npm version](https://img.shields.io/npm/v/kiss-and-type.svg)](https://www.npmjs.com/package/kiss-and-type)\n\n\n# What is this?\n\nA lightweight approach to typing in plain JavaScript.\n\nYou might enjoy some advantages of more common type systems without the need to change your language and tooling. You might enjoy some unexpected advantages as well.\n\n\n# Features\n\nLet’s look at the practical aspects first. – If you are really interested, more general and slightly deeper thoughts on typing are [further down](#on-types).\n\n\n## Some safety\n\n```javascript\n> fooT = createType([ 'bar' ])\n…\n> fooT.get.baz\nThrown:\nTypeError: Unknown property 'baz'\n…\n```\n\n## Immutable\n\nBy default, all operations are immutable.\nHowever, immutability is not enforced in any fashion on the objects.\n\n```javascript\n> fooT = createType(['bar'])\n…\n> foo1 = fooT.set.bar(0)({})\n{ bar: 0 }\n> foo2 = fooT.set.bar(1)(foo1)\n{ bar: 1 }\n> foo1\n{ bar: 0 }\n```\n\n## Functional programming\n\n### Data-last and curried\n\n```javascript\n> fooT = createType([ 'bar' ])\n…\n> fooT.set.bar(0, {})\n{ bar: 0 }\n> fooT.set.bar(0)({})\n{ bar: 0 }\n>\n```\n\n\n### Composition\n\nAll functions need no binding and thus lend themselves perfectly for functional composition.\n\n```javascript\n> fooT = createType([ 'bar' ])\n> r.pipe(\n  () => [ null, {}, { bar: 0 }, fooT.objOf.bar(1) ],\n  r.filter(fooT.has.bar),\n  fooT.pluck.bar\n)()\n[ 0, 1 ]\n```\n\n### Familiar lingo\n\n`objOf`, `has` and `pluck` in the above example are inspired by [Ramda](https://ramdajs.com/) lingo.\n\nSo are `pick`, `pickAll`, `eq`, `over`.\n\n\n## Aliases\n\nIn practice I have found it very helpful to define aliases for props. \n* Under some circumstances the cost for a deep rename might be too high. \n* Or you might be unable to change the prop name at all, e.g. when using an external API. \n* Or you might actually want to have both, a simple name and a very precise one. Say you have a prop called `f72OriginalClosingDay`. This name is very precise in the domain of [Schlussnoten](https://de.wikipedia.org/wiki/Schlussnote) and we might want to keep it for reference. At the same time, it is a pain to use. So we might want to alias it to `originalClosing`.\n\n```javascript\n> fooT = createType([ {someVeryLongAndOrCumbersomeName: { alias: 'bar' }} ])\n…\n> foo = fooT.set.someVeryLongAndOrCumbersomeName(0)({})\n{ someVeryLongAndOrCumbersomeName: 0 }\n> fooT.get.bar(foo)\n0\n```\n\n## Progressive enhancement\n\nYou get getters and setters out of the box. If you want, you can enhance them.\n\n```javascript\n> fooT = createType([ {bar: { get: r.defaultTo(0) }} ])\n…\n> fooT.get.bar({})\n0\n```\n\n```javascript\n> fooT = createType([ {bar: { set: Math.floor }} ])\n…\n> fooT.set.bar(0.5)({})\n{ bar: 0 }\n```\n\n## Relationships between types\n\nInterfaces, inheritance, mixins are largely unexplored at the moment. The value of this approach to typing seems to lie elsewhere, either way.\n\n\n# API\n\n```javascript\n> fooT = createType([ 'bar' ])\n{\n  props: { bar: [Function] },\n  get: { bar: [Function: f1] },\n  pick: { bar: [Function] },\n  pluck: { bar: [Function: f1] },\n  has: { bar: [Function] },\n  eq: { bar: [Function] },\n  set: { bar: [Function: f2] },\n  objOf: { bar: [Function] },\n  over: { bar: [Function: f2] }\n}\n```\n\nPlease refer to the [living doc](./src/living.doc.test.mjs) for details and examples. Should anything be unclear, kindly open an issue, or even a PR.\n\n\n# On types\n\n> Types, huh, yeah!  \n> What are they good for?\n> \n> _– Edwin Starr_\n\nI just thought of this and it made me laugh. It is not my actual position on types. Nor is it Edwin Starr’s.\n\nSo what are types good for? A few things come to mind immediately.\n\n* Autocompletion (simple tooling)\n* Refactoring (advanced tooling) – Nothing in the JS world (nor even in the TS world at the moment) comes even close to what an IDE can do to Java safely.\n* Documentation\n* Type safety\n\nWhen we discuss types in the broader JS ecosystem, in my perception, we talk almost exclusively only about these aspects. These are all valuable things to have. They are not free, however. I generally agree with Eric Elliott regarding the [Type(Script) Tax](https://medium.com/javascript-scene/the-typescript-tax-132ff4cb175b). Loosely summarized: 1) JS tooling isn’t too bad[<sup>1</sup>](#1); 2) if you practice TDD and code reviews, type safety does not save you from too many additional bugs; 3) the cost of working with TS types is greater than the incremental advantages of TS over JS.\n\nBut wait, there is more. Nevermind structural typing. We need a place where to put the behavior of our things. As our things grow and can do more, we naturally put related behaviors close to each other and unrelated behaviors farther away. As we build cohesive modules, we naturally build types.\n\nThis has always been my main motivation for types. More importantly, I naturally gravitated towards building types in this sense in JS, a language that does not exactly force such constructs on you. When building cohesive behavior, of course, you also access the same properties time and time again. \n\nThis coincided with the desire for a simple way to encapsulate property access. It was driven by the wish for some safety. This became a major concern for me when a team that I was working with was writing quite a few tests just in order to guard itself against mistyping property names. The team gave [Flow](https://flow.org/) a try, but found the type tax too high. – I also wanted to be able to progressively enhance the property access.\n\nFinally, because of an intensive use of [Ramda](https://ramdajs.com/), functional composition became a major concern.\n\nThe marriage of these three – behavior honeypot, property access and FP – led me to this type construct.\n\nI use `createType` to scaffold the property access. I then add interesting behavior as it emerges.\n\n\n## Footnotes\n\n1. <a class=\"anchor\" id=\"1\"></a> \nOn [episode #90 of JS Party](https://changelog.com/jsparty/90#transcript-64), Chris Hiller shared how he used TS tooling with JSDoc in order to type-check plain JS. I have not tried this. But it sounds as if you could get most advantages of TS’s type checking without switching to TS. See also <https://www.typescriptlang.org/docs/handbook/type-checking-javascript-files.html>.\n\n\n# What’s with the name?\n\n[“Keep it simple stupid”](https://en.wikipedia.org/wiki/KISS_principle) came to mind immediately when I started looking for a name. There is a distinct lack of sophistication to this approach. Yet, it is useful. – So, “KISS” and “type” were there. I liked the association of “kiss and tell”. So I kept it.\n\nAdded bonus: 😽 and type.\n\n\n# Thanksgiving\n\n* Abelson & Sussman for [“Structure and Interpretation of Computer Programs”](https://en.wikipedia.org/wiki/Structure_and_Interpretation_of_Computer_Programs). Polaris.\n* [Leonie Dreschler-Fischer](https://www.inf.uni-hamburg.de/inst/ab/sav/people/dreschler.html) at the University of Hamburg for introducing me to FP.\n* [Ramda](https://ramdajs.com/) for making FP practical in JS.\n* My colleagues in recent years, who supported me in exploring FP and in developing this approach to typing.\n\n\n# Hacking\n\n* `yarn run check` lints and runs tests\n* `yarn run release` checks and publishes\n\nTypical concerns\n\n* semantics: use enhancer or not?\n  * hypothesis: in most cases probably yes\n","readmeFilename":"README.md","description":"A lightweight approach to typing in plain JavaScript","keywords":["fp","functional","types"],"repository":{"type":"git","url":"git+https://github.com/alexbepple/kiss-and-type.git"},"author":{"name":"Alex Bepple","email":"alex@bepple.de","url":"http://alex.bepple.de"}}