{"id":15386675,"url":"https://github.com/zerodevx/zipurl","last_synced_at":"2025-04-15T18:30:38.953Z","repository":{"id":40653697,"uuid":"231719154","full_name":"zerodevx/zipurl","owner":"zerodevx","description":"Generate gzip web-safe strings on the browser. Built in 10 minutes. 😄","archived":false,"fork":false,"pushed_at":"2025-03-25T15:32:56.000Z","size":496,"stargazers_count":2,"open_issues_count":1,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-29T00:33:34.346Z","etag":null,"topics":["base64","gzip","url-safe"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"isc","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zerodevx.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-01-04T06:24:22.000Z","updated_at":"2025-02-11T15:51:03.000Z","dependencies_parsed_at":"2024-08-26T08:45:58.197Z","dependency_job_id":"2932cb08-71b8-4211-8a23-8ab3d42c7f21","html_url":"https://github.com/zerodevx/zipurl","commit_stats":{"total_commits":73,"total_committers":1,"mean_commits":73.0,"dds":0.0,"last_synced_commit":"1130b1e2a89e1f2c0e6ca616f271b5e627f70bfc"},"previous_names":[],"tags_count":26,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zerodevx%2Fzipurl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zerodevx%2Fzipurl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zerodevx%2Fzipurl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zerodevx%2Fzipurl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zerodevx","download_url":"https://codeload.github.com/zerodevx/zipurl/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249128878,"owners_count":21217234,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["base64","gzip","url-safe"],"created_at":"2024-10-01T14:50:09.895Z","updated_at":"2025-04-15T18:30:38.597Z","avatar_url":"https://github.com/zerodevx.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"![NPM Version](https://img.shields.io/npm/v/zipurl)\n\n# zipurl\n\n\u003e Generate **gzip** web-safe strings on the browser. Built in 10 minutes. :smile:\n\nDead simple mash-up of [`pako`](https://github.com/nodeca/pako) and\n[`js-base64`](https://github.com/dankogai/js-base64) to create **gzipped** URL-safe base64 strings\nfrom any data on the browser. Very useful for passing large datasets via shareable web links.\n\n48kb minified, 15kb **gzipped**, pun not intended.\n\n## Demo\n\nThis package is used in [JSON Pretty Print Online](https://zerodevx.github.io/json-pretty-print/) to\ncompress and share stringified JSON with URL query params.\n\nSee it in action\n[here](https://zerodevx.github.io/json-pretty-print/H4sIAAAAAAAAA6WZa3OkNhaG_4q2Kx82tQ0RAgTyp3E8no2T8WTW4ySVSlJbAkS3dmjocLHdSeW_79EFEAm245pylbsbJKHb--g9h59-3_xXFpuzDcUJozwso5SWNA9wmgZRHkTxZruRdSEeNmd4u9kNpmxCkyjgmZdneeRFNM-8NI5Sj1LMy4KHnGaZqted5728E5uzvh3EdpPxitc5_Nx8RraUpH7KoNRR5v3Qqqv7vj-effHFseK52DdV4cv-i5A8hARK8R2UCKPtRpzERVM1LZTP2ua-hns1P6jqb5u25uhD1XB1cSeg16pUKQ68EnAlbw5HXp_g0vtvb26vLs7hGtyTFVypVN1OVX11bNpe5tyH4qp3-6ZWjf8rQP9kQfQ5ijDzSExS1aeiaEXXwd0gTNB5DU-_aIa236LLSv7G72RViS16J-7RtXiQebNFDCeBqpg1Qw_VLntUqLEIxGt5QAe-gyZ4JX8dOOpk3aNj28hCwJeDVAVkgY68lRzmC4kB6iKhLvNCHmUnc1nvfHR-EL17BZXDDmog6KhAvw4SFaIT7QBtwo_ORzfi2Iq9nizZo3yojnzslOmPak61qR_VlCW0ypFsB1WgqSqoNFQVP-QNkrX_c_uzmvxW7GTXi1ao3UJwQD0cezi8xelZwM5IjDz4hjGUrHgv-6GAKYZ95MdhRFgAV5t6Zy-n2E9SypLtpuc7mOufoHGnx2r51fPV-sJ8D2rNTLf0ApllPzRFo66rSdz8st2UrYTqqrHfN2pD42kP3fJM9nuO3lTNqdj8sTX3A2ePQcsc_bCXvZhuk_k27G-uBo6-hFWrxGnzBzxu1wrRw1JAga9EVcE-cLbqP9CPzYD2_E4ghoa6FbxAB1gs2PCdD50u-V0D4xRv2kGqPcOPx8o8eqnbUsQhJVRkIoMfhM-6DSbd4iwq85CGHitBvFFaxh7PktBLcpwVBWUlI3Sh25JX3VK44TaKQl9v_5cIN3hKuN-rxmHGlrpdUe3b85ur764d2d6pmpnQqq1AGcNhTbYRUbKlXphG4VK2QYzOqwxaayuBbhpebNHXPB8OGd-i94No-wbdaOEGmFJHuLB-4oDuhNr9Wq_yCLs_l4UslLK0dvW2tIJy7mkdgpzMbkWCT4L00YVRH-jS_BvVJrp-_v4g2hz2YC-bGlXQoRZaMc_SCu3UQ0ZK-Ojq2MF9PvRiKrwQsmp61K8uAI8dRyTk0IF0FHbGIp3u57ktYDkxDsXt2cQpMwFNnnORc6j7rungNChGLFl1ol4cALwTrGBifXRt8CIezGw4k2gaNaN2WcfdoWm5--hSXZtQqf4pmNmhLYYOGIYr_Yg12xdTBaZJL_fjhAuIFwDhEjilzjBbIxzxw4jFLF7wzWOhj1lC0xlwdv6hrpkVteG1ntVawqeGmerWdO1Jpn3dnNBXvG1hgvqmXoHaRcUlDP49X2Xam0oc1Nz-AEJrH-HZrGAHZwH-FJ4JkRSchykTJC5YUsw8IxPP0iQJA3ArXl7m2IsIEV6WBcKjQVJkWclFUMZP-5Bwi1kAB8wLcRYvcVYNwrUh96I9gRM4HNV0P0m08w-3391cLY2Iqp2byq-OcJgMIKQVqqUk-BzFYEZCHAcLqjE4X2_Vfh7dyFV7L2tjRL4WbSdOyogYFFqevR49geCTBZjNx_RFqWBx-moPMerfQNGKB-yJoiAwzb2ZN3UnwN1YDFqlgkbVL03NkT1W2_aXvjW6EvMAU7qYlOuWFKN4rfpHldeWPSPo_spSBV2LKgOMCZoaALXkQJQP5tEOdsZOw4WpnbGmZm83Uwv6rC_pEfroW0srO7p67IkAEj0CG4KVnQqCWxyfEXKGozXYJIHPohCWeUkbAoc3wYxGM26MN1JeDz7H0et9CouV9wJ24AidWm9o09WnoQNztKsE7GF03tagoTUvJXi-R98D1mFvrZmpUw33L4a6hrb2_PCol3L19mL-ZLyGvxUAFSxWrkrwkqZFYIyRAVA4AYgLWiaYCi8ME-pFRUo8xsrQi7IijWOcJVHCnwZQsCU49knyQgDhJwAEHO9P6Muhrbtn4qCr15f__taBz1HVzFTFVyD4XbNmplgM2KHEIxAhLrATJzEcM3Xe5B_Rh14t0xadw5FRCGHh82PTfgT0BAl20PN-NApW10Yk9kcxa1ZHHD56a7QxBTGj2mSN9FFo_-fDURYclD25AdgG1mPorQ4mplhKFT6HMSg6d8StpWurdnImyzvjufoJOeBTLAgeMwnMwwlM3G2AQbRnBK-GQSn1KUtZwpbCjZnPYN6Vk14IV6oHuSBTPwd1oxi__R29Xuw5IPiCt3fqkP-LVl-fTEzzPw5eYEWrsNs-ggFom-Zj94hOnW3piJT-HY3CDuD3sJXa05pRKEJK8zCMgyRkcY5nnUaTTpOi4GVCQaJlmngRT0CnhDKP0ZBFRcmiOGHPBD5kSxPsx-STAh81K07g8w2vBfgq8XEh1L_I9OLy3e3VxaUj1I9Q8V7Ve6XYKXOxplRtEFjghTQgC6XSiKDXgrew6evRI7xp2gzOOIjLwC8UfA8LFoWpK9QrHfKbM9CcVo7KrD7Gg9ao6HthnYA61EwGAwQ9Ov658l1TDUf4ImyhSdPFZD3mYKCzjhwED2ZlClG06icqgBotB4z7MO2a4OVaZzW0qvV5bQKyh1wcewEYkhY1EzjGg1nL3XDJYkg5CD5HOiYcXIR6veN4NNjAkIxxi1NwDs-0KXkMH7GHI4-w24CcEQbcWMMHBOdRAqRJFvRIiI8jQkMnizKN2M2cjKkUPRR1Y1wjtbfsONU2fDaP8roZdhXvINoT1QpOAAk7jm54DZN73K_w5Bve78FggjxuZPMYUWb5OEBJPhkoRUR4HJepyCjPSpbOQIknoJCgEBkjuVcUGfEizAOPpRH18hzHNKZJkMbps5mUAAc-fWnokTyVSYHzV5zQ7al7JvD4oJByc3XhIGWvqvaq5qtOQaWV-VrUkVBz_IeELqOOOCHo8kGo3Nd4-l8DX2DBOlAwWIFW_tbUHLCSMhcr74AN4s9hhaWMEaL24TYYtzdsZlL7hdmljkGDdtda2g-j3BdOfySQNRmmlkqNWo9xYe-PDn6kmoWJ-8RRtKq2Ap1uCqrqjOnoFGy84LoZ0z2dPnKshhnvHEUIGzbpEY29nmg5d1TMCRbdkzEhY-GoG5whO4JtkSlyMaan2BnlE3aGeQG7xQTOOSDPGo9C4sc4SJY4CoLEJywl1OURYHj0KroFNX43mWtXw8WV6J_J5gJD4EgACrWwSCscuuZtt-dgTcC9tOv5XI6uQW-PJT4cwb3U1DwaeEQ0okVURiyL0yiJk5k_dM58lJjmBFMv41nsRRHLvbQoC09EAVdvZuAAKJ97A4OJyjx9WiJ3EXhcN01xQl_BgjX3_PQkgL68evv2-vK1w5-Dqry3dV9lsMQHUawRCCdAoAR8dPKnACSKGTqHcVRyeg8DfrbtxvcwTdvv1ZWmkopDJMap-y5mNXtpXISR9ZixNOKyjseqRccAU64AsPNaJUaACDpBMr0gMa0pOU4BjjYX8xsUAwXTOJBDSdQWnbMwk1dZxEoLxBkvMqWHDXXAkU0QWHR4Svy6PkSXWI5yfvKEFsszY60-OM9U5sdCbGKTJo6BnH7UlGge2_XRrXmgcoyKZMa4jeUmf7c8LTo5xYE--g_Uml-SaaeoH2gMn15IA9XVI8G-fHMG8Rj8Eg_UhwF-wVlAz-LVHIyXJCrbgnG0wF-sMo5RyIjrxhZcG5aZGHWawIfdJYoleis-Db9vZAv9rdEl7I6m71fodyN3uw5Oa167eWHixIQCTAsHRQ_A5nUALjXvMDB-CQN_-T_JtmU7hx4AAA/).\n\n## Install\n\n```\n$ npm i -D zipurl\n```\n\n## Usage\n\n### In the browser\n\n#### Via CDN\n\n```html\n\u003cscript src=\"https://cdn.jsdelivr.net/npm/zipurl@1\"\u003e\u003c/script\u003e\n\u003cscript\u003e\n  console.log(zipurl('hello world!')) // H4sIAAAAAAAAA8tIzcnJVyjPL8pJUQQAbcK0AwwAAAA\n  console.log(unzipurl('H4sIAAAAAAAAA8tIzcnJVyjPL8pJUQQAbcK0AwwAAAA')) // hello world!\n\u003c/script\u003e\n```\n\nThe functions `zipurl()` and `unzipurl()` are available in the global (`window`) scope.\n\n#### Or locally\n\n```html\n\u003cscript src=\"path/to/dist/index.min.js\"\u003e\u003c/script\u003e\n```\n\n#### Or with a bundler\n\n```js\nimport { zipurl, unzipurl } from 'zipurl'\n```\n\n### In Node.js\n\n#### ESM\n\n```js\nimport { zipurl, unzipurl } from 'zipurl'\n\nconsole.log(zipurl('hello world!')) // H4sIAAAAAAAAA8tIzcnJVyjPL8pJUQQAbcK0AwwAAAA\nconsole.log(unzipurl('H4sIAAAAAAAAA8tIzcnJVyjPL8pJUQQAbcK0AwwAAAA')) // hello world!\n```\n\n#### CJS\n\n```js\nconst { zipurl, unzipurl } = require('zipurl')\n```\n\n### Use the CLI\n\nInstall globally:\n\n```\n$ npm i -g zipurl\n```\n\nInput arguments:\n\n```\n$ zipurl hello world!\nH4sIAAAAAAAAA8tIzcnJVyjPL8pJUQQAbcK0AwwAAAA\n\n$ unzipurl H4sIAAAAAAAAA8tIzcnJVyjPL8pJUQQAbcK0AwwAAAA\nhello world!\n```\n\nPipe through `stdin`:\n\n```\n$ echo hello world! | zipurl\nH4sIAAAAAAAAA8tIzcnJVyjPL8pJUQQAbcK0AwwAAAA\n\n$ echo H4sIAAAAAAAAA8tIzcnJVyjPL8pJUQQAbcK0AwwAAAA | unzipurl\nhello world!\n```\n\n## Encoding/decoding\n\n```js\nzipurl('hello world!') // H4sIAAAAAAAAA8tIzcnJVyjPL8pJUQQAbcK0AwwAAAA\n\nunzipurl('H4sIAAAAAAAAA8tIzcnJVyjPL8pJUQQAbcK0AwwAAAA') // hello world!\n```\n\nThat's it!\n\nOk, so it works much better with larger datasets:\n\n\u003c!-- prettier-ignore --\u003e\n```js\nconst a = JSON.stringify({\"students\":[{\"name\":\"Jack\",\"age\":17},{\"name\":\"Jill\",\"age\":16},{\"name\":\"Sue\",\"age\":16}],\"class\":\"math\"})\n\nconsole.log(a.length) // 103 bytes\nconsole.log(encodeURIComponent(a).length) // 199 bytes\nconsole.log(zipurl(a).length) // 116 bytes\n\n// Let's try something bigger (3122 bytes)\nconst b = JSON.stringify({\"shaderStatements\":[{\"output\":\"b\",\"outputSwizzle\":\"zxyw\",\"assignmentOperator\":\"-=\",\n\"functionName\":\"\",\"parameter\":\"a\",\"valueX\":6.62,\"valueY\":6.165,\"valueZ\":-0.974,\"valueW\":-4.233,\"parameterSwizzle\":\"xzyy\"},\n{\"output\":\"b\",\"outputSwizzle\":\"ywxz\",\"assignmentOperator\":\"-=\",\"functionName\":\"\",\"parameter\":\"a\",\"valueX\":-4.88,\n\"valueY\":0.649,\"valueZ\":0.171,\"valueW\":-0.084,\"parameterSwizzle\":\"yzwx\"},{\"output\":\"a\",\"outputSwizzle\":\"xzwy\",\n\"assignmentOperator\":\"*=\",\"functionName\":\"logA\",\"parameter\":\"b\",\"valueX\":-2.368,\"valueY\":-7.284,\"valueZ\":-5.01,\n\"valueW\":-0.005,\"parameterSwizzle\":\"zzwz\"},{\"output\":\"b\",\"outputSwizzle\":\"xwzy\",\"assignmentOperator\":\"-=\",\n\"functionName\":\"sin\",\"parameter\":\"b\",\"valueX\":-3.686,\"valueY\":-3.258,\"valueZ\":-4.059,\"valueW\":-8.506,\n\"parameterSwizzle\":\"wwzz\"},{\"output\":\"b\",\"outputSwizzle\":\"zxyw\",\"assignmentOperator\":\"=\",\"functionName\":\"ceil\",\n\"parameter\":\"b\",\"valueX\":5.36,\"valueY\":-8.274,\"valueZ\":0.002,\"valueW\":5.429,\"parameterSwizzle\":\"xxwy\"},{\"output\":\"a\",\n\"outputSwizzle\":\"xzwy\",\"assignmentOperator\":\"=\",\"functionName\":\"\",\"parameter\":\"b\",\"valueX\":-3.353,\"valueY\":-5.681,\n\"valueZ\":-7.792,\"valueW\":1.254,\"parameterSwizzle\":\"zyxw\"},{\"output\":\"b\",\"outputSwizzle\":\"ywxz\",\"assignmentOperator\":\"+=\",\n\"functionName\":\"floor\",\"parameter\":\"a\",\"valueX\":6.669,\"valueY\":-0.05,\"valueZ\":-8.629,\"valueW\":-2.802,\n\"parameterSwizzle\":\"xyyw\"},{\"output\":\"b\",\"outputSwizzle\":\"xywz\",\"assignmentOperator\":\"+=\",\"functionName\":\"fract\",\n\"parameter\":\"a\",\"valueX\":0.103,\"valueY\":-3.118,\"valueZ\":0.255,\"valueW\":6.287,\"parameterSwizzle\":\"xyyw\"},{\"output\":\"a\",\n\"outputSwizzle\":\"zxyw\",\"assignmentOperator\":\"/=\",\"functionName\":\"ceil\",\"parameter\":\"\",\"valueX\":5.484,\"valueY\":-1.26,\n\"valueZ\":8.705,\"valueW\":-1.59,\"parameterSwizzle\":\"zyyw\"},{\"output\":\"a\",\"outputSwizzle\":\"wyzx\",\"assignmentOperator\":\"=\",\n\"functionName\":\"sqrtA\",\"parameter\":\"b\",\"valueX\":-0.366,\"valueY\":-0.117,\"valueZ\":0.162,\"valueW\":1.761,\n\"parameterSwizzle\":\"yywy\"},{\"output\":\"a\",\"outputSwizzle\":\"yxzw\",\"assignmentOperator\":\"*=\",\"functionName\":\"atan\",\n\"parameter\":\"b\",\"valueX\":3.743,\"valueY\":-0.003,\"valueZ\":4.636,\"valueW\":0.056,\"parameterSwizzle\":\"wxxw\"},{\"output\":\"b\",\n\"outputSwizzle\":\"zwxy\",\"assignmentOperator\":\"=\",\"functionName\":\"\",\"parameter\":\"\",\"valueX\":6.083,\"valueY\":-6.322,\n\"valueZ\":0.032,\"valueW\":0.428,\"parameterSwizzle\":\"yzyy\"},{\"output\":\"a\",\"outputSwizzle\":\"zxyw\",\"assignmentOperator\":\"/=\",\n\"functionName\":\"\",\"parameter\":\"a\",\"valueX\":0.151,\"valueY\":1.024,\"valueZ\":-2.862,\"valueW\":3.193,\"parameterSwizzle\":\"xzyx\"},\n{\"output\":\"a\",\"outputSwizzle\":\"zwxy\",\"assignmentOperator\":\"*=\",\"functionName\":\"\",\"parameter\":\"a\",\"valueX\":-1.637,\n\"valueY\":1.828,\"valueZ\":1.924,\"valueW\":-0.006,\"parameterSwizzle\":\"yxyy\"}],\"randSeed\":-1810015485,\n\"randSeedString\":\"1574121532870\",\"iterationCount\":1,\"gridPosX\":4,\"gridPosY\":0,\"generation\":17,\"subGeneration\":1,\n\"hueOffset\":0.218,\"hueScale\":-0.789,\"saturationScale\":0.493,\"uvOffsetX\":-0.36,\"uvOffsetY\":0.559,\"uvScaleX\":1.02,\n\"uvScaleY\":-1.143,\"rotate\":0,\"usePalette\":0,\"paletteColors\":[{\"x\":0.041,\"y\":0.01,\"z\":0.584},{\"x\":0.131,\"y\":0.102,\n\"z\":0.658},{\"x\":0.9,\"y\":0.855,\"z\":0.917},{\"x\":0.797,\"y\":0.882,\"z\":0.478}],\"saveListIndex\":-1,\"uniqueID\":361315861})\n\nconsole.log(b.length) // 3122 bytes\nconsole.log(encodeURIComponent(b).length) // 4952 bytes\nconsole.log(zipurl(b).length) // 1120 bytes - 77.4% reduction in size :)\n```\n\n## Google Apps Script\n\nIf you're using GAS somewhere along your pipeline, `zipurl` is supported natively (kindof).\n\nHere's the gist:\n\n\u003c!-- prettier-ignore --\u003e\n```js\nfunction zipurl(data) {\n  const { gzip, base64EncodeWebSafe, newBlob } = Utilities\n  const blob = gzip(newBlob(data)).getBytes()\n  return base64EncodeWebSafe(blob).replace(/=/g, '')\n}\n\nfunction unzipurl(data) {\n  const { ungzip, base64DecodeWebSafe, newBlob } = Utilities\n  const blob = newBlob(base64DecodeWebSafe(data)).setContentType('application/x-gzip')\n  return ungzip(blob).getDataAsString()\n}\n```\n\nAnd the outputs should be binary-equivalent to that of this package.\n\n## License\n\nISC\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzerodevx%2Fzipurl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzerodevx%2Fzipurl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzerodevx%2Fzipurl/lists"}