22
33# zipurl
44
5- > Generate ** gzip ** web -safe strings on the browser. Built in 10 minutes. : smile :
5+ > Generate gzipped url -safe strings on the browser or nodejs
66
7- Dead simple mash-up of [ ` pako ` ] ( https://github.com/nodeca/pako ) and
8- [ ` js-base64 ` ] ( https://github.com/dankogai/js-base64 ) to create ** gzipped ** URL-safe base64 strings
9- from any data on the browser. Very useful for passing large datasets via shareable web links.
7+ Encode/decode long strings into compressed gzipped lossless url-safe representations. Very useful
8+ for sharing large datasets, like JSON, via URLs. [ Code ] ( https://cdn.jsdelivr.net/npm/zipurl@2 ) is
9+ only ** ≈1kB ** . Featuring:
1010
11- 48kb minified, 15kb ** gzipped** , pun not intended.
11+ - [x] Lightning-fast, feather-light, zero dependencies (unless needed)
12+ - [x] Native-first, uses web standards for modern browsers
13+ - [x] Feature-detects, falling back to [ pako] ( https://github.com/nodeca/pako ) and
14+ [ js-base64] ( https://github.com/dankogai/js-base64 ) for older ones
15+ - [x] Universal, works on both browser and nodejs
16+ - [x] Battle-tested in real world; test suite included.
1217
1318## Demo
1419
1520This package is used in [ JSON Pretty Print Online] ( https://zerodevx.github.io/json-pretty-print/ ) to
16- compress and share stringified JSON with URL query params .
21+ compress and share JSON via URLs .
1722
1823See it in action
1924[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/).
@@ -26,47 +31,24 @@ $ npm i -D zipurl
2631
2732## Usage
2833
29- ### In the browser
30-
31- #### Via CDN
32-
33- ``` html
34- <script src =" https://cdn.jsdelivr.net/npm/zipurl@1" ></script >
35- <script >
36- console .log (zipurl (' hello world!' )) // H4sIAAAAAAAAA8tIzcnJVyjPL8pJUQQAbcK0AwwAAAA
37- console .log (unzipurl (' H4sIAAAAAAAAA8tIzcnJVyjPL8pJUQQAbcK0AwwAAAA' )) // hello world!
38- </script >
39- ```
40-
41- The functions ` zipurl() ` and ` unzipurl() ` are available in the global (` window ` ) scope.
42-
43- #### Or locally
34+ ### Browser via CDN
4435
4536``` html
46- <script src =" path/to/dist/index.min.js" ></script >
47- ```
48-
49- #### Or with a bundler
37+ <script type =" module" >
38+ import { zipurl , unzipurl } from ' https://cdn.jsdelivr.net/npm/zipurl@2'
5039
51- ``` js
52- import { zipurl , unzipurl } from ' zipurl'
40+ console .log (await zipurl (' hello world!' )) // H4sIAAAAAAAAA8tIzcnJVyjPL8pJUQQAbcK0AwwAAAA
41+ console .log (await unzipurl (' H4sIAAAAAAAAA8tIzcnJVyjPL8pJUQQAbcK0AwwAAAA' )) // hello world!
42+ </script >
5343```
5444
55- ### In Node.js
56-
57- #### ESM
45+ ### With a bundler or in Node.js
5846
5947``` js
6048import { zipurl , unzipurl } from ' zipurl'
6149
62- console .log (zipurl (' hello world!' )) // H4sIAAAAAAAAA8tIzcnJVyjPL8pJUQQAbcK0AwwAAAA
63- console .log (unzipurl (' H4sIAAAAAAAAA8tIzcnJVyjPL8pJUQQAbcK0AwwAAAA' )) // hello world!
64- ```
65-
66- #### CJS
67-
68- ``` js
69- const { zipurl , unzipurl } = require (' zipurl' )
50+ console .log (await zipurl (' hello world!' )) // H4sIAAAAAAAAA8tIzcnJVyjPL8pJUQQAbcK0AwwAAAA
51+ console .log (await unzipurl (' H4sIAAAAAAAAA8tIzcnJVyjPL8pJUQQAbcK0AwwAAAA' )) // hello world!
7052```
7153
7254### Use the CLI
@@ -97,12 +79,21 @@ $ echo H4sIAAAAAAAAA8tIzcnJVyjPL8pJUQQAbcK0AwwAAAA | unzipurl
9779hello world!
9880```
9981
100- ## Encoding/decoding
82+ ## API
10183
102- ``` js
103- zipurl (' hello world!' ) // H4sIAAAAAAAAA8tIzcnJVyjPL8pJUQQAbcK0AwwAAAA
84+ ### zipurl(input: string): Promise<string >
85+
86+ Compress a string using gzip and encode as URL-safe base64.
87+
88+ ### unzipurl(input: string): Promise<string >
89+
90+ Decode base64url and decompress back into the original string.
10491
105- unzipurl (' H4sIAAAAAAAAA8tIzcnJVyjPL8pJUQQAbcK0AwwAAAA' ) // hello world!
92+ ## Encoding/decoding examples
93+
94+ ``` js
95+ const encoded = await zipurl (' hello world!' ) // H4sIAAAAAAAAA8tIzcnJVyjPL8pJUQQAbcK0AwwAAAA
96+ const decoded = await unzipurl (encoded) // hello world!
10697```
10798
10899That's it!
@@ -115,9 +106,13 @@ const a = JSON.stringify({"students":[{"name":"Jack","age":17},{"name":"Jill","a
115106
116107console .log (a .length ) // 103 bytes
117108console .log (encodeURIComponent (a).length ) // 199 bytes
118- console .log (zipurl (a).length ) // 116 bytes
109+ console .log ((await zipurl (a)).length ) // 116 bytes
110+ ```
119111
120- // Let's try something bigger (3122 bytes)
112+ Let's try something bigger (3122 bytes):
113+
114+ <!-- prettier-ignore -->
115+ ``` js
121116const b = JSON .stringify ({" shaderStatements" : [{" output" : " b" ," outputSwizzle" : " zxyw" ," assignmentOperator" : " -=" ,
122117" functionName" : " " ," parameter" : " a" ," valueX" : 6.62 ," valueY" : 6.165 ," valueZ" : - 0.974 ," valueW" : - 4.233 ," parameterSwizzle" : " xzyy" },
123118{" output" : " b" ," outputSwizzle" : " ywxz" ," assignmentOperator" : " -=" ," functionName" : " " ," parameter" : " a" ," valueX" : - 4.88 ,
@@ -149,7 +144,7 @@ const b = JSON.stringify({"shaderStatements":[{"output":"b","outputSwizzle":"zxy
149144
150145console .log (b .length ) // 3122 bytes
151146console .log (encodeURIComponent (b).length ) // 4952 bytes
152- console .log (zipurl (b).length ) // 1120 bytes - 77.4% reduction in size :)
147+ console .log (( await zipurl (b) ).length ) // 1120 bytes - 77.4% reduction in size :)
153148```
154149
155150## Google Apps Script
0 commit comments