├── .gitignore ├── package.json ├── index.js ├── README.md └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | *.LCK 3 | *.swp 4 | *~ 5 | 6 | # Emacs 7 | .projectile 8 | *GTAGS* 9 | *GPATH* 10 | *GRTAGS* 11 | 12 | # generated qrcodes 13 | *.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "stealth-service-qrcode", 3 | "description": "Client Cookies QR Code generator for Orbot", 4 | "main": "index.js", 5 | "repository": "sub/client-cookies-qrcode", 6 | "license": "MIT", 7 | "scripts": { 8 | "qr": "node index.js" 9 | }, 10 | "dependencies": { 11 | "qrcode": "^1.2.0" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const QRCode = require('qrcode'); 2 | 3 | // read script arguments 4 | const args = process.argv.slice(2); 5 | const clientString = args[0].split('#')[0].trim(); 6 | 7 | // get service's url & cookie 8 | const serviceUrl = clientString.split(' ')[0]; 9 | const serviceCookie = clientString.split(' ')[1]; 10 | 11 | const filePath = `${process.cwd()}/${serviceUrl}.png`; 12 | const json = `{"auth_cookie_value": "${serviceCookie}", "domain":"${serviceUrl}"}`; 13 | 14 | // generate the qr image 15 | QRCode.toFile(filePath, json, function (err, url) { 16 | console.log(`cookie saved to ${filePath} for service ${serviceUrl}`); 17 | }); 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Client Cookies QR Code generator for Orbot 2 | 3 | Generate **Client Cookies QR codes** for Orbot. 4 | 5 | The typical use case is: 6 | * you have a [Stealth Hidden Service](https://www.torproject.org/docs/tor-manual.html.en#HiddenServiceAuthorizeClient) 7 | * you want to configure Orbot, on your mobile device, with the right service url & cookie 8 | 9 | Normally this info is mantained in _${HiddenServiceDir}/hostname_ file - hosted in the server - in this format: 10 | 11 | ```shell 12 | ServiceUrl.onion ClientCookie # Comment 13 | ``` 14 | 15 | ## Usage 16 | 17 | ```shell 18 | git clone https://github.com/sub/client-cookies-qrcode.git 19 | cd client-cookies-qrcode 20 | yarn install 21 | # pass to yarn qr the configuration string as copied 22 | # from ${HiddenServiceDir}/hostname (don't forget the double quotes!) 23 | yarn qr "ServiceUrl.onion ClientCookie # Comment" 24 | ``` 25 | 26 | Now you'll find a file named _ServiceUrl.onion.png_ in your working dir. 27 | Simply: 28 | - open the file on your pc 29 | - open Orbot on your mobile phone 30 | - tap menu (in the top right corner) -> Hidden Services -> Client Cookies 31 | - tap menu (in the top right corner) -> Read from QR 32 | - scan the qr code image 33 | - restart orbot 34 | 35 | ## Links 36 | - [Tor: Onion Service Protocol](https://www.torproject.org/docs/onion-services.html.en) 37 | - [Configuring Onion Services for Tor](https://www.torproject.org/docs/tor-onion-service) 38 | - [Tor's protocol specifications::Authorization for limited number of clients](https://gitweb.torproject.org/torspec.git/tree/rend-spec-v2.txt#n928) 39 | 40 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | ansi-regex@^2.0.0: 6 | version "2.1.1" 7 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 8 | 9 | ansi-regex@^3.0.0: 10 | version "3.0.0" 11 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 12 | 13 | builtin-modules@^1.0.0: 14 | version "1.1.1" 15 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 16 | 17 | camelcase@^4.1.0: 18 | version "4.1.0" 19 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" 20 | 21 | can-promise@^0.0.1: 22 | version "0.0.1" 23 | resolved "https://registry.yarnpkg.com/can-promise/-/can-promise-0.0.1.tgz#7a7597ad801fb14c8b22341dfec314b6bd6ad8d3" 24 | dependencies: 25 | window-or-global "^1.0.1" 26 | 27 | cliui@^3.2.0: 28 | version "3.2.0" 29 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" 30 | dependencies: 31 | string-width "^1.0.1" 32 | strip-ansi "^3.0.1" 33 | wrap-ansi "^2.0.0" 34 | 35 | code-point-at@^1.0.0: 36 | version "1.1.0" 37 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 38 | 39 | cross-spawn@^5.0.1: 40 | version "5.1.0" 41 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 42 | dependencies: 43 | lru-cache "^4.0.1" 44 | shebang-command "^1.2.0" 45 | which "^1.2.9" 46 | 47 | decamelize@^1.1.1: 48 | version "1.2.0" 49 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 50 | 51 | dijkstrajs@^1.0.1: 52 | version "1.0.1" 53 | resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.1.tgz#d3cd81221e3ea40742cfcde556d4e99e98ddc71b" 54 | 55 | error-ex@^1.2.0: 56 | version "1.3.1" 57 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" 58 | dependencies: 59 | is-arrayish "^0.2.1" 60 | 61 | execa@^0.7.0: 62 | version "0.7.0" 63 | resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" 64 | dependencies: 65 | cross-spawn "^5.0.1" 66 | get-stream "^3.0.0" 67 | is-stream "^1.1.0" 68 | npm-run-path "^2.0.0" 69 | p-finally "^1.0.0" 70 | signal-exit "^3.0.0" 71 | strip-eof "^1.0.0" 72 | 73 | find-up@^2.0.0: 74 | version "2.1.0" 75 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" 76 | dependencies: 77 | locate-path "^2.0.0" 78 | 79 | get-caller-file@^1.0.1: 80 | version "1.0.2" 81 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" 82 | 83 | get-stream@^3.0.0: 84 | version "3.0.0" 85 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" 86 | 87 | graceful-fs@^4.1.2: 88 | version "4.1.11" 89 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 90 | 91 | hosted-git-info@^2.1.4: 92 | version "2.5.0" 93 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" 94 | 95 | invert-kv@^1.0.0: 96 | version "1.0.0" 97 | resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" 98 | 99 | is-arrayish@^0.2.1: 100 | version "0.2.1" 101 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 102 | 103 | is-builtin-module@^1.0.0: 104 | version "1.0.0" 105 | resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 106 | dependencies: 107 | builtin-modules "^1.0.0" 108 | 109 | is-fullwidth-code-point@^1.0.0: 110 | version "1.0.0" 111 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 112 | dependencies: 113 | number-is-nan "^1.0.0" 114 | 115 | is-fullwidth-code-point@^2.0.0: 116 | version "2.0.0" 117 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 118 | 119 | is-stream@^1.1.0: 120 | version "1.1.0" 121 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 122 | 123 | isarray@^2.0.1: 124 | version "2.0.4" 125 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.4.tgz#38e7bcbb0f3ba1b7933c86ba1894ddfc3781bbb7" 126 | 127 | isexe@^2.0.0: 128 | version "2.0.0" 129 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 130 | 131 | lcid@^1.0.0: 132 | version "1.0.0" 133 | resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" 134 | dependencies: 135 | invert-kv "^1.0.0" 136 | 137 | load-json-file@^2.0.0: 138 | version "2.0.0" 139 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" 140 | dependencies: 141 | graceful-fs "^4.1.2" 142 | parse-json "^2.2.0" 143 | pify "^2.0.0" 144 | strip-bom "^3.0.0" 145 | 146 | locate-path@^2.0.0: 147 | version "2.0.0" 148 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" 149 | dependencies: 150 | p-locate "^2.0.0" 151 | path-exists "^3.0.0" 152 | 153 | lru-cache@^4.0.1: 154 | version "4.1.1" 155 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" 156 | dependencies: 157 | pseudomap "^1.0.2" 158 | yallist "^2.1.2" 159 | 160 | mem@^1.1.0: 161 | version "1.1.0" 162 | resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" 163 | dependencies: 164 | mimic-fn "^1.0.0" 165 | 166 | mimic-fn@^1.0.0: 167 | version "1.2.0" 168 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" 169 | 170 | normalize-package-data@^2.3.2: 171 | version "2.4.0" 172 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" 173 | dependencies: 174 | hosted-git-info "^2.1.4" 175 | is-builtin-module "^1.0.0" 176 | semver "2 || 3 || 4 || 5" 177 | validate-npm-package-license "^3.0.1" 178 | 179 | npm-run-path@^2.0.0: 180 | version "2.0.2" 181 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" 182 | dependencies: 183 | path-key "^2.0.0" 184 | 185 | number-is-nan@^1.0.0: 186 | version "1.0.1" 187 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 188 | 189 | os-locale@^2.0.0: 190 | version "2.1.0" 191 | resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" 192 | dependencies: 193 | execa "^0.7.0" 194 | lcid "^1.0.0" 195 | mem "^1.1.0" 196 | 197 | p-finally@^1.0.0: 198 | version "1.0.0" 199 | resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" 200 | 201 | p-limit@^1.1.0: 202 | version "1.2.0" 203 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" 204 | dependencies: 205 | p-try "^1.0.0" 206 | 207 | p-locate@^2.0.0: 208 | version "2.0.0" 209 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" 210 | dependencies: 211 | p-limit "^1.1.0" 212 | 213 | p-try@^1.0.0: 214 | version "1.0.0" 215 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" 216 | 217 | parse-json@^2.2.0: 218 | version "2.2.0" 219 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 220 | dependencies: 221 | error-ex "^1.2.0" 222 | 223 | path-exists@^3.0.0: 224 | version "3.0.0" 225 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 226 | 227 | path-key@^2.0.0: 228 | version "2.0.1" 229 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 230 | 231 | path-type@^2.0.0: 232 | version "2.0.0" 233 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" 234 | dependencies: 235 | pify "^2.0.0" 236 | 237 | pify@^2.0.0: 238 | version "2.3.0" 239 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 240 | 241 | pngjs@^3.3.0: 242 | version "3.3.2" 243 | resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.3.2.tgz#097c3c2a75feb223eadddea6bc9f0050cf830bc3" 244 | 245 | pseudomap@^1.0.2: 246 | version "1.0.2" 247 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 248 | 249 | qrcode@^1.2.0: 250 | version "1.2.0" 251 | resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.2.0.tgz#330d24313fbf8d429a806091af9525250239e44a" 252 | dependencies: 253 | can-promise "^0.0.1" 254 | dijkstrajs "^1.0.1" 255 | isarray "^2.0.1" 256 | pngjs "^3.3.0" 257 | yargs "^8.0.2" 258 | 259 | read-pkg-up@^2.0.0: 260 | version "2.0.0" 261 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" 262 | dependencies: 263 | find-up "^2.0.0" 264 | read-pkg "^2.0.0" 265 | 266 | read-pkg@^2.0.0: 267 | version "2.0.0" 268 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" 269 | dependencies: 270 | load-json-file "^2.0.0" 271 | normalize-package-data "^2.3.2" 272 | path-type "^2.0.0" 273 | 274 | require-directory@^2.1.1: 275 | version "2.1.1" 276 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 277 | 278 | require-main-filename@^1.0.1: 279 | version "1.0.1" 280 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" 281 | 282 | "semver@2 || 3 || 4 || 5": 283 | version "5.5.0" 284 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" 285 | 286 | set-blocking@^2.0.0: 287 | version "2.0.0" 288 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 289 | 290 | shebang-command@^1.2.0: 291 | version "1.2.0" 292 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 293 | dependencies: 294 | shebang-regex "^1.0.0" 295 | 296 | shebang-regex@^1.0.0: 297 | version "1.0.0" 298 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 299 | 300 | signal-exit@^3.0.0: 301 | version "3.0.2" 302 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 303 | 304 | spdx-correct@~1.0.0: 305 | version "1.0.2" 306 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" 307 | dependencies: 308 | spdx-license-ids "^1.0.2" 309 | 310 | spdx-expression-parse@~1.0.0: 311 | version "1.0.4" 312 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" 313 | 314 | spdx-license-ids@^1.0.2: 315 | version "1.2.2" 316 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" 317 | 318 | string-width@^1.0.1: 319 | version "1.0.2" 320 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 321 | dependencies: 322 | code-point-at "^1.0.0" 323 | is-fullwidth-code-point "^1.0.0" 324 | strip-ansi "^3.0.0" 325 | 326 | string-width@^2.0.0: 327 | version "2.1.1" 328 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 329 | dependencies: 330 | is-fullwidth-code-point "^2.0.0" 331 | strip-ansi "^4.0.0" 332 | 333 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 334 | version "3.0.1" 335 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 336 | dependencies: 337 | ansi-regex "^2.0.0" 338 | 339 | strip-ansi@^4.0.0: 340 | version "4.0.0" 341 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 342 | dependencies: 343 | ansi-regex "^3.0.0" 344 | 345 | strip-bom@^3.0.0: 346 | version "3.0.0" 347 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 348 | 349 | strip-eof@^1.0.0: 350 | version "1.0.0" 351 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 352 | 353 | validate-npm-package-license@^3.0.1: 354 | version "3.0.1" 355 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" 356 | dependencies: 357 | spdx-correct "~1.0.0" 358 | spdx-expression-parse "~1.0.0" 359 | 360 | which-module@^2.0.0: 361 | version "2.0.0" 362 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 363 | 364 | which@^1.2.9: 365 | version "1.3.0" 366 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" 367 | dependencies: 368 | isexe "^2.0.0" 369 | 370 | window-or-global@^1.0.1: 371 | version "1.0.1" 372 | resolved "https://registry.yarnpkg.com/window-or-global/-/window-or-global-1.0.1.tgz#dbe45ba2a291aabc56d62cf66c45b7fa322946de" 373 | 374 | wrap-ansi@^2.0.0: 375 | version "2.1.0" 376 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" 377 | dependencies: 378 | string-width "^1.0.1" 379 | strip-ansi "^3.0.1" 380 | 381 | y18n@^3.2.1: 382 | version "3.2.1" 383 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" 384 | 385 | yallist@^2.1.2: 386 | version "2.1.2" 387 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 388 | 389 | yargs-parser@^7.0.0: 390 | version "7.0.0" 391 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" 392 | dependencies: 393 | camelcase "^4.1.0" 394 | 395 | yargs@^8.0.2: 396 | version "8.0.2" 397 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" 398 | dependencies: 399 | camelcase "^4.1.0" 400 | cliui "^3.2.0" 401 | decamelize "^1.1.1" 402 | get-caller-file "^1.0.1" 403 | os-locale "^2.0.0" 404 | read-pkg-up "^2.0.0" 405 | require-directory "^2.1.1" 406 | require-main-filename "^1.0.1" 407 | set-blocking "^2.0.0" 408 | string-width "^2.0.0" 409 | which-module "^2.0.0" 410 | y18n "^3.2.1" 411 | yargs-parser "^7.0.0" 412 | --------------------------------------------------------------------------------