{"_id":"urlcat","_rev":"11-9fa1f65c11f2826d4a4a49fea558aba7","name":"urlcat","dist-tags":{"latest":"3.1.0","next":"3.0.1-rc1"},"versions":{"0.1.0":{"name":"urlcat","version":"0.1.0","description":"A library for concatenating URL's.","repository":{"type":"git","url":"git+https://github.com/balazsbotond/urlcat.git"},"main":"dist/index.js","types":"dist/index.d.ts","scripts":{"clean":"shx rm -rf dist","clean:test":"shx rm -rf dist-test","prebuild":"npm run clean","build":"tsc -p .","prebuild:test":"npm run clean:test","build:test":"tsc -p ./tsconfig-test.json","pretest":"npm run build:test","test":"mocha 'dist-test/test/**/*.js'","prepublish":"npm test && npm run build"},"keywords":["url","uri","build","builder","concat","concatenate"],"author":{"name":"Botond Balazs"},"license":"MIT","dependencies":{},"devDependencies":{"@types/chai":"^4.2.12","@types/mocha":"^8.0.3","chai":"^4.2.0","cross-env":"^7.0.2","mocha":"^8.1.3","shx":"^0.3.2","ts-node":"^9.0.0","typescript":"^4.0.2"},"gitHead":"c5fc43ef96452301ebb55763d865e7f32cc9333a","bugs":{"url":"https://github.com/balazsbotond/urlcat/issues"},"homepage":"https://github.com/balazsbotond/urlcat#readme","_id":"urlcat@0.1.0","_nodeVersion":"12.18.3","_npmVersion":"6.14.6","dist":{"integrity":"sha512-HJQbGP3iFfuRZr92I1I/HpdiLEzoP5wfSkfquC4taHW9xEZ7RoKmEcA63YQGX1uCl9t6GMiO3KW+S4aUQTeEAg==","shasum":"4c665390168f9e4534eebfaf78ff244fae382dca","tarball":"https://registry.npmjs.org/urlcat/-/urlcat-0.1.0.tgz","fileCount":5,"unpackedSize":7020,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfalTcCRA9TVsSAnZWagAAk84QAI2iYdz7QvcsOLKllLTR\nCs5DgiNmD9I72y/rvABRXuET50nhGuxcmwNaO6M0gdtNfMZHjX5RWrzd+nRf\nlFmT4EtFMxpYEIcdv1eK8/RXxV+0l7Z/rOgGIfmm6BOEeYegB1Oc5beVjfnN\nnpQiFCf5PoRfYhfP019Q1RKUGC1yUOHBjFlSOh45hrfol8t2ReA7GIwXQg/w\nIGbjObMUGwQM5j2laQCZD0e5H8xweCuan+hqllW1WWkvonCqNP+LYfNsqxGk\nbBuDvuo7gMCL1M3Cb16P1ipNAmZ0HmM0TGYAVVGitfZABwuhTwYShAFu/7V1\nIts3zeoPeuGiES6OrCmFyURzdvpKP5KfgIdY5vbqyYe34e23UHy2rmCcvY1Q\nV7k+UFA1cVdUGNXa+dRhhzdUTRU4P4h5ipr1wI+cuuCN3f2rbNQe0iBNV/9Z\nmhjOAHwD3J6uDhCESwa9GAiPku+1ieKslW2VAYhfqhFAitbyiXiW00CdzkLs\nplEi8ff0K2UmD3d5HBQFr1dNEK2PraLbGFdCu7Z6uNX1ACZ7S8OvOKs749u5\npyEI5H/vUN4BZo8uKjJKJTNc1eKtHrErCio/XHvt9vLyC8lnkDJy5oiYTcje\nFBO9j1XQ2oA/A75XwpbCDJu64gg1+klTtHSUjverqaSH3MdwVT1oO61h7x1M\nmr1P\r\n=xAJX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGEAUlbbHAiMNAG6t7bLhPtI/QXjuu53/Rm2lP8SeV4oAiB6VfbDUeNX5uqiYqB77gjYtn+RlqJX0QGY/88XlKjMOw=="}]},"maintainers":[{"name":"balazsbotond","email":"balazsbotond@gmail.com"}],"_npmUser":{"name":"balazsbotond","email":"balazsbotond@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/urlcat_0.1.0_1600804059739_0.5941140441267796"},"_hasShrinkwrap":false},"1.0.0":{"name":"urlcat","version":"1.0.0","description":"A library for concatenating URL's.","repository":{"type":"git","url":"git+https://github.com/balazsbotond/urlcat.git"},"main":"dist/index.js","types":"dist/index.d.ts","scripts":{"clean":"shx rm -rf dist","clean:test":"shx rm -rf dist-test","prebuild":"npm run clean","build":"tsc -p .","prebuild:test":"npm run clean:test","build:test":"tsc -p ./tsconfig-test.json","pretest":"npm run build:test","test":"mocha 'dist-test/test/**/*.js'","prepublish":"npm test && npm run build"},"keywords":["url","uri","build","builder","concat","concatenate"],"author":{"name":"Botond Balazs"},"license":"MIT","dependencies":{},"devDependencies":{"@types/chai":"^4.2.12","@types/mocha":"^8.0.3","chai":"^4.2.0","cross-env":"^7.0.2","mocha":"^8.1.3","shx":"^0.3.2","ts-node":"^9.0.0","typescript":"^4.0.2"},"gitHead":"29fbf0987313a39386eda39ab6c3bb4622ac219b","bugs":{"url":"https://github.com/balazsbotond/urlcat/issues"},"homepage":"https://github.com/balazsbotond/urlcat#readme","_id":"urlcat@1.0.0","_nodeVersion":"12.18.3","_npmVersion":"6.14.6","dist":{"integrity":"sha512-5doA9ifZIHh26nokj0rSC2D06kLTAUcMOCfZX8d5Ik1L6TfadpOE1zpstrziLpC61S27+YOJXE6qWhinplyM6g==","shasum":"f96a92475ead19aca54d46a6aea1c7ee1fa86ac9","tarball":"https://registry.npmjs.org/urlcat/-/urlcat-1.0.0.tgz","fileCount":5,"unpackedSize":13073,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfazR1CRA9TVsSAnZWagAAsWQP+QF0ax9DO1wcHOUlKv9M\nbKI2uaV8+bms8yDyVurW4h9iQBcDPdHqgk9uDG0g3LPafdhPlFZ28Bo91GAL\n2pboNVgm58nT1cmS2Kbr24hhopUM80i/MiPcTfJHgAiY7h2b2RPLd7B4uLmr\ndYBj079aaZS6syw01oxbizgycQgYB/0Q+kcs3kkUl0rRTHUhwWHq/56lvo9Y\nZXYPxSH2AVIr8eUpcWlgz64r0Ag0ET263AmmrI5SjN/OVEuoFR8bbQQfLiui\neZqSqK3xPFBtkldDpXv//WPdEPQ4+HrrY4B1QDxH5+LpAZKn9sL68Dv4GmGI\n7idmrXrbZvLwNMoSWgajKPvesiwQbJUTE1x7nOx1GJ3fv5yg2HTWNxp/77u5\nHG3FSxzSrKdECWLLYXB0FNS47gPmRvuvGM5TcdMsB8os3ijls1KkY9AevpTK\nkPKR83B+PimWHn3toLcxWJtf9xx1Re1SBRm97RAWWy/ncJwzd+i0eQOoBFdI\nk/T4/UdEkiEXzqbh9+WMwjPdJDLH7d8ntBrPWZwHQx1hEtlfJpRlRP+khUPs\nzS6blHukVGCXrHdajS2IQwDL+ttJblHWgngVhoTSOWJgKFeHcOHGnpmLJvVb\nWtyNlmeRsCnDDwfMXgSz8MInQ5X9OZgh3Jh6bgv9G0lVIhzTdoybEgmVbfl5\nIoBV\r\n=Pxvj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCd+SL0wNoLN/7h76gR5gKPG1OFlGnNv1TqqpwBc2Ej9QIhANklzfGMykB/zAXK/7zCimKXHTskiPxytg0uHgasUjZa"}]},"maintainers":[{"name":"balazsbotond","email":"balazsbotond@gmail.com"}],"_npmUser":{"name":"balazsbotond","email":"balazsbotond@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/urlcat_1.0.0_1600861301454_0.37684029589310253"},"_hasShrinkwrap":false},"1.0.1":{"name":"urlcat","version":"1.0.1","description":"A library for concatenating URL's.","repository":{"type":"git","url":"git+https://github.com/balazsbotond/urlcat.git"},"main":"dist/index.js","types":"dist/index.d.ts","scripts":{"clean":"shx rm -rf dist","clean:test":"shx rm -rf dist-test","prebuild":"npm run clean","build":"tsc -p .","prebuild:test":"npm run clean:test","build:test":"tsc -p ./tsconfig-test.json","pretest":"npm run build:test","test":"mocha 'dist-test/test/**/*.js'","prepublish":"npm test && npm run build"},"keywords":["url","uri","build","builder","concat","concatenate"],"author":{"name":"Botond Balazs"},"license":"MIT","dependencies":{},"devDependencies":{"@types/chai":"^4.2.12","@types/mocha":"^8.0.3","chai":"^4.2.0","cross-env":"^7.0.2","mocha":"^8.1.3","shx":"^0.3.2","ts-node":"^9.0.0","typescript":"^4.0.2"},"gitHead":"e41005823730411c35fe0a0216d89b486a8acc97","bugs":{"url":"https://github.com/balazsbotond/urlcat/issues"},"homepage":"https://github.com/balazsbotond/urlcat#readme","_id":"urlcat@1.0.1","_nodeVersion":"12.18.3","_npmVersion":"6.14.6","dist":{"integrity":"sha512-JhyMjD3MJiJLyvKBZhEEWsB7leHz7W+P2QnUhGPx5wIu+NPTguaDLd3ExEyYiIfwyYwaQJiitPyBYOssuCa7mw==","shasum":"0669a14806f71eb1427a8ee1d0cbf478dfea1060","tarball":"https://registry.npmjs.org/urlcat/-/urlcat-1.0.1.tgz","fileCount":5,"unpackedSize":14539,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfbEs+CRA9TVsSAnZWagAAGdIP/2qnoqsJe8Ca4x1OzMLo\n51+EUJST7QDCcWcN9I4/D/HqJlS511UMpfYd8u4ilicPrtP5ucXf6NY1rc+w\n0AKxQ8K84RRYioE8Qf5BYs68dQFsqbwfrLiKqwPoSQQBIWNWz8U40sYkYXg7\na14G7HX87BsZz3wuHTUlPKKGWBrSybZTl8dqACjK/VQ8rFuhvzDzxU7BEQgk\nE3f/wdQgRzsBIhnn/UDMqNba7kSQ7wvk9dQmkGdU6iEodtMjyPTCcjcyRAhK\nhlMSVbhwo7bDnoM/xO6rPXb6//Kf4cysnKGZaTZyVQHNdwPCYDgXxUxhWPZh\nQ/qy7xKZML7IFUE3WKIBZKN0O13Sw/wi3OaTrxMP7A/cVG1ttxM3lS4nd1ev\nvEdV9pz6Oo+qCMG3W6FtJBcTObUbOlzTJ3CoZge/epvFWfB4UGeiFCiaL0x9\nQtMEEcuCIxcTgmNq4mV87iyWGKbrPEoLdYdreFe9ICgZSBjOtQeyNI7uq5pI\nvXtFRgSOwyROmeZjNA0VqoVREEihBqh81yBkQNSSgsXQp5T1zYE8Rr5hv/AI\nAwmsTY1MwAIkWJeJnKcDtGcL0ng7b07Mq3DZAboFoxW20+BH0I635EwSayyf\nejl3F6sadSl7H0VtwT7N8Wk6hOZ0l+Kl5jfJKkkMck6QKkiUyHUid5qmywsV\n9ECO\r\n=7Xyt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC/DYqdOI350IFKaF1hGegWfZxQ3mv+HtOojibymUyWKAIhANcEI23V6uBW/3HYXASFj+HOE5znoBtplAf0ToY6VTu7"}]},"maintainers":[{"name":"balazsbotond","email":"balazsbotond@gmail.com"}],"_npmUser":{"name":"balazsbotond","email":"balazsbotond@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/urlcat_1.0.1_1600932670181_0.17496452249332806"},"_hasShrinkwrap":false},"2.0.0":{"name":"urlcat","version":"2.0.0","description":"A library for concatenating URL's.","repository":{"type":"git","url":"git+https://github.com/balazsbotond/urlcat.git"},"main":"dist/index.js","types":"dist/index.d.ts","scripts":{"clean":"shx rm -rf dist","clean:test":"shx rm -rf dist-test","prebuild":"npm run clean","build":"tsc -p .","prebuild:test":"npm run clean:test","build:test":"tsc -p ./tsconfig-test.json","pretest":"npm run build:test","test":"mocha 'dist-test/test/**/*.js'","prepublish":"npm test && npm run build"},"keywords":["url","uri","build","builder","concat","concatenate"],"author":{"name":"Botond Balazs"},"license":"MIT","dependencies":{},"devDependencies":{"@types/chai":"^4.2.12","@types/mocha":"^8.0.3","chai":"^4.2.0","cross-env":"^7.0.2","mocha":"^8.1.3","shx":"^0.3.2","ts-node":"^9.0.0","typescript":"^4.0.2"},"gitHead":"2d5359d3a4f625c39bc9b5c17311d117fb172ab4","bugs":{"url":"https://github.com/balazsbotond/urlcat/issues"},"homepage":"https://github.com/balazsbotond/urlcat#readme","_id":"urlcat@2.0.0","_nodeVersion":"12.18.3","_npmVersion":"6.14.6","dist":{"integrity":"sha512-ZnBnJ+v37DPvzQVbrCuFQyQL/dR4xqBUSvxrCZF7ozXUxCw8cmk+tKACd9skyk9P2mXyxGWaCOaOp+n2Q5CCiA==","shasum":"49238312962f0c9cbd96eec6bd7500e2a01073b3","tarball":"https://registry.npmjs.org/urlcat/-/urlcat-2.0.0.tgz","fileCount":5,"unpackedSize":14624,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfbGq/CRA9TVsSAnZWagAAX6QP/2UUZMUwK4ZO8Q0vFvFp\n7xd4cMRMbEKb/GtoUhRKH4bzFbyWozwlNekuiFu8AGwFzOB0saQ5oO2iRLxr\n+bOMt35QS2P9pkUS0v66DG/SWOddoMv2TV9HOaW9FEB0xCMinyb2HFSnWCei\nJesnW2vY4KaX+Bhu54U+tidiYWbokJ3KNrgzhVaaRlFp1IOxVjTaSiLQ0oia\n1o+2Nc9OKiyLhmnYvpx31L4+iYLxA9cYqXyO+grZtnl3ncOCpymg9W6TGnT3\n+dCXKIgKt8xjGvGykPeIZk3JTB3251+c7JNyQoVtJprOdl5K6DkdK3mnPC5z\nKALDh4LyIjHidlPAKpG8mw+0BlgRzEBtf9XhzfZ8RKPA/VD3/QXQShI9Y4wR\nc14ADfF4yP3Kae3Vpm2wIpCi9daBgXJkvW6OeILSgcVJRCyHVzIPpOXrJZs3\nHYuxTeDhfZGZo/B2eAKB3wre85EU+7ZSPOZo14sAPqV89nIxVQcTITPiTCsI\nWX65pQxlLYo8vy9gxof8cyW0DkO/1L0XN9I9HA176vclelnrMwIe25W+qoiT\ntIx7Ca6uUwK47BYdTb2p7duFqbW8GF7D0Ufs5Qzylq3PCmT0oiR6ZxI1YBY5\nUdiHlP3vNhcyfQhwT0e1GaG9qgv83dNFHe0QcFlCvlFs1HrQzwbQtEMx1HKJ\n8DhT\r\n=DDh9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIH/XyxLsKriSeISVbuIC4ch4aH6wDN55gGWnTHtiEaH2AiA73+Iwhl5SEF7LiZNZWmhRfR6yq3D3jiVcWwyyPTVmww=="}]},"maintainers":[{"name":"balazsbotond","email":"balazsbotond@gmail.com"}],"_npmUser":{"name":"balazsbotond","email":"balazsbotond@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/urlcat_2.0.0_1600940734875_0.9834213595331722"},"_hasShrinkwrap":false},"2.0.1":{"name":"urlcat","version":"2.0.1","description":"A library for concatenating URL's.","repository":{"type":"git","url":"git+https://github.com/balazsbotond/urlcat.git"},"main":"dist/index.js","types":"dist/index.d.ts","scripts":{"clean":"shx rm -rf dist","clean:test":"shx rm -rf dist-test","prebuild":"npm run clean","build":"tsc -p .","prebuild:test":"npm run clean:test","build:test":"tsc -p ./tsconfig-test.json","pretest":"npm run build:test","test":"mocha 'dist-test/test/**/*.js'","prepublish":"npm test && npm run build"},"keywords":["url","uri","build","builder","concat","concatenate"],"author":{"name":"Botond Balazs"},"license":"MIT","dependencies":{},"devDependencies":{"@types/chai":"^4.2.12","@types/mocha":"^8.0.3","chai":"^4.2.0","cross-env":"^7.0.2","mocha":"^8.1.3","shx":"^0.3.2","ts-node":"^9.0.0","typescript":"^4.0.2"},"gitHead":"2d0184c0d65f8f5fa4ff4fb5318e904d3c831713","bugs":{"url":"https://github.com/balazsbotond/urlcat/issues"},"homepage":"https://github.com/balazsbotond/urlcat#readme","_id":"urlcat@2.0.1","_nodeVersion":"12.18.3","_npmVersion":"6.14.6","dist":{"integrity":"sha512-t2Mm/LDvXx7jUWApD0nIAtxd0N6CGtZvgakOgE4o+AyabA8iwpBv5l+TkULexn0UmmSxpuS41+Rs+q/jjr2l8w==","shasum":"58fbb99d0844cd9590cbcb8a64d1ed5263c71754","tarball":"https://registry.npmjs.org/urlcat/-/urlcat-2.0.1.tgz","fileCount":5,"unpackedSize":14704,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfbHP1CRA9TVsSAnZWagAAxtcP/iOwjNNWesAl4eFa6YS+\nHm5vKWAczNDn7T+bh1BmzQ9xab8kfeZhBD3shgc+U7d2jOSmClzFL2e/s6NP\nHKS9Xvnhs8M81nBPpqaBJnpC/qDqJZKMpLt2qqYXErifOvV1bc07FG2GHiFG\n61RikWTn/ziS6srmtOwkOTy4iHpU9+4ORCZMOKm6MHGBNwCDdiwTQnyhgNUf\nSUQ11rmV+dIDaH4RsMT0ihlkgHh/TcNDbxZh72vXlNSxC2ubuHpYlA39D79o\neop8hCH5O2Zm+vbkNIzm48IZPz/+QMW0HCPHTEURx03d7Tif+GpXbfOdmsj1\nQepaYOrYyCNFpq76/o7AXCp1cGBqQ4uVKkwRuCo6Fry0vOL1fqVT7+c1NK4J\nbE9ewp8XdnQ2vHStX8ysZxRE2ktmUjuFXcPJd9ZHHt0fKohxI/z+dYiYrOwB\nV/CJiLOT3+i8cU32zQ7L2M0GJUoKEkyelylSP5Dnlgvn9/LXSWfbAZUT7EMK\ngcqVNtR6qN8TgvI57y217Ods9N5jb49k2wQN4Eavgd+Isv4/NStZ+Yo9R/qN\n9cjAjfjchWA9dXIadRKRG6DQU6nbXBJDcBzKN4Mqa52/PYIoBC+QwDuQ7Cxc\nPOfOidKe5z0DgrFEu8sH0xnN2vEqGn8Dojympkb+o3JyzUd1N6zmREdPxBO0\nqskU\r\n=Sudb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC2wRnLqpyFlFpiOzPHQjmeb9hqknaflIBn5WW2Sx7dhAIhAPHf2/vylFQce4627DS8WUKJ4a7eItcvue/HyEED2xgH"}]},"maintainers":[{"name":"balazsbotond","email":"balazsbotond@gmail.com"}],"_npmUser":{"name":"balazsbotond","email":"balazsbotond@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/urlcat_2.0.1_1600943092782_0.7580126729160928"},"_hasShrinkwrap":false},"2.0.2":{"name":"urlcat","version":"2.0.2","description":"A library for concatenating URL's.","repository":{"type":"git","url":"git+https://github.com/balazsbotond/urlcat.git"},"main":"dist/index.js","types":"dist/index.d.ts","scripts":{"clean":"shx rm -rf dist","clean:test":"shx rm -rf dist-test","prebuild":"npm run clean","build":"tsc -p .","prebuild:test":"npm run clean:test","build:test":"tsc -p ./tsconfig-test.json","pretest":"npm run build:test","test":"mocha 'dist-test/test/**/*.js'","prepublish":"npm test && npm run build"},"keywords":["url","uri","build","builder","concat","concatenate"],"author":{"name":"Botond Balazs"},"license":"MIT","dependencies":{},"devDependencies":{"@types/chai":"^4.2.12","@types/mocha":"^8.0.3","chai":"^4.2.0","cross-env":"^7.0.2","mocha":"^8.1.3","shx":"^0.3.2","ts-node":"^9.0.0","typescript":"^4.0.2"},"gitHead":"e7db356ea5bcc0ff6739fa9f1284ad982f470e65","bugs":{"url":"https://github.com/balazsbotond/urlcat/issues"},"homepage":"https://github.com/balazsbotond/urlcat#readme","_id":"urlcat@2.0.2","_nodeVersion":"12.18.3","_npmVersion":"6.14.6","dist":{"integrity":"sha512-vl/zC1/dEQmXBs9D+hpX4H5EJbuIlaSAHVkGEwo8k87A/9Um2d2sRzIABbGhS/3wMOzBy3E/EgfmYNdty4usTQ==","shasum":"5483126ed098d3c6e8b2bb0b4c708b9b596d48be","tarball":"https://registry.npmjs.org/urlcat/-/urlcat-2.0.2.tgz","fileCount":5,"unpackedSize":15096,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfbxY6CRA9TVsSAnZWagAA+QQQAIeEcNrjjHZIyr0lesg0\nTfUmzf4JAS8mb4TimkuuHHXZIFvm9zYhYEOHta/LS2ClRlkfnM/B+Y5j0IiH\nu42zIwmsoth215u0D+BYXCC4N4uUU+JDnOoXZg1QDXpFjaR0ivDXjtGKLp/8\nHbSaHY1z1UX/uM24CBVYNcA7LYRf4FjB6XfLVN1Fz1KI1Ub0jQ366zMyyUpM\neLX4B2uiA4QcozClKqMfJi2RmxbQAsbnoldoIlf7ezJ92u4THMP+AEhjsoGz\nTzQmoMbo77WIr2+M/3QlvSrAxo+6yN+FeJYhBSCxFYzwiWJ3GvDBsO2V+gT0\niM+GeRkSJoo78pRKJaG4Pzoq6dNnvbWGla4PNBW9dNL/Gvbpm33bMhjAKOq4\n1BCuF8fUaVzTklW+qJQ4Gimyu4QZgV7WOwj86UBV1qgHkaQ2/M6Z3tieFf0v\noms8F6r2LkGRrc2qng0gY4e5GV5My+uM1JUVQlEEcOMXwV2KGoMW76X93QQ0\nicwoGG9ELntZGGB+8cv+lcUZvlwC75TzMiW19/riCDx2y2OsCcc6ETQ3NTpK\neiTqepVLg3nyCdu0ZGLtVg9mKGd724n8z6WlZ3O4OSrSZJ53D7FgGT3Ea94j\nCaHbe3fKLuc5ikjVRo6KZzc42vz//GGoTLaW57dZHV47sgaR2tS6kgRlAdle\nVle7\r\n=qBUn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDXHjspu1F1hvkCXaeD8itx4ZDTrrLlVp9btdLqYhnb5QIgLvO/IWAMg7WaDfWTTSqk9+im92FY9qrpjbDDsDuP+DA="}]},"maintainers":[{"name":"balazsbotond","email":"balazsbotond@gmail.com"}],"_npmUser":{"name":"balazsbotond","email":"balazsbotond@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/urlcat_2.0.2_1601115706123_0.07535127218870308"},"_hasShrinkwrap":false},"2.0.3":{"name":"urlcat","version":"2.0.3","description":"A library for concatenating URL's.","repository":{"type":"git","url":"git+https://github.com/balazsbotond/urlcat.git"},"main":"dist/index.js","types":"dist/index.d.ts","scripts":{"clean":"shx rm -rf dist","clean:test":"shx rm -rf dist-test","prebuild":"npm run clean","build":"tsc -p .","prebuild:test":"npm run clean:test","build:test":"tsc -p ./tsconfig-test.json","pretest":"npm run build:test","test":"nyc --reporter html --reporter text mocha --timeout 10000 --exit 'dist-test/test/**/*.js'","lint":"tslint -c tslint.json 'src/**/*.ts'","coverage":"nyc report --reporter text-lcov | coveralls","prepublish":"npm test && npm run build"},"keywords":["url","uri","build","builder","concat","concatenate"],"author":{"name":"Botond Balazs"},"license":"MIT","dependencies":{},"devDependencies":{"@types/chai":"4.2.12","@types/mocha":"8.0.3","chai":"4.2.0","coveralls":"3.1.0","mocha":"8.1.3","mocha-lcov-reporter":"1.3.0","nyc":"15.1.0","shx":"0.3.2","tslint":"6.1.3","typescript":"4.0.3"},"gitHead":"6e9ceea65c15a6b4a49f9ee6dc8c193a8016bd1b","bugs":{"url":"https://github.com/balazsbotond/urlcat/issues"},"homepage":"https://github.com/balazsbotond/urlcat#readme","_id":"urlcat@2.0.3","_nodeVersion":"12.18.3","_npmVersion":"6.14.6","dist":{"integrity":"sha512-OLjJiLPYkQZf5uHl3fIStJHtvd8l6L8yexiccElcu0g45c51zgAWChFNEhAUeouchDq//X3vg87kfqQekMaSKA==","shasum":"585661f8bc638be80d5404e5692f0253c6325b13","tarball":"https://registry.npmjs.org/urlcat/-/urlcat-2.0.3.tgz","fileCount":5,"unpackedSize":25327,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfdY1sCRA9TVsSAnZWagAAtRgQAI4aANJv/a8NLBZifHAW\nA8xqKB4IhkI3rrqzdwNnKHAIEda0L9N9CUveQ5E8Tq4ZTW1dnXH9ylYKH4Bl\n/wi3nzqwGTatNJ2LoFwJ3MCJkM7CYSV0OHcpAKOrwP5st4bgDEpnaXPhVqQS\nrwSu4F3XABiBRIRSUG1fjd7LKDRbHNKBWThV3hpmkw17jGeY0WBBivuJg5BY\n5LvkjEFMp8b1sASBWfGlKe4Xcwm1lc221gM5yiEH5xtDU3qVqXHrj1AhH5rw\nyiKUMbWblWKO1hG/dGzdcG4pFY73lP0nOqctqV/3tXCsXh4pK36HdN4qViyZ\nkQ62UmhGuVNSeQrafAqyWRqo2nIBSHaa99nDTqDdv9SWo855vNjueWEEVKQd\nIMQFDc7Ghf6byMyTA/M8lxMNtokA+VBjlP8A/P5eK5AZ0U9ahR+6aPFmpDnb\n8ufVBicflxY0iwcR8/lX/2EQJ/wYyNXhOdO9hfD19EwXmD5Oy3+iXev0WbVO\nhZsqsKIgvEYk7lbpycNPY+d+YBDk1+AZJvjzJexRO2UZwp7NMfrqvPhz4CLK\ngpeTuwOYqAkKHU+qqYf89fuAU4p87aEIGZDmGtsjNDLYZG+qylf0Qo0y9KAB\neY5iHAgQBvI/fVMfDNqZ22b/j/tO0OdLtiGIUVfJmld92hnyJGtBQSBf5i//\nmyw8\r\n=gb56\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAol+NBlvb/GcKhpUMaX35pUIBGNUrcne/hSa+lrDMT5AiAEmPVqt/eSj8SEyQKxjW1TyB7m+dha8ei1vBIwSnlEbg=="}]},"maintainers":[{"name":"balazsbotond","email":"balazsbotond@gmail.com"}],"_npmUser":{"name":"balazsbotond","email":"balazsbotond@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/urlcat_2.0.3_1601539436424_0.12065738823453298"},"_hasShrinkwrap":false},"2.0.4":{"name":"urlcat","version":"2.0.4","description":"A library for concatenating URL's.","repository":{"type":"git","url":"git+https://github.com/balazsbotond/urlcat.git"},"main":"dist/index.js","types":"dist/index.d.ts","scripts":{"clean":"shx rm -rf dist","clean:test":"shx rm -rf dist-test","prebuild":"npm run clean","build":"tsc -p .","prebuild:test":"npm run clean:test","build:test":"tsc -p ./tsconfig-test.json","pretest":"npm run build:test","test":"nyc --reporter html --reporter text mocha --timeout 10000 --exit 'dist-test/test/**/*.js'","lint":"tslint -c tslint.json 'src/**/*.ts'","coverage":"nyc report --reporter text-lcov | coveralls","prepublish":"npm test && npm run build"},"keywords":["url","uri","build","builder","concat","concatenate"],"author":{"name":"Botond Balazs"},"license":"MIT","dependencies":{},"devDependencies":{"@types/chai":"4.2.12","@types/mocha":"8.0.3","chai":"4.2.0","coveralls":"3.1.0","mocha":"8.1.3","mocha-lcov-reporter":"1.3.0","nyc":"15.1.0","shx":"0.3.2","tslint":"6.1.3","typescript":"4.0.3"},"gitHead":"58db8d04d7f7915a31b56e005130d77093fb0a36","bugs":{"url":"https://github.com/balazsbotond/urlcat/issues"},"homepage":"https://github.com/balazsbotond/urlcat#readme","_id":"urlcat@2.0.4","_nodeVersion":"12.18.3","_npmVersion":"6.14.6","dist":{"integrity":"sha512-12c4Vi40DHVdZ/8mOLjZjp0asCzM6hi8Gj116fpImRP1FN4gBMCtMi9XhLNOmre/FEQYNqHbZmX8iyYAtIcy8Q==","shasum":"c119b4e3b31df4d140e77e177ea5d95dbe6b2fe2","tarball":"https://registry.npmjs.org/urlcat/-/urlcat-2.0.4.tgz","fileCount":5,"unpackedSize":26230,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfdrLJCRA9TVsSAnZWagAA+PwP/irDyuzh1apvlv37UiIy\n4s9pqXySC0b7zWlpikNiR6nXVboRY4viEL+JXZMpT0AXLE3DM3od/6oMO30J\nI2yf5RjFX4AMRayV1wd0HOFZY0AYeifoiiitycftvNga8y3QLt8QQSWfhttj\nYGX7MNHgFQKSAcyF4j3lp7z7mGq0XZoUVTBaN/bMKENOvnwCQnmDstqOu0t8\nOj+1ZNo9DWM4tD+HgkjoXVdfKuu6DaB0aQqyMFQHn5BQ6/GD+qqmW0HKnN4a\nK5uxUe6DU+TaCGvQaS6rzaMW4MoMvrpLttcoApP+mDppfQ+kKhe9aTxa/zlQ\nTBcp30jlLhODzUdDljPZjIsFdqrBi7BkIQj5qWV3uqlk2vukQq69QRlHUak9\nMxH3sA0OwvrrTq66VhgVDxl8Mwgu6DZ60qt61URF3R4w4BnFjniM2rSOfy6Z\nLB06GqtftMIrBJOWPowdKhbKRS/UY2cSLafuLq34N5rm7p7tvyQhvFFNrJEJ\nO7asVoznllvoZ4xoV2ouTjz2ipF0hc8jVr6WiYb813/45LaCV1W7EninuRwt\no7EMOXjRz+yU7S6E+2Qy7/f9IrqTlUCNPpsC6Uayj6dH9s1z+nq05cagIOgy\nyrXvqFl0sEhJHttw+MCBVa3YI7lNnofc6LRZzAG5eN0rJNhTS8Lwhr9aulXv\nwBHy\r\n=DjCO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDSX1yL5OWVNc4HgoQ7w6Eofh/uVE4q/iXqS82RlLR5oAIgPOosWL+5MQ+RvFuFE1QWCGFkiUOE1huGOYI5tgztwGc="}]},"maintainers":[{"name":"balazsbotond","email":"balazsbotond@gmail.com"}],"_npmUser":{"name":"balazsbotond","email":"balazsbotond@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/urlcat_2.0.4_1601614536725_0.08155923095156448"},"_hasShrinkwrap":false},"3.0.0":{"name":"urlcat","version":"3.0.0","description":"A library for concatenating URL's.","repository":{"type":"git","url":"git+https://github.com/balazsbotond/urlcat.git"},"main":"dist/index.js","types":"dist/index.d.ts","scripts":{"clean":"shx rm -rf dist","prebuild":"npm run clean","build":"tsc -p .","test":"jest","lint":"eslint . --ext .js,.jsx,.ts,.tsx","coverage":"cat ./coverage/lcov.info | coveralls","prepublish":"npm test && npm run build","docs":"docsify serve docs --open"},"keywords":["url","uri","build","builder","concat","concatenate"],"author":{"name":"Botond Balazs"},"license":"MIT","dependencies":{"qs":"^6.9.4"},"devDependencies":{"@types/jest":"26.0.20","@types/qs":"6.9.5","@typescript-eslint/eslint-plugin":"4.14.1","@typescript-eslint/parser":"4.14.1","coveralls":"3.1.0","eslint":"7.19.0","jest":"26.6.3","shx":"0.3.3","ts-jest":"26.5.0","tslint":"6.1.3","typescript":"4.1.3","docsify-cli":"4.4.2"},"gitHead":"d148b204c06a2f45595cdce179b5fd923c1ca41a","bugs":{"url":"https://github.com/balazsbotond/urlcat/issues"},"homepage":"https://github.com/balazsbotond/urlcat#readme","_id":"urlcat@3.0.0","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-SSXrIzInzKdWjBfm5iOrPfO6E5Nt0aFs5PTZCauxJTjJE3qhfePAWz8tjGm7dnWMYIAdPGjio51aakunyZHMXQ==","shasum":"3cc76170290308f19098462674390728a5b33209","tarball":"https://registry.npmjs.org/urlcat/-/urlcat-3.0.0.tgz","fileCount":5,"unpackedSize":31359,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDOKFYaeukRQAJyTMRDYW4Xa7qrF6XcRkjI3a0D2YSjmAIgdI7zakcfLs1qf0Z23vLlc/cndPRmg7m9ciabRnP6fLk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjbuc3ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrt/A/+KRDzfkgg6UavcTxst7UMlsE/HQxm25PicbJNh8mucWgEcRg6\r\nmKInq/B/vjZfmPr8OoDXicopLvXnsjW38Y+tWdOrR4z6drVTx/Az5UhYHM3d\r\nNIjF0u2/bm1bJ7rNQWHXvxB18vrajM1hq3knF7TSiwrcoGYAWURuCCsFIAfD\r\nkYkSrwgGuOlzchqUAWCZ1VPpufJcwAyV1ig+w7hptWuhgvjxkAZMCGlXRIrS\r\nr/0owRfFXe7/OODCQbXUBjh+hLPuO6iROfvJGpEKkhxVKZ2bUwsFgFat2wQ6\r\nFl1psSUtyjB0oXCLCy53cHUonOoLdIfmDnjSiyFS/gyU7Q06qGcI251Y2xzY\r\nHDL+zGC+uCuAjGe/OmTbUXQmFZ9W8xJUuGwLoTEVc+NoEmLVE5aQH+PgFgzk\r\n0q2tV8RW9U0wCOpEiFHXc9891PWLCt1LyrjLq0jaT9eUigvUtdIXY/gTfN9o\r\nZJfrTzChnSTkQBAP/84z+mtlZiZsZBQgPMwGbl1hMSV5H9shOYqIOdpzxmLp\r\nfI3UiwT+OOHc55ZVrnIkR7aUkLwUg4GNZilVt37Eue1KyZwxtyzXluKPvj8C\r\n36XFJB4o/o3IzJTLp+wmiBTEjDFG6+OOAVNiU7vr5S0UhOEQEY0+vPqzG5Q8\r\nvC/nLVAFPEKcweu91ATXuCkjCl5ZMT+LBo4=\r\n=Llx8\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"balazsbotond","email":"balazsbotond@gmail.com"},"directories":{},"maintainers":[{"name":"balazsbotond","email":"balazsbotond@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/urlcat_3.0.0_1668212535286_0.717941211254034"},"_hasShrinkwrap":false},"3.0.1-rc1":{"name":"urlcat","version":"3.0.1-rc1","description":"A library for concatenating URL's.","repository":{"type":"git","url":"git+https://github.com/balazsbotond/urlcat.git"},"type":"module","source":"src/index.ts","main":"./dist/index.cjs","umd:main":"./dist/index.umd.js","types":"./dist/index.d.ts","module":"./dist/index.module.js","unpkg":"./dist/index.umd.js","exports":{"types":"./dist/index.d.ts","require":"./dist/index.cjs","default":"./dist/index.modern.js"},"scripts":{"clean":"shx rm -rf dist","prebuild":"npm run clean","build":"microbundle","test":"jest","lint":"eslint . --ext .js,.jsx,.ts,.tsx","coverage":"cat ./coverage/lcov.info | coveralls","prepublishOnly":"npm test && npm run build","docs":"docsify serve docs --open"},"keywords":["url","uri","build","builder","concat","concatenate"],"author":{"name":"Botond Balazs"},"license":"MIT","dependencies":{"qs":"^6.9.4"},"devDependencies":{"@types/jest":"29.2.3","@types/qs":"6.9.7","@typescript-eslint/eslint-plugin":"5.43.0","@typescript-eslint/parser":"5.43.0","coveralls":"3.1.1","docsify-cli":"^4.0.0","eslint":"8.28.0","jest":"29.3.1","microbundle":"^0.15.1","shx":"0.3.4","ts-jest":"29.0.3","tslint":"6.1.3","typescript":"4.9.3"},"readme":"<h1 align=\"center\">\n  <br>\n  <img src=\"docs/cat.svg\" alt=\"Markdownify\">\n  <br>\n  urlcat\n  <br>\n</h1>\n\n<h4 align=\"center\">Build correct URLs easily.</h4>\n\n<p align=\"center\">\n  <a href=\"https://github.com/balazsbotond/urlcat/actions\">\n    <img src=\"https://github.com/balazsbotond/urlcat/actions/workflows/ci.yml/badge.svg\"\n         alt=\"Build Status\">\n  </a>\n  <a href=\"https://www.npmjs.com/package/urlcat\">\n    <img src=\"https://img.shields.io/npm/v/urlcat.svg?style=flat\" alt=\"npm version\">\n  </a>\n  <a href=\"https://bundlephobia.com/result?p=urlcat\">\n    <img src=\"https://badgen.net/bundlephobia/minzip/urlcat\" alt=\"minzipped size\">\n  </a>\n  <a href=\"https://coveralls.io/github/balazsbotond/urlcat?branch=master\">\n    <img src=\"https://coveralls.io/repos/github/balazsbotond/urlcat/badge.svg?branch=master\" alt=\"Coverage Status\" />\n  </a>\n</p>\n\n<p align=\"center\">\n  <a href=\"#what\">What?</a> •\n  <a href=\"#why\">Why?</a> •\n  <a href=\"#how\">How?</a> •\n  <a href=\"#typescript\">TypeScript</a> •\n  <a href=\"#api\">API</a> •\n  <a href=\"#help\">Help</a> •\n  <a href=\"#contribute\">Contribute</a>\n</p>\n\n## What?\n\n*urlcat* is a tiny JavaScript library that makes building URLs very convenient and prevents common mistakes.\n\n<br>\n<p align=\"center\">\n  <img src=\"docs/urlcat-basic-usage.svg#gh-light-mode-only\">\n  <img src=\"docs/urlcat-basic-usage-dark.svg#gh-dark-mode-only\">\n</p>\n\nFeatures:\n- Friendly API\n- Only [one dependency](https://www.npmjs.com/package/qs)\n- 10.5KB [minified and gzipped](https://bundlephobia.com/package/urlcat@3.0.0)\n- TypeScript types provided\n\n## Why?\n\nWhen I call an HTTP API, I usually need to add dynamic parameters to the URL:\n\n~~~js\nconst API_URL = 'https://api.example.com/';\n\nfunction getUserPosts(id, blogId, limit, offset) {\n  const requestUrl = `${API_URL}/users/${id}/blogs/${blogId}/posts?limit=${limit}&offset=${offset}`;\n  // send HTTP request\n}\n~~~\n\nAs you can see, this minimal example is already rather hard to read. It is also incorrect:\n\n- I forgot that there was a trailing slash at the end of the `API_URL` constant so this resulted in a URL containing duplicate slashes (`https://api.example.com//users`).\n- The embedded values need to be escaped using `encodeURIComponent`\n\nI can use the built-in `URL` class to prevent duplicate slashes and `URLSearchParams` to escape the query string. But I still need to escape all path parameters manually.\n\n~~~js\nconst API_URL = 'https://api.example.com/';\n\nfunction getUserPosts(id, blogId, limit, offset) {\n  const escapedId = encodeURIComponent(id);\n  const escapedBlogId = encodeURIComponent(blogId);\n  const path = `/users/${escapedId}/blogs/${escapedBlogId}`;\n  const url = new URL(path, API_URL);\n  url.search = new URLSearchParams({ limit, offset });\n  const requestUrl = url.href;\n  // send HTTP request\n}\n~~~\n\nSuch a simple task and yet very hard to read and tedious to write! This is where this tiny library can help you:\n\n~~~js\nconst API_URL = 'https://api.example.com/';\n\nfunction getUserPosts(id, limit, offset) {\n  const requestUrl = urlcat(API_URL, '/users/:id/posts', { id, limit, offset });\n  // send HTTP request\n}\n~~~\n\nThe library handles:\n- escaping all parameters\n- concatenating all parts (there will always be exactly one <kbd>/</kbd> and <kbd>?</kbd> character between them)\n\n## How?\n\n### Install\n\nCurrently, the package is distributed via npm. Zip downloads are also available since v3.0.0 (A CDN is coming soon).\n\n```bash\nnpm install --save urlcat\n```\n\n### Usage with Node\n\nNode 14 and above are officially supported, though you may have luck using it with an earlier Node version.\nSince the code uses the `URL` and `URLSearchParams` classes internally, which aren't available below Node v10, the library is known not to work with those versions.\n\nTo build full URLs (most common use case):\n\n```ts\nconst urlcat = require('urlcat').default;\n```\n\nTo use any of the utility functions:\n\n```ts\nconst { query, subst, join } = require('urlcat');\n```\n\nTo use all exported functions:\n\n```ts\nconst { default: urlcat, query, subst, join } = require('urlcat');\n```\n\n### Usage with TypeScript\n\nTypeScript 2.1 and above are officially supported.\n\nTo build full URLs (most common use case):\n\n```ts\nimport urlcat from 'urlcat';\n```\n\nTo use any of the utility functions:\n\n```ts\nimport { query, subst, join } from 'urlcat';\n```\n\nTo use all exported functions:\n\n```ts\nimport urlcat, { query, subst, join } from 'urlcat';\n```\n\n## TypeScript\n\nThis library provides its own type definitions. \"It just works\", no need to install anything from `@types`.\n\n## API\n\n### `ParamMap`: an object with string keys\n\n```ts\ntype ParamMap = Record<string, any>;\n```\n\nFor example, `{ firstParam: 1, 'second-param': 2 }` is a valid `ParamMap`.\n\n### `urlcat`: build full URLs\n\n```ts\nfunction urlcat(baseUrl: string, pathTemplate: string, params: ParamMap): string\nfunction urlcat(baseUrl: string, pathTemplate: string): string\nfunction urlcat(baseTemplate: string, params: ParamMap): string\n```\n\n#### Examples\n\n<ul>\n  <li>\n    <code>urlcat('https://api.example.com', '/users/:id/posts', { id: 123, limit: 10, offset: 120 })</code><br>\n    → <code>'https://api.example.com/users/123/posts?limit=10&offset=120'</code>\n  </li>\n  <li>\n    <code>urlcat('http://example.com/', '/posts/:title', { title: 'Letters & \"Special\" Characters' })</code><br>\n    → <code>'http://example.com/posts/Letters%20%26%20%22Special%22%20Characters'</code>\n  </li>\n  <li>\n    <code>urlcat('https://api.example.com', '/users')</code><br>\n    → <code>'https://api.example.com/users'</code>\n  </li>\n  <li>\n    <code>urlcat('https://api.example.com/', '/users')</code><br>\n    → <code>'https://api.example.com/users'</code>\n  </li>\n  <li>\n    <code>urlcat('http://example.com/', '/users/:userId/posts/:postId/comments', { userId: 123, postId: 987, authorId: 456, limit: 10, offset: 120 })</code><br>\n    → <code>'http://example.com/users/123/posts/987/comments?authorId=456&limit=10&offset=120'</code>\n  </li>\n</ul>\n\n**NOTE about empty path segments:** \n[RFC 3986](https://tools.ietf.org/html/rfc3986) allows empty path segments in URLs (for example, `https://example.com//users////2`). *urlcat* keeps any empty path segments that aren't at the concatenation boundary between `baseUrl` and `pathTemplate`. To include an empty path segment there are two options:\n- use a double slash: `urlcat('https://example.com/', '//users', { q: 1 })` → `https://example.com//users?q=1`\n- use the `baseTemplate` overload: `urlcat('https://example.com//users', { q: 1 })` → `https://example.com//users?q=1`\n\n### `query`: build query strings\n\n```ts\nfunction query(params: ParamMap): string\n```\n\nBuilds a query string using the key-value pairs specified. Keys and values are escaped, then joined by the `'&'` character.\n\n#### Examples\n\n<table>\n  <tr><th><code>params</code></th><th>result</th></tr>\n  <tr><td><code>{}</code></td><td><code>''</code></td></tr>\n  <tr><td><code>{ query: 'some text' }</code></td><td><code>'query=some%20text'</code></td></tr>\n  <tr><td><code>{ id: 42, 'comment-id': 86 }</code></td><td><code>'id=42&comment-id=86'</code></td></tr>\n  <tr><td><code>{ id: 42, 'a name': 'a value' }</code></td><td><code>'id=42&a%20name=a%20value'</code></td></tr>\n</table>\n\n### `subst`: substitute path parameters\n\n```ts\nfunction subst(template: string, params: ParamMap): string\n```\n\nSubstitutes parameters with values in a template string. `template` may contain 0 or more parameter placeholders. Placeholders start with a colon (`:`), followed by a parameter name that can only contain uppercase or lowercase letters. Any placeholders found in the template are replaced with the value under the corresponding key in `params`.\n\n#### Examples\n\n<table>\n  <tr><th><code>template</code></th><th><code>params</code></th><th>result</th></tr>\n  <tr><td><code>':id'</code></td><td><code>{ id: 42 }</code></td><td><code>'42'</code></td></tr>\n  <tr><td><code>'/users/:id'</code></td><td><code>{ id: 42 }</code></td><td><code>'/users/42'</code></td></tr>\n  <tr><td><code>'/users/:id/comments/:commentId'</code></td><td><code>{ id: 42, commentId: 86 }</code></td><td><code>'/users/42/comments/86'</code></td></tr>\n  <tr><td><code>'/users/:id'</code></td><td><code>{ id: 42, foo: 'bar' }</code></td><td><code>'/users/42'</code></td></tr>\n</table>\n\n### `join`: join two strings using exactly one separator\n\n```ts\nfunction join(part1: string, separator: string, part2: string): string\n```\n\nJoins the two parts using exactly one separator. If a separator is present at the end of `part1` or the beginning of `part2`, it is removed, then the two parts are joined using `separator`.\n\n#### Examples\n\n<table>\n  <tr><th><code>part1</code></th><th><code>separator</code></th><th><code>part2</code></th><th>result</th></tr>\n  <tr><td><code>'first'</code></td><td><code>','</code></td><td><code>'second'</code></td><td rowspan=\"4\"><code>'first,second'</code></td></tr>\n  <tr><td><code>'first,'</code></td><td><code>','</code></td><td><code>'second'</code></td></tr>\n  <tr><td><code>'first'</code></td><td><code>','</code></td><td><code>',second'</code></td></tr>\n  <tr><td><code>'first,'</code></td><td><code>','</code></td><td><code>',second'</code></td></tr>\n</table>\n\n## Help\n\nThank you for using *urlcat*!\n\nIf you need any help using this library, feel free to [create a GitHub issue](https://github.com/balazsbotond/urlcat/issues/new/choose), and ask your questions. I'll try to answer as quickly as possible.\n\n## Contribute\n\nContributions of any kind (pull requests, bug reports, feature requests, documentation, design) are more than welcome! If you like this project and want to help, but feel like you are stuck, feel free to contact the maintainer (Botond Balázs &lt;balazsbotond@gmail.com&gt;).\n\n### Building from source\n\nBuilding the project should be quick and easy. If it isn't, it's the maintainer's fault. Please report any problems with building in a GitHub issue.\n\nYou need to have a reasonably recent version of node.js to build *urlcat*. \nTested on node version 12.18.3 and npm version 6.14.6.\n\nFirst, clone the git repository:\n\n```\ngit clone git@github.com:balazsbotond/urlcat.git\n```\n\nThen switch to the newly created urlcat directory and install the dependencies:\n\n```\ncd urlcat\nnpm install\n```\n\nYou can then run the unit tests to verify that everything works correctly:\n\n```\nnpm test\n```\n\nAnd finally, build the library:\n\n```\nnpm run build\n```\n\nThe output will appear in the `dist` directory.\n\nHappy hacking!\n\n## Contributors ✨\n\n<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->\n[![All Contributors](https://img.shields.io/badge/all_contributors-18-orange.svg?style=flat-square)](#contributors-)\n<!-- ALL-CONTRIBUTORS-BADGE:END -->\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/balazsbotond\"><img src=\"https://avatars2.githubusercontent.com/u/2791280?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Botond Balázs</b></sub></a><br /><a href=\"https://github.com/balazsbotond/urlcat/commits?author=balazsbotond\" title=\"Code\">💻</a> <a href=\"https://github.com/balazsbotond/urlcat/commits?author=balazsbotond\" title=\"Tests\">⚠️</a> <a href=\"https://github.com/balazsbotond/urlcat/commits?author=balazsbotond\" title=\"Documentation\">📖</a> <a href=\"#infra-balazsbotond\" title=\"Infrastructure (Hosting, Build-Tools, etc)\">🚇</a> <a href=\"https://github.com/balazsbotond/urlcat/issues?q=author%3Abalazsbotond\" title=\"Bug reports\">🐛</a> <a href=\"#maintenance-balazsbotond\" title=\"Maintenance\">🚧</a></td>\n    <td align=\"center\"><a href=\"https://llll-ll.com\"><img src=\"https://avatars0.githubusercontent.com/u/3541096?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>kako-jun</b></sub></a><br /><a href=\"https://github.com/balazsbotond/urlcat/issues?q=author%3Akako-jun\" title=\"Bug reports\">🐛</a> <a href=\"#ideas-kako-jun\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n    <td align=\"center\"><a href=\"https://github.com/polysiya\"><img src=\"https://avatars1.githubusercontent.com/u/722173?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kim Kyudeok</b></sub></a><br /><a href=\"#ideas-polysiya\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n    <td align=\"center\"><a href=\"https://github.com/harshilparmar\"><img src=\"https://avatars3.githubusercontent.com/u/45915468?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Harshil Parmar</b></sub></a><br /><a href=\"https://github.com/balazsbotond/urlcat/commits?author=harshilparmar\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://knpw.rs\"><img src=\"https://avatars0.githubusercontent.com/u/174864?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Ken Powers</b></sub></a><br /><a href=\"#platform-knpwrs\" title=\"Packaging/porting to new platform\">📦</a> <a href=\"#userTesting-knpwrs\" title=\"User Testing\">📓</a></td>\n    <td align=\"center\"><a href=\"https://github.com/praveen5959\"><img src=\"https://avatars3.githubusercontent.com/u/30530587?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Praveen K B</b></sub></a><br /><a href=\"#ideas-praveen5959\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"https://github.com/balazsbotond/urlcat/commits?author=praveen5959\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"http://@engrkhizariqbal\"><img src=\"https://avatars0.githubusercontent.com/u/5228711?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Khizar Iqbal</b></sub></a><br /><a href=\"#ideas-EngrKhizarIqbal\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#infra-EngrKhizarIqbal\" title=\"Infrastructure (Hosting, Build-Tools, etc)\">🚇</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/SimonJang\"><img src=\"https://avatars2.githubusercontent.com/u/10977475?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Simon Jang</b></sub></a><br /><a href=\"#ideas-SimonJang\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"https://github.com/balazsbotond/urlcat/commits?author=SimonJang\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://luyu.blog\"><img src=\"https://avatars0.githubusercontent.com/u/2239547?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Luyu Cheng</b></sub></a><br /><a href=\"https://github.com/balazsbotond/urlcat/commits?author=chengluyu\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"https://www.echooff.dev\"><img src=\"https://avatars0.githubusercontent.com/u/149248?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Christian Rackerseder</b></sub></a><br /><a href=\"https://github.com/balazsbotond/urlcat/commits?author=screendriver\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"https://www.linkedin.com/in/wwaryangupta/\"><img src=\"https://avatars3.githubusercontent.com/u/42470695?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Aryan Gupta</b></sub></a><br /><a href=\"https://github.com/balazsbotond/urlcat/commits?author=withoutwaxaryan\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"http://www.jasonkohles.com\"><img src=\"https://avatars3.githubusercontent.com/u/46860?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Jason Kohles</b></sub></a><br /><a href=\"https://github.com/balazsbotond/urlcat/issues?q=author%3Ajasonk\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/balazsbotond/urlcat/commits?author=jasonk\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://www.linkedin.com/in/tiago-santos-da-silva-328a63ba/\"><img src=\"https://avatars2.githubusercontent.com/u/10531605?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Tiago Santos Da Silva</b></sub></a><br /><a href=\"https://github.com/balazsbotond/urlcat/commits?author=tiago154\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://tom.carrio.me\"><img src=\"https://avatars0.githubusercontent.com/u/8659099?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Tom</b></sub></a><br /><a href=\"https://github.com/balazsbotond/urlcat/commits?author=tcarrio\" title=\"Code\">💻</a> <a href=\"#infra-tcarrio\" title=\"Infrastructure (Hosting, Build-Tools, etc)\">🚇</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/drishit96\"><img src=\"https://avatars1.githubusercontent.com/u/13049630?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Drishit Mitra</b></sub></a><br /><a href=\"#infra-drishit96\" title=\"Infrastructure (Hosting, Build-Tools, etc)\">🚇</a></td>\n    <td align=\"center\"><a href=\"https://github.com/sakshi2912\"><img src=\"https://avatars3.githubusercontent.com/u/51375116?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Sakshi Vattikuti</b></sub></a><br /><a href=\"https://github.com/balazsbotond/urlcat/commits?author=sakshi2912\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"https://github.com/3zk1m0\"><img src=\"https://avatars3.githubusercontent.com/u/19320956?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>3zk1m0</b></sub></a><br /><a href=\"#ideas-3zk1m0\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n    <td align=\"center\"><a href=\"https://seinopsys.dev/\"><img src=\"https://avatars1.githubusercontent.com/u/3200580?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>David Joseph Guzsik</b></sub></a><br /><a href=\"https://github.com/balazsbotond/urlcat/pulls?q=is%3Apr+reviewed-by%3ASeinopSys\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-enable -->\n<!-- prettier-ignore-end -->\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/balazsbotond/urlcat/issues"},"homepage":"https://github.com/balazsbotond/urlcat#readme","_id":"urlcat@3.0.1-rc1","_integrity":"sha512-WI6ov+gN0nv5zqP8d4MVKKxBTK16wVvU4xz5peKYopcRJRcsRuWU5VlqtYEv9MkDACy8s3r0dnXcN2cM7hSbbQ==","_resolved":"/home/botond/src/oss/urlcat/urlcat-3.0.1-rc1.tgz","_from":"file:urlcat-3.0.1-rc1.tgz","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-WI6ov+gN0nv5zqP8d4MVKKxBTK16wVvU4xz5peKYopcRJRcsRuWU5VlqtYEv9MkDACy8s3r0dnXcN2cM7hSbbQ==","shasum":"c7efa961225fb1c47cef632956d6425f5963fde3","tarball":"https://registry.npmjs.org/urlcat/-/urlcat-3.0.1-rc1.tgz","fileCount":12,"unpackedSize":80638,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCMV/w72K3NM7hRH76gWwZ3wCRItla0cwNdnKCqr83i8QIhAMOaWROPGomt6Gq42oD9IroehSo2F9PS/TG1beaMF8zA"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjeV2hACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpC/g//VM7fVZqhaVS0NQJycyASODCcExcmVjl7ZWfPvtucJeI6bA6u\r\nSihGSk/7QvPdP5fUYp7/sxwbxkCe/348yI0Jl/pQU0N56NbbNFcaGBuicsLa\r\n8heWkxyPqlhmJQ/QYh8JKhLIFkgek2rCWxJzJKZiQwyM+jrhXMWTxDNT/vzv\r\neZN/2hGBxY8bxMD50qRuxz4K7MM5cVrroIQIC6FdU5AOqf1K9OqW+AWI5ChF\r\ntTGqupbYmSwy9gzIp5kW5Gbf5Lmiht9LUjTJmhnbXOKa1bt1C741/xtaMl13\r\n/j1Ech6EM6009/xLlzcEyHhU60/Tb3hU1/sEs+vSgwlYIfl6Yz32n8p/UUq1\r\ncxm+V600TizgpSOWzQ0eZ19g7BpM6064Q1XAJpOi1BB5rEkfTpxYFPBYVxKm\r\n8sUXogd2l4DYkHQvUTqHp/z0utr5ZNS26dG11xAt5Hb8g3l3YqzCKm6qJbEM\r\nmNDGxkTzT5yt5V+oQkKGdbRsjNymf40CiOODMXqQ9g5iisrajIJbCIYeBWUP\r\n8t9FPXXKRdr3y2z6IDcw+u0sh6xX6HJ5MNVyik0Cg+sDgh5/9dnRFPuG+jM5\r\nMVmRRpUPUOE969WWlkhJMMlQg07lLIj+X9rCObiQyopAyKB3v4mh5KycDiY4\r\nm4wVuZ23SlZxRC56cwaK9HAs5WS6vH84oJw=\r\n=Ze8P\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"balazsbotond","email":"balazsbotond@gmail.com"},"directories":{},"maintainers":[{"name":"balazsbotond","email":"balazsbotond@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/urlcat_3.0.1-rc1_1668898209310_0.9941488643223122"},"_hasShrinkwrap":false},"3.1.0":{"name":"urlcat","version":"3.1.0","description":"A library for concatenating URL's.","repository":{"type":"git","url":"git+https://github.com/balazsbotond/urlcat.git"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{".":{"import":"./dist/index.mjs","require":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"clean":"shx rm -rf dist","prebuild":"npm run clean","build":"tsup","test":"jest","lint":"eslint . --ext .js,.jsx,.ts,.tsx","coverage":"cat ./coverage/lcov.info | coveralls","prepublish":"npm test && npm run build","docs":"docsify serve docs --open"},"keywords":["url","uri","build","builder","concat","concatenate"],"author":{"name":"Botond Balazs"},"license":"MIT","dependencies":{"qs":"^6.9.4"},"devDependencies":{"@types/jest":"29.2.5","@types/qs":"6.9.7","@typescript-eslint/eslint-plugin":"5.48.1","@typescript-eslint/parser":"5.48.1","coveralls":"3.1.1","docsify-cli":"^4.4.4","eslint":"8.32.0","jest":"29.3.1","shx":"0.3.4","ts-jest":"29.0.5","tslint":"6.1.3","tsup":"^6.5.0","typescript":"4.9.4"},"gitHead":"d95336c6e572271430748b8d54a16d09ad9a0206","bugs":{"url":"https://github.com/balazsbotond/urlcat/issues"},"homepage":"https://github.com/balazsbotond/urlcat#readme","_id":"urlcat@3.1.0","_nodeVersion":"18.13.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-qY6b94/aGMIHh70EEQ/4hfR2LUGZ+fPQNp64cf7yRX9kAp4XG2tx7LgYUU1Qkh17bFylME0u4n3lOezonougPw==","shasum":"66ef2eafea2236b8765c40aa7536969c674e7738","tarball":"https://registry.npmjs.org/urlcat/-/urlcat-3.1.0.tgz","fileCount":6,"unpackedSize":35246,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCHAjxcmZ13GYtmtoGv0CI6YhMem1G418rTbc/NC2lEVgIgHCSFVYhhgfI9G3tfJyTbdlszmUnM0MbbuIats+/j6lI="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxu21ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpR4w//YT1RjLq224b1vf7phCxUerNLAqDD2cR+ZqcOh6TPJv3sFocR\r\n1GFHjmqqXYffG5s9OkSxio9cVi64cfI6+7kUmIB7c7TkLur0uF0EOo+nQ7DD\r\noiAdBVMMQwXvii+/0Yhtd95bvbuq6PnHw8Ybprx0ixBkUp6XGD5+mx7PHB2L\r\nUBzVRIMf8OxyJjeFTp0pKvfXtH/MdgcIXNrxb/YbYBmQYebRoxdEV5fBTSxJ\r\ncBLSuJl9GoBBlPSTmDniKraqKsWvoQHwF0cr40Oo8aYGnF8TLTSCTGpgcjgP\r\nFcUMZKUlIiKBLrheSCUlro5Wm1gTU+f3hVvu7TfAlyG/ZcpvuTpg/0i/8tQQ\r\nY0wu2h9n6/PsvQp+Iy6hfiXHIjXMAYYE7yiOvOyQJZHYXJRpp9rj7+zz7v8x\r\nxOftyrO/+zN7hkqExWb/MdE4M6EDYVHz93ZjQbapGwhgAhdM2SijnO3epXkq\r\nrukVk1CCLhttqrh67gyFsOcVeQ4k+yO+lbFQcPvVH+A0Tt0vFwywnnVUTpx1\r\n/lsON6Fce34iBHjZJozLuqRW9mHnHED6rbf4cgfxAZph6HP6XF9OGrwQ8Uyb\r\npvcIpP24IVYdCrJF27p4e0zvZEyi8a2hoNYmwE29u8wJ/JYnv+0HBr+4NJaO\r\niwhdGbX+hd/OLhj9qWqOd0pGLpYesQuhxqg=\r\n=CM7w\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"balazsbotond","email":"balazsbotond@gmail.com"},"directories":{},"maintainers":[{"name":"balazsbotond","email":"balazsbotond@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/urlcat_3.1.0_1673981365285_0.534767461821992"},"_hasShrinkwrap":false}},"time":{"created":"2020-09-22T19:47:39.739Z","0.1.0":"2020-09-22T19:47:39.925Z","modified":"2023-01-17T18:49:25.574Z","1.0.0":"2020-09-23T11:41:41.619Z","1.0.1":"2020-09-24T07:31:10.367Z","2.0.0":"2020-09-24T09:45:34.996Z","2.0.1":"2020-09-24T10:24:52.939Z","2.0.2":"2020-09-26T10:21:46.309Z","2.0.3":"2020-10-01T08:03:56.541Z","2.0.4":"2020-10-02T04:55:37.037Z","3.0.0":"2022-11-12T00:22:15.511Z","3.0.1-rc1":"2022-11-19T22:50:09.519Z","3.1.0":"2023-01-17T18:49:25.457Z"},"maintainers":[{"name":"balazsbotond","email":"balazsbotond@gmail.com"}],"description":"A library for concatenating URL's.","homepage":"https://github.com/balazsbotond/urlcat#readme","keywords":["url","uri","build","builder","concat","concatenate"],"repository":{"type":"git","url":"git+https://github.com/balazsbotond/urlcat.git"},"author":{"name":"Botond Balazs"},"bugs":{"url":"https://github.com/balazsbotond/urlcat/issues"},"license":"MIT","readme":"<h1 align=\"center\">\n  <br>\n  <img src=\"docs/cat.svg\" alt=\"Markdownify\">\n  <br>\n  urlcat\n  <br>\n</h1>\n\n<h4 align=\"center\">Build correct URLs easily.</h4>\n\n<p align=\"center\">\n  <a href=\"https://github.com/balazsbotond/urlcat/actions\">\n    <img src=\"https://github.com/balazsbotond/urlcat/actions/workflows/ci.yml/badge.svg\"\n         alt=\"Build Status\">\n  </a>\n  <a href=\"https://www.npmjs.com/package/urlcat\">\n    <img src=\"https://img.shields.io/npm/v/urlcat.svg?style=flat\" alt=\"npm version\">\n  </a>\n  <a href=\"https://bundlephobia.com/result?p=urlcat\">\n    <img src=\"https://badgen.net/bundlephobia/minzip/urlcat\" alt=\"minzipped size\">\n  </a>\n  <a href=\"https://coveralls.io/github/balazsbotond/urlcat?branch=master\">\n    <img src=\"https://coveralls.io/repos/github/balazsbotond/urlcat/badge.svg?branch=master\" alt=\"Coverage Status\" />\n  </a>\n</p>\n\n<p align=\"center\">\n  <a href=\"#what\">What?</a> •\n  <a href=\"#why\">Why?</a> •\n  <a href=\"#how\">How?</a> •\n  <a href=\"#typescript\">TypeScript</a> •\n  <a href=\"#api\">API</a> •\n  <a href=\"#help\">Help</a> •\n  <a href=\"#contribute\">Contribute</a>\n</p>\n\n## What?\n\n*urlcat* is a tiny JavaScript library that makes building URLs very convenient and prevents common mistakes.\n\n<br>\n<p align=\"center\">\n  <img src=\"docs/urlcat-basic-usage.svg#gh-light-mode-only\">\n  <img src=\"docs/urlcat-basic-usage-dark.svg#gh-dark-mode-only\">\n</p>\n\nFeatures:\n- Friendly API\n- Only [one dependency](https://www.npmjs.com/package/qs)\n- 10.5KB [minified and gzipped](https://bundlephobia.com/package/urlcat@3.0.0)\n- TypeScript types provided\n\n## Why?\n\nWhen I call an HTTP API, I usually need to add dynamic parameters to the URL:\n\n~~~js\nconst API_URL = 'https://api.example.com/';\n\nfunction getUserPosts(id, blogId, limit, offset) {\n  const requestUrl = `${API_URL}/users/${id}/blogs/${blogId}/posts?limit=${limit}&offset=${offset}`;\n  // send HTTP request\n}\n~~~\n\nAs you can see, this minimal example is already rather hard to read. It is also incorrect:\n\n- I forgot that there was a trailing slash at the end of the `API_URL` constant so this resulted in a URL containing duplicate slashes (`https://api.example.com//users`).\n- The embedded values need to be escaped using `encodeURIComponent`\n\nI can use the built-in `URL` class to prevent duplicate slashes and `URLSearchParams` to escape the query string. But I still need to escape all path parameters manually.\n\n~~~js\nconst API_URL = 'https://api.example.com/';\n\nfunction getUserPosts(id, blogId, limit, offset) {\n  const escapedId = encodeURIComponent(id);\n  const escapedBlogId = encodeURIComponent(blogId);\n  const path = `/users/${escapedId}/blogs/${escapedBlogId}`;\n  const url = new URL(path, API_URL);\n  url.search = new URLSearchParams({ limit, offset });\n  const requestUrl = url.href;\n  // send HTTP request\n}\n~~~\n\nSuch a simple task and yet very hard to read and tedious to write! This is where this tiny library can help you:\n\n~~~js\nconst API_URL = 'https://api.example.com/';\n\nfunction getUserPosts(id, limit, offset) {\n  const requestUrl = urlcat(API_URL, '/users/:id/posts', { id, limit, offset });\n  // send HTTP request\n}\n~~~\n\nThe library handles:\n- escaping all parameters\n- concatenating all parts (there will always be exactly one <kbd>/</kbd> and <kbd>?</kbd> character between them)\n\n## How?\n\n### Install\n\nCurrently, the package is distributed via npm. Zip downloads are also available since v3.0.0 (A CDN is coming soon).\n\n```bash\nnpm install --save urlcat\n```\n\n### Usage with Node (CommonJS/CJS)\n\nNode 14 and above are officially supported, though you may have luck using it with an earlier Node version.\nSince the code uses the `URL` and `URLSearchParams` classes internally, which aren't available below Node v10, the library is known not to work with those versions.\n\nTo build full URLs (most common use case):\n\n```ts\nconst urlcat = require('urlcat').default;\n```\n\nTo use any of the utility functions:\n\n```ts\nconst { query, subst, join } = require('urlcat');\n```\n\nTo use all exported functions:\n\n```ts\nconst { default: urlcat, query, subst, join } = require('urlcat');\n```\n\n### Usage with Node (ES Module)\n\nStarting with v3.1.0, urlcat supports ESM!\n\nTo build full URLs (most common use case):\n\n```ts\nimport urlcat from 'urlcat';\n```\n\nTo use any of the utility functions:\n\n```ts\nimport { query, subst, join } from 'urlcat';\n```\n\nTo use all exported functions:\n\n```ts\nimport urlcat, { query, subst, join } from 'urlcat';\n```\n\n### Usage with TypeScript\n\nTypeScript 2.1 and above are officially supported.\n\nTo build full URLs (most common use case):\n\n```ts\nimport urlcat from 'urlcat';\n```\n\nTo use any of the utility functions:\n\n```ts\nimport { query, subst, join } from 'urlcat';\n```\n\nTo use all exported functions:\n\n```ts\nimport urlcat, { query, subst, join } from 'urlcat';\n```\n\n## TypeScript\n\nThis library provides its own type definitions. \"It just works\", no need to install anything from `@types`.\n\n## API\n\n### `ParamMap`: an object with string keys\n\n```ts\ntype ParamMap = Record<string, any>;\n```\n\nFor example, `{ firstParam: 1, 'second-param': 2 }` is a valid `ParamMap`.\n\n### `urlcat`: build full URLs\n\n```ts\nfunction urlcat(baseUrl: string, pathTemplate: string, params: ParamMap): string\nfunction urlcat(baseUrl: string, pathTemplate: string): string\nfunction urlcat(baseTemplate: string, params: ParamMap): string\n```\n\n#### Examples\n\n<ul>\n  <li>\n    <code>urlcat('https://api.example.com', '/users/:id/posts', { id: 123, limit: 10, offset: 120 })</code><br>\n    → <code>'https://api.example.com/users/123/posts?limit=10&offset=120'</code>\n  </li>\n  <li>\n    <code>urlcat('http://example.com/', '/posts/:title', { title: 'Letters & \"Special\" Characters' })</code><br>\n    → <code>'http://example.com/posts/Letters%20%26%20%22Special%22%20Characters'</code>\n  </li>\n  <li>\n    <code>urlcat('https://api.example.com', '/users')</code><br>\n    → <code>'https://api.example.com/users'</code>\n  </li>\n  <li>\n    <code>urlcat('https://api.example.com/', '/users')</code><br>\n    → <code>'https://api.example.com/users'</code>\n  </li>\n  <li>\n    <code>urlcat('http://example.com/', '/users/:userId/posts/:postId/comments', { userId: 123, postId: 987, authorId: 456, limit: 10, offset: 120 })</code><br>\n    → <code>'http://example.com/users/123/posts/987/comments?authorId=456&limit=10&offset=120'</code>\n  </li>\n</ul>\n\n**NOTE about empty path segments:** \n[RFC 3986](https://tools.ietf.org/html/rfc3986) allows empty path segments in URLs (for example, `https://example.com//users////2`). *urlcat* keeps any empty path segments that aren't at the concatenation boundary between `baseUrl` and `pathTemplate`. To include an empty path segment there are two options:\n- use a double slash: `urlcat('https://example.com/', '//users', { q: 1 })` → `https://example.com//users?q=1`\n- use the `baseTemplate` overload: `urlcat('https://example.com//users', { q: 1 })` → `https://example.com//users?q=1`\n\n### `query`: build query strings\n\n```ts\nfunction query(params: ParamMap): string\n```\n\nBuilds a query string using the key-value pairs specified. Keys and values are escaped, then joined by the `'&'` character.\n\n#### Examples\n\n<table>\n  <tr><th><code>params</code></th><th>result</th></tr>\n  <tr><td><code>{}</code></td><td><code>''</code></td></tr>\n  <tr><td><code>{ query: 'some text' }</code></td><td><code>'query=some%20text'</code></td></tr>\n  <tr><td><code>{ id: 42, 'comment-id': 86 }</code></td><td><code>'id=42&comment-id=86'</code></td></tr>\n  <tr><td><code>{ id: 42, 'a name': 'a value' }</code></td><td><code>'id=42&a%20name=a%20value'</code></td></tr>\n</table>\n\n### `subst`: substitute path parameters\n\n```ts\nfunction subst(template: string, params: ParamMap): string\n```\n\nSubstitutes parameters with values in a template string. `template` may contain 0 or more parameter placeholders. Placeholders start with a colon (`:`), followed by a parameter name that can only contain uppercase or lowercase letters. Any placeholders found in the template are replaced with the value under the corresponding key in `params`.\n\n#### Examples\n\n<table>\n  <tr><th><code>template</code></th><th><code>params</code></th><th>result</th></tr>\n  <tr><td><code>':id'</code></td><td><code>{ id: 42 }</code></td><td><code>'42'</code></td></tr>\n  <tr><td><code>'/users/:id'</code></td><td><code>{ id: 42 }</code></td><td><code>'/users/42'</code></td></tr>\n  <tr><td><code>'/users/:id/comments/:commentId'</code></td><td><code>{ id: 42, commentId: 86 }</code></td><td><code>'/users/42/comments/86'</code></td></tr>\n  <tr><td><code>'/users/:id'</code></td><td><code>{ id: 42, foo: 'bar' }</code></td><td><code>'/users/42'</code></td></tr>\n</table>\n\n### `join`: join two strings using exactly one separator\n\n```ts\nfunction join(part1: string, separator: string, part2: string): string\n```\n\nJoins the two parts using exactly one separator. If a separator is present at the end of `part1` or the beginning of `part2`, it is removed, then the two parts are joined using `separator`.\n\n#### Examples\n\n<table>\n  <tr><th><code>part1</code></th><th><code>separator</code></th><th><code>part2</code></th><th>result</th></tr>\n  <tr><td><code>'first'</code></td><td><code>','</code></td><td><code>'second'</code></td><td rowspan=\"4\"><code>'first,second'</code></td></tr>\n  <tr><td><code>'first,'</code></td><td><code>','</code></td><td><code>'second'</code></td></tr>\n  <tr><td><code>'first'</code></td><td><code>','</code></td><td><code>',second'</code></td></tr>\n  <tr><td><code>'first,'</code></td><td><code>','</code></td><td><code>',second'</code></td></tr>\n</table>\n\n## Help\n\nThank you for using *urlcat*!\n\nIf you need any help using this library, feel free to [create a GitHub issue](https://github.com/balazsbotond/urlcat/issues/new/choose), and ask your questions. I'll try to answer as quickly as possible.\n\n## Contribute\n\nContributions of any kind (pull requests, bug reports, feature requests, documentation, design) are more than welcome! If you like this project and want to help, but feel like you are stuck, feel free to contact the maintainer (Botond Balázs &lt;balazsbotond@gmail.com&gt;).\n\n### Building from source\n\nBuilding the project should be quick and easy. If it isn't, it's the maintainer's fault. Please report any problems with building in a GitHub issue.\n\nYou need to have a reasonably recent version of node.js to build *urlcat*. \nTested on node version 12.18.3 and npm version 6.14.6.\n\nFirst, clone the git repository:\n\n```\ngit clone git@github.com:balazsbotond/urlcat.git\n```\n\nThen switch to the newly created urlcat directory and install the dependencies:\n\n```\ncd urlcat\nnpm install\n```\n\nYou can then run the unit tests to verify that everything works correctly:\n\n```\nnpm test\n```\n\nAnd finally, build the library:\n\n```\nnpm run build\n```\n\nThe output will appear in the `dist` directory.\n\nHappy hacking!\n\n## Contributors ✨\n\n<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->\n[![All Contributors](https://img.shields.io/badge/all_contributors-18-orange.svg?style=flat-square)](#contributors-)\n<!-- ALL-CONTRIBUTORS-BADGE:END -->\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/balazsbotond\"><img src=\"https://avatars2.githubusercontent.com/u/2791280?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Botond Balázs</b></sub></a><br /><a href=\"https://github.com/balazsbotond/urlcat/commits?author=balazsbotond\" title=\"Code\">💻</a> <a href=\"https://github.com/balazsbotond/urlcat/commits?author=balazsbotond\" title=\"Tests\">⚠️</a> <a href=\"https://github.com/balazsbotond/urlcat/commits?author=balazsbotond\" title=\"Documentation\">📖</a> <a href=\"#infra-balazsbotond\" title=\"Infrastructure (Hosting, Build-Tools, etc)\">🚇</a> <a href=\"https://github.com/balazsbotond/urlcat/issues?q=author%3Abalazsbotond\" title=\"Bug reports\">🐛</a> <a href=\"#maintenance-balazsbotond\" title=\"Maintenance\">🚧</a></td>\n    <td align=\"center\"><a href=\"https://llll-ll.com\"><img src=\"https://avatars0.githubusercontent.com/u/3541096?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>kako-jun</b></sub></a><br /><a href=\"https://github.com/balazsbotond/urlcat/issues?q=author%3Akako-jun\" title=\"Bug reports\">🐛</a> <a href=\"#ideas-kako-jun\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n    <td align=\"center\"><a href=\"https://github.com/polysiya\"><img src=\"https://avatars1.githubusercontent.com/u/722173?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kim Kyudeok</b></sub></a><br /><a href=\"#ideas-polysiya\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n    <td align=\"center\"><a href=\"https://github.com/harshilparmar\"><img src=\"https://avatars3.githubusercontent.com/u/45915468?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Harshil Parmar</b></sub></a><br /><a href=\"https://github.com/balazsbotond/urlcat/commits?author=harshilparmar\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://knpw.rs\"><img src=\"https://avatars0.githubusercontent.com/u/174864?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Ken Powers</b></sub></a><br /><a href=\"#platform-knpwrs\" title=\"Packaging/porting to new platform\">📦</a> <a href=\"#userTesting-knpwrs\" title=\"User Testing\">📓</a></td>\n    <td align=\"center\"><a href=\"https://github.com/praveen5959\"><img src=\"https://avatars3.githubusercontent.com/u/30530587?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Praveen K B</b></sub></a><br /><a href=\"#ideas-praveen5959\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"https://github.com/balazsbotond/urlcat/commits?author=praveen5959\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"http://@engrkhizariqbal\"><img src=\"https://avatars0.githubusercontent.com/u/5228711?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Khizar Iqbal</b></sub></a><br /><a href=\"#ideas-EngrKhizarIqbal\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#infra-EngrKhizarIqbal\" title=\"Infrastructure (Hosting, Build-Tools, etc)\">🚇</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/SimonJang\"><img src=\"https://avatars2.githubusercontent.com/u/10977475?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Simon Jang</b></sub></a><br /><a href=\"#ideas-SimonJang\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"https://github.com/balazsbotond/urlcat/commits?author=SimonJang\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://luyu.blog\"><img src=\"https://avatars0.githubusercontent.com/u/2239547?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Luyu Cheng</b></sub></a><br /><a href=\"https://github.com/balazsbotond/urlcat/commits?author=chengluyu\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"https://www.echooff.dev\"><img src=\"https://avatars0.githubusercontent.com/u/149248?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Christian Rackerseder</b></sub></a><br /><a href=\"https://github.com/balazsbotond/urlcat/commits?author=screendriver\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"https://www.linkedin.com/in/wwaryangupta/\"><img src=\"https://avatars3.githubusercontent.com/u/42470695?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Aryan Gupta</b></sub></a><br /><a href=\"https://github.com/balazsbotond/urlcat/commits?author=withoutwaxaryan\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"http://www.jasonkohles.com\"><img src=\"https://avatars3.githubusercontent.com/u/46860?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Jason Kohles</b></sub></a><br /><a href=\"https://github.com/balazsbotond/urlcat/issues?q=author%3Ajasonk\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/balazsbotond/urlcat/commits?author=jasonk\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://www.linkedin.com/in/tiago-santos-da-silva-328a63ba/\"><img src=\"https://avatars2.githubusercontent.com/u/10531605?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Tiago Santos Da Silva</b></sub></a><br /><a href=\"https://github.com/balazsbotond/urlcat/commits?author=tiago154\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://tom.carrio.me\"><img src=\"https://avatars0.githubusercontent.com/u/8659099?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Tom</b></sub></a><br /><a href=\"https://github.com/balazsbotond/urlcat/commits?author=tcarrio\" title=\"Code\">💻</a> <a href=\"#infra-tcarrio\" title=\"Infrastructure (Hosting, Build-Tools, etc)\">🚇</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/drishit96\"><img src=\"https://avatars1.githubusercontent.com/u/13049630?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Drishit Mitra</b></sub></a><br /><a href=\"#infra-drishit96\" title=\"Infrastructure (Hosting, Build-Tools, etc)\">🚇</a></td>\n    <td align=\"center\"><a href=\"https://github.com/sakshi2912\"><img src=\"https://avatars3.githubusercontent.com/u/51375116?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Sakshi Vattikuti</b></sub></a><br /><a href=\"https://github.com/balazsbotond/urlcat/commits?author=sakshi2912\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"https://github.com/3zk1m0\"><img src=\"https://avatars3.githubusercontent.com/u/19320956?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>3zk1m0</b></sub></a><br /><a href=\"#ideas-3zk1m0\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n    <td align=\"center\"><a href=\"https://seinopsys.dev/\"><img src=\"https://avatars1.githubusercontent.com/u/3200580?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>David Joseph Guzsik</b></sub></a><br /><a href=\"https://github.com/balazsbotond/urlcat/pulls?q=is%3Apr+reviewed-by%3ASeinopSys\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-enable -->\n<!-- prettier-ignore-end -->\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md"}