├── .eslintrc.json ├── .gitignore ├── LICENSE ├── README.md ├── index.js ├── package-lock.json ├── package.json ├── scripts └── import-external.js └── src ├── converter.js ├── errors.js ├── image-downloader.js ├── importer.js └── model ├── post.js └── profile.js /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "node" : true, 4 | "es6": true 5 | }, 6 | "extends": "eslint:recommended", 7 | "parserOptions": { 8 | "ecmaVersion": 2018 9 | }, 10 | "rules": { 11 | "no-console": "warn", 12 | "indent": [ 13 | "error", 14 | 4 15 | ], 16 | "linebreak-style": [ 17 | "error", 18 | "unix" 19 | ], 20 | "quotes": [ 21 | "error", 22 | "single" 23 | ], 24 | "semi": [ 25 | "error", 26 | "always" 27 | ], 28 | "no-unused-vars": 0 29 | } 30 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .vscode 3 | temp -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2019 Stackbit 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # stackbit-medium-importer 2 | 3 | A small library to convert [medium export](https://medium.com/me/export) zip files to static-site-generator (SSG) friendly Markdown files. 4 | 5 | # Demo 6 | 7 | The Medium importer can be seen in action on the [Stackbit website](https://www.stackbit.com/medium). 8 | 9 | # Install 10 | 11 | ``` 12 | npm install @stackbit/stackbit-medium-importer 13 | ``` 14 | 15 | # How to use 16 | 17 | The module comes with a utility to invoke the importer directly. 18 | 19 | ``` 20 | $ medium-importer 21 | Usage: medium-importer --input-file= --output-dir= --concurrency= --download-images= --import-drafts= 22 | 23 | Options: 24 | --help Show help [boolean] 25 | --version Show version number [boolean] 26 | --input-file, -i medium export zip file [required] 27 | --output-dir, -o target folder for the converted files [required] 28 | --concurrency, -c number of posts to process in parallel [default: 1] 29 | --download-images, -d should images be downloaded [default: true] 30 | --import-drafts, -r should drafts be imported [default: true] 31 | 32 | Examples: 33 | medium-importer -i medium-export.zip -o output/ 34 | ``` 35 | 36 | # Importer output 37 | 38 | The output directory is populated with the imported data, following a structure that makes it straightforward to later use with an SSG. For certain SSG's (like Hugo) it's possible to point the utility directly at your project. 39 | 40 | The output directories can be configured when working with the library directly. 41 | 42 | ### `content/posts` 43 | 44 | Markdown pages representing imported Medium posts. 45 | 46 | ```yaml 47 | --- 48 | template: post 49 | title: My Blog Post 50 | date: 2018-10-08T15:01:02.452Z 51 | subtitle: >- 52 | This post is a posty post, and this is its subtitle. 53 | excerpt: >- 54 | An excerpt of the post 55 | thumb_img_path: >- 56 | images/My-Blog-Post/image.jpeg 57 | content_img_path: >- 58 | images/My-Blog-Post/splash.jpeg 59 | --- 60 | 61 | # My Post 62 | 63 | Markdown content goes **HERE** 64 | ``` 65 | 66 | ### `static/images` 67 | 68 | * Per-post images organized in directories with the post's slug. 69 | * Global images extracted from the Medium export: `avatar.png` if available. 70 | 71 | 72 | ### `data/data.json` 73 | 74 | Extraced information in `JSON` format: 75 | 76 | ```json 77 | { 78 | "author": { 79 | "name": "My Name", 80 | "email": "email@example.com", 81 | "avatar": "images/avatar.png" 82 | }, 83 | "social": { 84 | "twitter": { 85 | "username": "@myuser", 86 | "url": "https://twitter.com/@myuser" 87 | } 88 | } 89 | ``` 90 | 91 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | importer: require('./src/importer'), 3 | errors: require('./src/errors') 4 | }; 5 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@stackbit/stackbit-medium-importer", 3 | "version": "0.2.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.0.0", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", 10 | "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.0.0" 14 | } 15 | }, 16 | "@babel/highlight": { 17 | "version": "7.0.0", 18 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", 19 | "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", 20 | "dev": true, 21 | "requires": { 22 | "chalk": "^2.0.0", 23 | "esutils": "^2.0.2", 24 | "js-tokens": "^4.0.0" 25 | } 26 | }, 27 | "@types/node": { 28 | "version": "11.10.5", 29 | "resolved": "https://registry.npmjs.org/@types/node/-/node-11.10.5.tgz", 30 | "integrity": "sha512-DuIRlQbX4K+d5I+GMnv+UfnGh+ist0RdlvOp+JZ7ePJ6KQONCFQv/gKYSU1ZzbVdFSUCKZOltjmpFAGGv5MdYA==" 31 | }, 32 | "abab": { 33 | "version": "2.0.0", 34 | "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", 35 | "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==" 36 | }, 37 | "acorn": { 38 | "version": "5.7.3", 39 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", 40 | "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" 41 | }, 42 | "acorn-globals": { 43 | "version": "4.3.0", 44 | "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.0.tgz", 45 | "integrity": "sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw==", 46 | "requires": { 47 | "acorn": "^6.0.1", 48 | "acorn-walk": "^6.0.1" 49 | }, 50 | "dependencies": { 51 | "acorn": { 52 | "version": "6.1.1", 53 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", 54 | "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==" 55 | } 56 | } 57 | }, 58 | "acorn-jsx": { 59 | "version": "5.0.1", 60 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", 61 | "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", 62 | "dev": true 63 | }, 64 | "acorn-walk": { 65 | "version": "6.1.1", 66 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", 67 | "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==" 68 | }, 69 | "ajv": { 70 | "version": "6.10.0", 71 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", 72 | "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", 73 | "requires": { 74 | "fast-deep-equal": "^2.0.1", 75 | "fast-json-stable-stringify": "^2.0.0", 76 | "json-schema-traverse": "^0.4.1", 77 | "uri-js": "^4.2.2" 78 | } 79 | }, 80 | "ansi-escapes": { 81 | "version": "3.2.0", 82 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", 83 | "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", 84 | "dev": true 85 | }, 86 | "ansi-regex": { 87 | "version": "3.0.0", 88 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 89 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" 90 | }, 91 | "ansi-styles": { 92 | "version": "3.2.1", 93 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 94 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 95 | "requires": { 96 | "color-convert": "^1.9.0" 97 | } 98 | }, 99 | "argparse": { 100 | "version": "1.0.10", 101 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 102 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 103 | "requires": { 104 | "sprintf-js": "~1.0.2" 105 | } 106 | }, 107 | "array-equal": { 108 | "version": "1.0.0", 109 | "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", 110 | "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" 111 | }, 112 | "array-uniq": { 113 | "version": "1.0.3", 114 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 115 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" 116 | }, 117 | "asn1": { 118 | "version": "0.2.4", 119 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 120 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 121 | "requires": { 122 | "safer-buffer": "~2.1.0" 123 | } 124 | }, 125 | "assert-plus": { 126 | "version": "1.0.0", 127 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 128 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 129 | }, 130 | "astral-regex": { 131 | "version": "1.0.0", 132 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 133 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", 134 | "dev": true 135 | }, 136 | "async-limiter": { 137 | "version": "1.0.0", 138 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", 139 | "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" 140 | }, 141 | "asynckit": { 142 | "version": "0.4.0", 143 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 144 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 145 | }, 146 | "aws-sign2": { 147 | "version": "0.7.0", 148 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 149 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 150 | }, 151 | "aws4": { 152 | "version": "1.8.0", 153 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 154 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" 155 | }, 156 | "axios": { 157 | "version": "0.18.0", 158 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", 159 | "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", 160 | "requires": { 161 | "follow-redirects": "^1.3.0", 162 | "is-buffer": "^1.1.5" 163 | } 164 | }, 165 | "balanced-match": { 166 | "version": "1.0.0", 167 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 168 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 169 | }, 170 | "bcrypt-pbkdf": { 171 | "version": "1.0.2", 172 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 173 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 174 | "requires": { 175 | "tweetnacl": "^0.14.3" 176 | } 177 | }, 178 | "big-integer": { 179 | "version": "1.6.42", 180 | "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.42.tgz", 181 | "integrity": "sha512-3UQFKcRMx+5Z+IK5vYTMYK2jzLRJkt+XqyDdacgWgtMjjuifKpKTFneJLEgeBElOE2/lXZ1LcMcb5s8pwG2U8Q==" 182 | }, 183 | "binary": { 184 | "version": "0.3.0", 185 | "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", 186 | "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", 187 | "requires": { 188 | "buffers": "~0.1.1", 189 | "chainsaw": "~0.1.0" 190 | } 191 | }, 192 | "bluebird": { 193 | "version": "3.4.7", 194 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", 195 | "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=" 196 | }, 197 | "boolbase": { 198 | "version": "1.0.0", 199 | "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", 200 | "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" 201 | }, 202 | "brace-expansion": { 203 | "version": "1.1.11", 204 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 205 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 206 | "requires": { 207 | "balanced-match": "^1.0.0", 208 | "concat-map": "0.0.1" 209 | } 210 | }, 211 | "browser-process-hrtime": { 212 | "version": "0.1.3", 213 | "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", 214 | "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==" 215 | }, 216 | "buffer-indexof-polyfill": { 217 | "version": "1.0.1", 218 | "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.1.tgz", 219 | "integrity": "sha1-qfuAbOgUXVQoUQznLyeLs2OmOL8=" 220 | }, 221 | "buffers": { 222 | "version": "0.1.1", 223 | "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", 224 | "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" 225 | }, 226 | "callsites": { 227 | "version": "3.1.0", 228 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 229 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 230 | "dev": true 231 | }, 232 | "camelcase": { 233 | "version": "5.2.0", 234 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.2.0.tgz", 235 | "integrity": "sha512-IXFsBS2pC+X0j0N/GE7Dm7j3bsEBp+oTpb7F50dwEVX7rf3IgwO9XatnegTsDtniKCUtEJH4fSU6Asw7uoVLfQ==" 236 | }, 237 | "caseless": { 238 | "version": "0.12.0", 239 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 240 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 241 | }, 242 | "chainsaw": { 243 | "version": "0.1.0", 244 | "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", 245 | "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", 246 | "requires": { 247 | "traverse": ">=0.3.0 <0.4" 248 | } 249 | }, 250 | "chalk": { 251 | "version": "2.4.2", 252 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 253 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 254 | "requires": { 255 | "ansi-styles": "^3.2.1", 256 | "escape-string-regexp": "^1.0.5", 257 | "supports-color": "^5.3.0" 258 | } 259 | }, 260 | "chardet": { 261 | "version": "0.7.0", 262 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 263 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 264 | "dev": true 265 | }, 266 | "cheerio": { 267 | "version": "1.0.0-rc.2", 268 | "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", 269 | "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", 270 | "requires": { 271 | "css-select": "~1.2.0", 272 | "dom-serializer": "~0.1.0", 273 | "entities": "~1.1.1", 274 | "htmlparser2": "^3.9.1", 275 | "lodash": "^4.15.0", 276 | "parse5": "^3.0.1" 277 | } 278 | }, 279 | "cli-cursor": { 280 | "version": "2.1.0", 281 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 282 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 283 | "dev": true, 284 | "requires": { 285 | "restore-cursor": "^2.0.0" 286 | } 287 | }, 288 | "cli-width": { 289 | "version": "2.2.0", 290 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 291 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 292 | "dev": true 293 | }, 294 | "cliui": { 295 | "version": "4.1.0", 296 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", 297 | "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", 298 | "requires": { 299 | "string-width": "^2.1.1", 300 | "strip-ansi": "^4.0.0", 301 | "wrap-ansi": "^2.0.0" 302 | }, 303 | "dependencies": { 304 | "string-width": { 305 | "version": "2.1.1", 306 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 307 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 308 | "requires": { 309 | "is-fullwidth-code-point": "^2.0.0", 310 | "strip-ansi": "^4.0.0" 311 | } 312 | } 313 | } 314 | }, 315 | "code-point-at": { 316 | "version": "1.1.0", 317 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 318 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 319 | }, 320 | "color-convert": { 321 | "version": "1.9.3", 322 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 323 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 324 | "requires": { 325 | "color-name": "1.1.3" 326 | } 327 | }, 328 | "color-name": { 329 | "version": "1.1.3", 330 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 331 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 332 | }, 333 | "combined-stream": { 334 | "version": "1.0.7", 335 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", 336 | "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", 337 | "requires": { 338 | "delayed-stream": "~1.0.0" 339 | } 340 | }, 341 | "concat-map": { 342 | "version": "0.0.1", 343 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 344 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 345 | }, 346 | "core-util-is": { 347 | "version": "1.0.2", 348 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 349 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 350 | }, 351 | "cross-spawn": { 352 | "version": "6.0.5", 353 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 354 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 355 | "requires": { 356 | "nice-try": "^1.0.4", 357 | "path-key": "^2.0.1", 358 | "semver": "^5.5.0", 359 | "shebang-command": "^1.2.0", 360 | "which": "^1.2.9" 361 | } 362 | }, 363 | "css-select": { 364 | "version": "1.2.0", 365 | "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", 366 | "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", 367 | "requires": { 368 | "boolbase": "~1.0.0", 369 | "css-what": "2.1", 370 | "domutils": "1.5.1", 371 | "nth-check": "~1.0.1" 372 | } 373 | }, 374 | "css-what": { 375 | "version": "2.1.3", 376 | "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", 377 | "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" 378 | }, 379 | "cssom": { 380 | "version": "0.3.6", 381 | "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz", 382 | "integrity": "sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A==" 383 | }, 384 | "cssstyle": { 385 | "version": "1.2.1", 386 | "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.1.tgz", 387 | "integrity": "sha512-7DYm8qe+gPx/h77QlCyFmX80+fGaE/6A/Ekl0zaszYOubvySO2saYFdQ78P29D0UsULxFKCetDGNaNRUdSF+2A==", 388 | "requires": { 389 | "cssom": "0.3.x" 390 | } 391 | }, 392 | "dashdash": { 393 | "version": "1.14.1", 394 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 395 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 396 | "requires": { 397 | "assert-plus": "^1.0.0" 398 | } 399 | }, 400 | "data-urls": { 401 | "version": "1.1.0", 402 | "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", 403 | "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", 404 | "requires": { 405 | "abab": "^2.0.0", 406 | "whatwg-mimetype": "^2.2.0", 407 | "whatwg-url": "^7.0.0" 408 | }, 409 | "dependencies": { 410 | "whatwg-url": { 411 | "version": "7.0.0", 412 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", 413 | "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", 414 | "requires": { 415 | "lodash.sortby": "^4.7.0", 416 | "tr46": "^1.0.1", 417 | "webidl-conversions": "^4.0.2" 418 | } 419 | } 420 | } 421 | }, 422 | "debug": { 423 | "version": "3.2.6", 424 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 425 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 426 | "requires": { 427 | "ms": "^2.1.1" 428 | } 429 | }, 430 | "decamelize": { 431 | "version": "1.2.0", 432 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 433 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 434 | }, 435 | "deep-is": { 436 | "version": "0.1.3", 437 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 438 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" 439 | }, 440 | "delayed-stream": { 441 | "version": "1.0.0", 442 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 443 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 444 | }, 445 | "doctrine": { 446 | "version": "3.0.0", 447 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 448 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 449 | "dev": true, 450 | "requires": { 451 | "esutils": "^2.0.2" 452 | } 453 | }, 454 | "dom-serializer": { 455 | "version": "0.1.1", 456 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", 457 | "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", 458 | "requires": { 459 | "domelementtype": "^1.3.0", 460 | "entities": "^1.1.1" 461 | } 462 | }, 463 | "domelementtype": { 464 | "version": "1.3.1", 465 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", 466 | "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" 467 | }, 468 | "domexception": { 469 | "version": "1.0.1", 470 | "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", 471 | "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", 472 | "requires": { 473 | "webidl-conversions": "^4.0.2" 474 | } 475 | }, 476 | "domhandler": { 477 | "version": "2.4.2", 478 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", 479 | "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", 480 | "requires": { 481 | "domelementtype": "1" 482 | } 483 | }, 484 | "domutils": { 485 | "version": "1.5.1", 486 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", 487 | "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", 488 | "requires": { 489 | "dom-serializer": "0", 490 | "domelementtype": "1" 491 | } 492 | }, 493 | "duplexer2": { 494 | "version": "0.1.4", 495 | "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", 496 | "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", 497 | "requires": { 498 | "readable-stream": "^2.0.2" 499 | } 500 | }, 501 | "ecc-jsbn": { 502 | "version": "0.1.2", 503 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 504 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 505 | "requires": { 506 | "jsbn": "~0.1.0", 507 | "safer-buffer": "^2.1.0" 508 | } 509 | }, 510 | "emoji-regex": { 511 | "version": "7.0.3", 512 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 513 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" 514 | }, 515 | "end-of-stream": { 516 | "version": "1.4.1", 517 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", 518 | "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", 519 | "requires": { 520 | "once": "^1.4.0" 521 | } 522 | }, 523 | "entities": { 524 | "version": "1.1.2", 525 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", 526 | "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" 527 | }, 528 | "escape-string-regexp": { 529 | "version": "1.0.5", 530 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 531 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 532 | }, 533 | "escodegen": { 534 | "version": "1.11.1", 535 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", 536 | "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", 537 | "requires": { 538 | "esprima": "^3.1.3", 539 | "estraverse": "^4.2.0", 540 | "esutils": "^2.0.2", 541 | "optionator": "^0.8.1", 542 | "source-map": "~0.6.1" 543 | }, 544 | "dependencies": { 545 | "esprima": { 546 | "version": "3.1.3", 547 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", 548 | "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" 549 | } 550 | } 551 | }, 552 | "eslint": { 553 | "version": "5.16.0", 554 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", 555 | "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", 556 | "dev": true, 557 | "requires": { 558 | "@babel/code-frame": "^7.0.0", 559 | "ajv": "^6.9.1", 560 | "chalk": "^2.1.0", 561 | "cross-spawn": "^6.0.5", 562 | "debug": "^4.0.1", 563 | "doctrine": "^3.0.0", 564 | "eslint-scope": "^4.0.3", 565 | "eslint-utils": "^1.3.1", 566 | "eslint-visitor-keys": "^1.0.0", 567 | "espree": "^5.0.1", 568 | "esquery": "^1.0.1", 569 | "esutils": "^2.0.2", 570 | "file-entry-cache": "^5.0.1", 571 | "functional-red-black-tree": "^1.0.1", 572 | "glob": "^7.1.2", 573 | "globals": "^11.7.0", 574 | "ignore": "^4.0.6", 575 | "import-fresh": "^3.0.0", 576 | "imurmurhash": "^0.1.4", 577 | "inquirer": "^6.2.2", 578 | "js-yaml": "^3.13.0", 579 | "json-stable-stringify-without-jsonify": "^1.0.1", 580 | "levn": "^0.3.0", 581 | "lodash": "^4.17.11", 582 | "minimatch": "^3.0.4", 583 | "mkdirp": "^0.5.1", 584 | "natural-compare": "^1.4.0", 585 | "optionator": "^0.8.2", 586 | "path-is-inside": "^1.0.2", 587 | "progress": "^2.0.0", 588 | "regexpp": "^2.0.1", 589 | "semver": "^5.5.1", 590 | "strip-ansi": "^4.0.0", 591 | "strip-json-comments": "^2.0.1", 592 | "table": "^5.2.3", 593 | "text-table": "^0.2.0" 594 | }, 595 | "dependencies": { 596 | "debug": { 597 | "version": "4.1.1", 598 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 599 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 600 | "dev": true, 601 | "requires": { 602 | "ms": "^2.1.1" 603 | } 604 | }, 605 | "js-yaml": { 606 | "version": "3.13.1", 607 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 608 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 609 | "dev": true, 610 | "requires": { 611 | "argparse": "^1.0.7", 612 | "esprima": "^4.0.0" 613 | } 614 | } 615 | } 616 | }, 617 | "eslint-scope": { 618 | "version": "4.0.3", 619 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", 620 | "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", 621 | "dev": true, 622 | "requires": { 623 | "esrecurse": "^4.1.0", 624 | "estraverse": "^4.1.1" 625 | } 626 | }, 627 | "eslint-utils": { 628 | "version": "1.3.1", 629 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", 630 | "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", 631 | "dev": true 632 | }, 633 | "eslint-visitor-keys": { 634 | "version": "1.0.0", 635 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", 636 | "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", 637 | "dev": true 638 | }, 639 | "espree": { 640 | "version": "5.0.1", 641 | "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", 642 | "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", 643 | "dev": true, 644 | "requires": { 645 | "acorn": "^6.0.7", 646 | "acorn-jsx": "^5.0.0", 647 | "eslint-visitor-keys": "^1.0.0" 648 | }, 649 | "dependencies": { 650 | "acorn": { 651 | "version": "6.1.1", 652 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", 653 | "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", 654 | "dev": true 655 | } 656 | } 657 | }, 658 | "esprima": { 659 | "version": "4.0.1", 660 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 661 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" 662 | }, 663 | "esquery": { 664 | "version": "1.0.1", 665 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", 666 | "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", 667 | "dev": true, 668 | "requires": { 669 | "estraverse": "^4.0.0" 670 | } 671 | }, 672 | "esrecurse": { 673 | "version": "4.2.1", 674 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 675 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 676 | "dev": true, 677 | "requires": { 678 | "estraverse": "^4.1.0" 679 | } 680 | }, 681 | "estraverse": { 682 | "version": "4.2.0", 683 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 684 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" 685 | }, 686 | "esutils": { 687 | "version": "2.0.2", 688 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 689 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" 690 | }, 691 | "execa": { 692 | "version": "1.0.0", 693 | "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", 694 | "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", 695 | "requires": { 696 | "cross-spawn": "^6.0.0", 697 | "get-stream": "^4.0.0", 698 | "is-stream": "^1.1.0", 699 | "npm-run-path": "^2.0.0", 700 | "p-finally": "^1.0.0", 701 | "signal-exit": "^3.0.0", 702 | "strip-eof": "^1.0.0" 703 | } 704 | }, 705 | "extend": { 706 | "version": "3.0.2", 707 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 708 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 709 | }, 710 | "extend-shallow": { 711 | "version": "2.0.1", 712 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 713 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 714 | "requires": { 715 | "is-extendable": "^0.1.0" 716 | } 717 | }, 718 | "external-editor": { 719 | "version": "3.0.3", 720 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", 721 | "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", 722 | "dev": true, 723 | "requires": { 724 | "chardet": "^0.7.0", 725 | "iconv-lite": "^0.4.24", 726 | "tmp": "^0.0.33" 727 | } 728 | }, 729 | "extsprintf": { 730 | "version": "1.3.0", 731 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 732 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 733 | }, 734 | "fast-deep-equal": { 735 | "version": "2.0.1", 736 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 737 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" 738 | }, 739 | "fast-json-stable-stringify": { 740 | "version": "2.0.0", 741 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 742 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 743 | }, 744 | "fast-levenshtein": { 745 | "version": "2.0.6", 746 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 747 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" 748 | }, 749 | "figures": { 750 | "version": "2.0.0", 751 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 752 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 753 | "dev": true, 754 | "requires": { 755 | "escape-string-regexp": "^1.0.5" 756 | } 757 | }, 758 | "file-entry-cache": { 759 | "version": "5.0.1", 760 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", 761 | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", 762 | "dev": true, 763 | "requires": { 764 | "flat-cache": "^2.0.1" 765 | } 766 | }, 767 | "find-up": { 768 | "version": "3.0.0", 769 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 770 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 771 | "requires": { 772 | "locate-path": "^3.0.0" 773 | } 774 | }, 775 | "flat-cache": { 776 | "version": "2.0.1", 777 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", 778 | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", 779 | "dev": true, 780 | "requires": { 781 | "flatted": "^2.0.0", 782 | "rimraf": "2.6.3", 783 | "write": "1.0.3" 784 | } 785 | }, 786 | "flatted": { 787 | "version": "2.0.0", 788 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", 789 | "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==", 790 | "dev": true 791 | }, 792 | "follow-redirects": { 793 | "version": "1.7.0", 794 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", 795 | "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", 796 | "requires": { 797 | "debug": "^3.2.6" 798 | } 799 | }, 800 | "forever-agent": { 801 | "version": "0.6.1", 802 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 803 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 804 | }, 805 | "form-data": { 806 | "version": "2.3.3", 807 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 808 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 809 | "requires": { 810 | "asynckit": "^0.4.0", 811 | "combined-stream": "^1.0.6", 812 | "mime-types": "^2.1.12" 813 | } 814 | }, 815 | "fs.realpath": { 816 | "version": "1.0.0", 817 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 818 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 819 | }, 820 | "fstream": { 821 | "version": "1.0.11", 822 | "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", 823 | "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", 824 | "requires": { 825 | "graceful-fs": "^4.1.2", 826 | "inherits": "~2.0.0", 827 | "mkdirp": ">=0.5 0", 828 | "rimraf": "2" 829 | } 830 | }, 831 | "functional-red-black-tree": { 832 | "version": "1.0.1", 833 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 834 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 835 | "dev": true 836 | }, 837 | "get-caller-file": { 838 | "version": "2.0.1", 839 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.1.tgz", 840 | "integrity": "sha512-SpOZHfz845AH0wJYVuZk2jWDqFmu7Xubsx+ldIpwzy5pDUpu7OJHK7QYNSA2NPlDSKQwM1GFaAkciOWjjW92Sg==" 841 | }, 842 | "get-stream": { 843 | "version": "4.1.0", 844 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", 845 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", 846 | "requires": { 847 | "pump": "^3.0.0" 848 | } 849 | }, 850 | "getpass": { 851 | "version": "0.1.7", 852 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 853 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 854 | "requires": { 855 | "assert-plus": "^1.0.0" 856 | } 857 | }, 858 | "glob": { 859 | "version": "7.1.3", 860 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 861 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 862 | "requires": { 863 | "fs.realpath": "^1.0.0", 864 | "inflight": "^1.0.4", 865 | "inherits": "2", 866 | "minimatch": "^3.0.4", 867 | "once": "^1.3.0", 868 | "path-is-absolute": "^1.0.0" 869 | } 870 | }, 871 | "globals": { 872 | "version": "11.12.0", 873 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 874 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 875 | "dev": true 876 | }, 877 | "graceful-fs": { 878 | "version": "4.1.15", 879 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", 880 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" 881 | }, 882 | "gray-matter": { 883 | "version": "4.0.2", 884 | "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.2.tgz", 885 | "integrity": "sha512-7hB/+LxrOjq/dd8APlK0r24uL/67w7SkYnfwhNFwg/VDIGWGmduTDYf3WNstLW2fbbmRwrDGCVSJ2isuf2+4Hw==", 886 | "requires": { 887 | "js-yaml": "^3.11.0", 888 | "kind-of": "^6.0.2", 889 | "section-matter": "^1.0.0", 890 | "strip-bom-string": "^1.0.0" 891 | } 892 | }, 893 | "har-schema": { 894 | "version": "2.0.0", 895 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 896 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 897 | }, 898 | "har-validator": { 899 | "version": "5.1.3", 900 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", 901 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", 902 | "requires": { 903 | "ajv": "^6.5.5", 904 | "har-schema": "^2.0.0" 905 | } 906 | }, 907 | "has-flag": { 908 | "version": "3.0.0", 909 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 910 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 911 | }, 912 | "html-encoding-sniffer": { 913 | "version": "1.0.2", 914 | "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", 915 | "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", 916 | "requires": { 917 | "whatwg-encoding": "^1.0.1" 918 | } 919 | }, 920 | "htmlparser2": { 921 | "version": "3.10.1", 922 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", 923 | "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", 924 | "requires": { 925 | "domelementtype": "^1.3.1", 926 | "domhandler": "^2.3.0", 927 | "domutils": "^1.5.1", 928 | "entities": "^1.1.1", 929 | "inherits": "^2.0.1", 930 | "readable-stream": "^3.1.1" 931 | }, 932 | "dependencies": { 933 | "readable-stream": { 934 | "version": "3.2.0", 935 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.2.0.tgz", 936 | "integrity": "sha512-RV20kLjdmpZuTF1INEb9IA3L68Nmi+Ri7ppZqo78wj//Pn62fCoJyV9zalccNzDD/OuJpMG4f+pfMl8+L6QdGw==", 937 | "requires": { 938 | "inherits": "^2.0.3", 939 | "string_decoder": "^1.1.1", 940 | "util-deprecate": "^1.0.1" 941 | } 942 | } 943 | } 944 | }, 945 | "http-signature": { 946 | "version": "1.2.0", 947 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 948 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 949 | "requires": { 950 | "assert-plus": "^1.0.0", 951 | "jsprim": "^1.2.2", 952 | "sshpk": "^1.7.0" 953 | } 954 | }, 955 | "iconv-lite": { 956 | "version": "0.4.24", 957 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 958 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 959 | "requires": { 960 | "safer-buffer": ">= 2.1.2 < 3" 961 | } 962 | }, 963 | "ignore": { 964 | "version": "4.0.6", 965 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 966 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 967 | "dev": true 968 | }, 969 | "import-fresh": { 970 | "version": "3.0.0", 971 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", 972 | "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", 973 | "dev": true, 974 | "requires": { 975 | "parent-module": "^1.0.0", 976 | "resolve-from": "^4.0.0" 977 | } 978 | }, 979 | "imurmurhash": { 980 | "version": "0.1.4", 981 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 982 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 983 | "dev": true 984 | }, 985 | "inflight": { 986 | "version": "1.0.6", 987 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 988 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 989 | "requires": { 990 | "once": "^1.3.0", 991 | "wrappy": "1" 992 | } 993 | }, 994 | "inherits": { 995 | "version": "2.0.3", 996 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 997 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 998 | }, 999 | "inquirer": { 1000 | "version": "6.3.1", 1001 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", 1002 | "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", 1003 | "dev": true, 1004 | "requires": { 1005 | "ansi-escapes": "^3.2.0", 1006 | "chalk": "^2.4.2", 1007 | "cli-cursor": "^2.1.0", 1008 | "cli-width": "^2.0.0", 1009 | "external-editor": "^3.0.3", 1010 | "figures": "^2.0.0", 1011 | "lodash": "^4.17.11", 1012 | "mute-stream": "0.0.7", 1013 | "run-async": "^2.2.0", 1014 | "rxjs": "^6.4.0", 1015 | "string-width": "^2.1.0", 1016 | "strip-ansi": "^5.1.0", 1017 | "through": "^2.3.6" 1018 | }, 1019 | "dependencies": { 1020 | "string-width": { 1021 | "version": "2.1.1", 1022 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1023 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1024 | "dev": true, 1025 | "requires": { 1026 | "is-fullwidth-code-point": "^2.0.0", 1027 | "strip-ansi": "^4.0.0" 1028 | }, 1029 | "dependencies": { 1030 | "strip-ansi": { 1031 | "version": "4.0.0", 1032 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1033 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1034 | "dev": true, 1035 | "requires": { 1036 | "ansi-regex": "^3.0.0" 1037 | } 1038 | } 1039 | } 1040 | }, 1041 | "strip-ansi": { 1042 | "version": "5.2.0", 1043 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1044 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1045 | "dev": true, 1046 | "requires": { 1047 | "ansi-regex": "^4.1.0" 1048 | }, 1049 | "dependencies": { 1050 | "ansi-regex": { 1051 | "version": "4.1.0", 1052 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1053 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1054 | "dev": true 1055 | } 1056 | } 1057 | } 1058 | } 1059 | }, 1060 | "invert-kv": { 1061 | "version": "2.0.0", 1062 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", 1063 | "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" 1064 | }, 1065 | "is-buffer": { 1066 | "version": "1.1.6", 1067 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 1068 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" 1069 | }, 1070 | "is-extendable": { 1071 | "version": "0.1.1", 1072 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 1073 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" 1074 | }, 1075 | "is-fullwidth-code-point": { 1076 | "version": "2.0.0", 1077 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1078 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 1079 | }, 1080 | "is-promise": { 1081 | "version": "2.1.0", 1082 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 1083 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", 1084 | "dev": true 1085 | }, 1086 | "is-stream": { 1087 | "version": "1.1.0", 1088 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 1089 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 1090 | }, 1091 | "is-typedarray": { 1092 | "version": "1.0.0", 1093 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 1094 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 1095 | }, 1096 | "isarray": { 1097 | "version": "1.0.0", 1098 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1099 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1100 | }, 1101 | "isexe": { 1102 | "version": "2.0.0", 1103 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1104 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 1105 | }, 1106 | "isstream": { 1107 | "version": "0.1.2", 1108 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 1109 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 1110 | }, 1111 | "js-tokens": { 1112 | "version": "4.0.0", 1113 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1114 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1115 | "dev": true 1116 | }, 1117 | "js-yaml": { 1118 | "version": "3.12.2", 1119 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.2.tgz", 1120 | "integrity": "sha512-QHn/Lh/7HhZ/Twc7vJYQTkjuCa0kaCcDcjK5Zlk2rvnUpy7DxMJ23+Jc2dcyvltwQVg1nygAVlB2oRDFHoRS5Q==", 1121 | "requires": { 1122 | "argparse": "^1.0.7", 1123 | "esprima": "^4.0.0" 1124 | } 1125 | }, 1126 | "jsbn": { 1127 | "version": "0.1.1", 1128 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 1129 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 1130 | }, 1131 | "jsdom": { 1132 | "version": "11.12.0", 1133 | "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", 1134 | "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", 1135 | "requires": { 1136 | "abab": "^2.0.0", 1137 | "acorn": "^5.5.3", 1138 | "acorn-globals": "^4.1.0", 1139 | "array-equal": "^1.0.0", 1140 | "cssom": ">= 0.3.2 < 0.4.0", 1141 | "cssstyle": "^1.0.0", 1142 | "data-urls": "^1.0.0", 1143 | "domexception": "^1.0.1", 1144 | "escodegen": "^1.9.1", 1145 | "html-encoding-sniffer": "^1.0.2", 1146 | "left-pad": "^1.3.0", 1147 | "nwsapi": "^2.0.7", 1148 | "parse5": "4.0.0", 1149 | "pn": "^1.1.0", 1150 | "request": "^2.87.0", 1151 | "request-promise-native": "^1.0.5", 1152 | "sax": "^1.2.4", 1153 | "symbol-tree": "^3.2.2", 1154 | "tough-cookie": "^2.3.4", 1155 | "w3c-hr-time": "^1.0.1", 1156 | "webidl-conversions": "^4.0.2", 1157 | "whatwg-encoding": "^1.0.3", 1158 | "whatwg-mimetype": "^2.1.0", 1159 | "whatwg-url": "^6.4.1", 1160 | "ws": "^5.2.0", 1161 | "xml-name-validator": "^3.0.0" 1162 | }, 1163 | "dependencies": { 1164 | "parse5": { 1165 | "version": "4.0.0", 1166 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", 1167 | "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" 1168 | } 1169 | } 1170 | }, 1171 | "json-schema": { 1172 | "version": "0.2.3", 1173 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 1174 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 1175 | }, 1176 | "json-schema-traverse": { 1177 | "version": "0.4.1", 1178 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1179 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 1180 | }, 1181 | "json-stable-stringify-without-jsonify": { 1182 | "version": "1.0.1", 1183 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1184 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 1185 | "dev": true 1186 | }, 1187 | "json-stringify-safe": { 1188 | "version": "5.0.1", 1189 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1190 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 1191 | }, 1192 | "jsprim": { 1193 | "version": "1.4.1", 1194 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 1195 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 1196 | "requires": { 1197 | "assert-plus": "1.0.0", 1198 | "extsprintf": "1.3.0", 1199 | "json-schema": "0.2.3", 1200 | "verror": "1.10.0" 1201 | } 1202 | }, 1203 | "kind-of": { 1204 | "version": "6.0.2", 1205 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", 1206 | "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" 1207 | }, 1208 | "lcid": { 1209 | "version": "2.0.0", 1210 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", 1211 | "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", 1212 | "requires": { 1213 | "invert-kv": "^2.0.0" 1214 | } 1215 | }, 1216 | "left-pad": { 1217 | "version": "1.3.0", 1218 | "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", 1219 | "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==" 1220 | }, 1221 | "levn": { 1222 | "version": "0.3.0", 1223 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1224 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1225 | "requires": { 1226 | "prelude-ls": "~1.1.2", 1227 | "type-check": "~0.3.2" 1228 | } 1229 | }, 1230 | "listenercount": { 1231 | "version": "1.0.1", 1232 | "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", 1233 | "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=" 1234 | }, 1235 | "locate-path": { 1236 | "version": "3.0.0", 1237 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 1238 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 1239 | "requires": { 1240 | "p-locate": "^3.0.0", 1241 | "path-exists": "^3.0.0" 1242 | } 1243 | }, 1244 | "lodash": { 1245 | "version": "4.17.11", 1246 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", 1247 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" 1248 | }, 1249 | "lodash.clonedeep": { 1250 | "version": "4.5.0", 1251 | "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", 1252 | "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" 1253 | }, 1254 | "lodash.escaperegexp": { 1255 | "version": "4.1.2", 1256 | "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", 1257 | "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=" 1258 | }, 1259 | "lodash.isplainobject": { 1260 | "version": "4.0.6", 1261 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 1262 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" 1263 | }, 1264 | "lodash.isstring": { 1265 | "version": "4.0.1", 1266 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 1267 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" 1268 | }, 1269 | "lodash.mergewith": { 1270 | "version": "4.6.1", 1271 | "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", 1272 | "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==" 1273 | }, 1274 | "lodash.sortby": { 1275 | "version": "4.7.0", 1276 | "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", 1277 | "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" 1278 | }, 1279 | "map-age-cleaner": { 1280 | "version": "0.1.3", 1281 | "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", 1282 | "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", 1283 | "requires": { 1284 | "p-defer": "^1.0.0" 1285 | } 1286 | }, 1287 | "mem": { 1288 | "version": "4.1.0", 1289 | "resolved": "https://registry.npmjs.org/mem/-/mem-4.1.0.tgz", 1290 | "integrity": "sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg==", 1291 | "requires": { 1292 | "map-age-cleaner": "^0.1.1", 1293 | "mimic-fn": "^1.0.0", 1294 | "p-is-promise": "^2.0.0" 1295 | } 1296 | }, 1297 | "mime-db": { 1298 | "version": "1.38.0", 1299 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", 1300 | "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==" 1301 | }, 1302 | "mime-types": { 1303 | "version": "2.1.22", 1304 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", 1305 | "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", 1306 | "requires": { 1307 | "mime-db": "~1.38.0" 1308 | } 1309 | }, 1310 | "mimic-fn": { 1311 | "version": "1.2.0", 1312 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 1313 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" 1314 | }, 1315 | "minimatch": { 1316 | "version": "3.0.4", 1317 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1318 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1319 | "requires": { 1320 | "brace-expansion": "^1.1.7" 1321 | } 1322 | }, 1323 | "minimist": { 1324 | "version": "0.0.8", 1325 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1326 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 1327 | }, 1328 | "mkdirp": { 1329 | "version": "0.5.1", 1330 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1331 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1332 | "requires": { 1333 | "minimist": "0.0.8" 1334 | } 1335 | }, 1336 | "ms": { 1337 | "version": "2.1.1", 1338 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 1339 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 1340 | }, 1341 | "mute-stream": { 1342 | "version": "0.0.7", 1343 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 1344 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 1345 | "dev": true 1346 | }, 1347 | "natural-compare": { 1348 | "version": "1.4.0", 1349 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1350 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1351 | "dev": true 1352 | }, 1353 | "nice-try": { 1354 | "version": "1.0.5", 1355 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 1356 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" 1357 | }, 1358 | "npm-run-path": { 1359 | "version": "2.0.2", 1360 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 1361 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 1362 | "requires": { 1363 | "path-key": "^2.0.0" 1364 | } 1365 | }, 1366 | "nth-check": { 1367 | "version": "1.0.2", 1368 | "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", 1369 | "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", 1370 | "requires": { 1371 | "boolbase": "~1.0.0" 1372 | } 1373 | }, 1374 | "number-is-nan": { 1375 | "version": "1.0.1", 1376 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 1377 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 1378 | }, 1379 | "nwsapi": { 1380 | "version": "2.1.1", 1381 | "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.1.tgz", 1382 | "integrity": "sha512-T5GaA1J/d34AC8mkrFD2O0DR17kwJ702ZOtJOsS8RpbsQZVOC2/xYFb1i/cw+xdM54JIlMuojjDOYct8GIWtwg==" 1383 | }, 1384 | "oauth-sign": { 1385 | "version": "0.9.0", 1386 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 1387 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 1388 | }, 1389 | "once": { 1390 | "version": "1.4.0", 1391 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1392 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1393 | "requires": { 1394 | "wrappy": "1" 1395 | } 1396 | }, 1397 | "onetime": { 1398 | "version": "2.0.1", 1399 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 1400 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 1401 | "dev": true, 1402 | "requires": { 1403 | "mimic-fn": "^1.0.0" 1404 | } 1405 | }, 1406 | "optionator": { 1407 | "version": "0.8.2", 1408 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 1409 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 1410 | "requires": { 1411 | "deep-is": "~0.1.3", 1412 | "fast-levenshtein": "~2.0.4", 1413 | "levn": "~0.3.0", 1414 | "prelude-ls": "~1.1.2", 1415 | "type-check": "~0.3.2", 1416 | "wordwrap": "~1.0.0" 1417 | } 1418 | }, 1419 | "os-locale": { 1420 | "version": "3.1.0", 1421 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", 1422 | "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", 1423 | "requires": { 1424 | "execa": "^1.0.0", 1425 | "lcid": "^2.0.0", 1426 | "mem": "^4.0.0" 1427 | } 1428 | }, 1429 | "os-tmpdir": { 1430 | "version": "1.0.2", 1431 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1432 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1433 | "dev": true 1434 | }, 1435 | "p-all": { 1436 | "version": "2.0.0", 1437 | "resolved": "https://registry.npmjs.org/p-all/-/p-all-2.0.0.tgz", 1438 | "integrity": "sha512-LJxRBJjRsMpvAAATYZDgW1y8mt/26hD9by0JpzdhzGVTt9Uf6I5EDlWxaOF2XcKvH2SaLYambtNNlzoD+Sn1/A==", 1439 | "requires": { 1440 | "p-map": "^2.0.0" 1441 | } 1442 | }, 1443 | "p-defer": { 1444 | "version": "1.0.0", 1445 | "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", 1446 | "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" 1447 | }, 1448 | "p-finally": { 1449 | "version": "1.0.0", 1450 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 1451 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" 1452 | }, 1453 | "p-is-promise": { 1454 | "version": "2.0.0", 1455 | "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz", 1456 | "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==" 1457 | }, 1458 | "p-limit": { 1459 | "version": "2.2.0", 1460 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", 1461 | "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", 1462 | "requires": { 1463 | "p-try": "^2.0.0" 1464 | } 1465 | }, 1466 | "p-locate": { 1467 | "version": "3.0.0", 1468 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 1469 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 1470 | "requires": { 1471 | "p-limit": "^2.0.0" 1472 | } 1473 | }, 1474 | "p-map": { 1475 | "version": "2.0.0", 1476 | "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.0.0.tgz", 1477 | "integrity": "sha512-GO107XdrSUmtHxVoi60qc9tUl/KkNKm+X2CF4P9amalpGxv5YqVPJNfSb0wcA+syCopkZvYYIzW8OVTQW59x/w==" 1478 | }, 1479 | "p-try": { 1480 | "version": "2.0.0", 1481 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", 1482 | "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==" 1483 | }, 1484 | "parent-module": { 1485 | "version": "1.0.1", 1486 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1487 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1488 | "dev": true, 1489 | "requires": { 1490 | "callsites": "^3.0.0" 1491 | } 1492 | }, 1493 | "parse5": { 1494 | "version": "3.0.3", 1495 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", 1496 | "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", 1497 | "requires": { 1498 | "@types/node": "*" 1499 | } 1500 | }, 1501 | "path-exists": { 1502 | "version": "3.0.0", 1503 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1504 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" 1505 | }, 1506 | "path-is-absolute": { 1507 | "version": "1.0.1", 1508 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1509 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 1510 | }, 1511 | "path-is-inside": { 1512 | "version": "1.0.2", 1513 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 1514 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 1515 | "dev": true 1516 | }, 1517 | "path-key": { 1518 | "version": "2.0.1", 1519 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1520 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" 1521 | }, 1522 | "performance-now": { 1523 | "version": "2.1.0", 1524 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 1525 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 1526 | }, 1527 | "pn": { 1528 | "version": "1.1.0", 1529 | "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", 1530 | "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" 1531 | }, 1532 | "postcss": { 1533 | "version": "7.0.14", 1534 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz", 1535 | "integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==", 1536 | "requires": { 1537 | "chalk": "^2.4.2", 1538 | "source-map": "^0.6.1", 1539 | "supports-color": "^6.1.0" 1540 | }, 1541 | "dependencies": { 1542 | "supports-color": { 1543 | "version": "6.1.0", 1544 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", 1545 | "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", 1546 | "requires": { 1547 | "has-flag": "^3.0.0" 1548 | } 1549 | } 1550 | } 1551 | }, 1552 | "prelude-ls": { 1553 | "version": "1.1.2", 1554 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1555 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" 1556 | }, 1557 | "process-nextick-args": { 1558 | "version": "2.0.0", 1559 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 1560 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 1561 | }, 1562 | "progress": { 1563 | "version": "2.0.3", 1564 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1565 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1566 | "dev": true 1567 | }, 1568 | "psl": { 1569 | "version": "1.1.31", 1570 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", 1571 | "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==" 1572 | }, 1573 | "pump": { 1574 | "version": "3.0.0", 1575 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1576 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1577 | "requires": { 1578 | "end-of-stream": "^1.1.0", 1579 | "once": "^1.3.1" 1580 | } 1581 | }, 1582 | "punycode": { 1583 | "version": "2.1.1", 1584 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1585 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 1586 | }, 1587 | "qs": { 1588 | "version": "6.5.2", 1589 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 1590 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 1591 | }, 1592 | "querystringify": { 1593 | "version": "2.1.0", 1594 | "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz", 1595 | "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==" 1596 | }, 1597 | "readable-stream": { 1598 | "version": "2.3.6", 1599 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 1600 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 1601 | "requires": { 1602 | "core-util-is": "~1.0.0", 1603 | "inherits": "~2.0.3", 1604 | "isarray": "~1.0.0", 1605 | "process-nextick-args": "~2.0.0", 1606 | "safe-buffer": "~5.1.1", 1607 | "string_decoder": "~1.1.1", 1608 | "util-deprecate": "~1.0.1" 1609 | } 1610 | }, 1611 | "regexpp": { 1612 | "version": "2.0.1", 1613 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", 1614 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", 1615 | "dev": true 1616 | }, 1617 | "request": { 1618 | "version": "2.88.0", 1619 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 1620 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 1621 | "requires": { 1622 | "aws-sign2": "~0.7.0", 1623 | "aws4": "^1.8.0", 1624 | "caseless": "~0.12.0", 1625 | "combined-stream": "~1.0.6", 1626 | "extend": "~3.0.2", 1627 | "forever-agent": "~0.6.1", 1628 | "form-data": "~2.3.2", 1629 | "har-validator": "~5.1.0", 1630 | "http-signature": "~1.2.0", 1631 | "is-typedarray": "~1.0.0", 1632 | "isstream": "~0.1.2", 1633 | "json-stringify-safe": "~5.0.1", 1634 | "mime-types": "~2.1.19", 1635 | "oauth-sign": "~0.9.0", 1636 | "performance-now": "^2.1.0", 1637 | "qs": "~6.5.2", 1638 | "safe-buffer": "^5.1.2", 1639 | "tough-cookie": "~2.4.3", 1640 | "tunnel-agent": "^0.6.0", 1641 | "uuid": "^3.3.2" 1642 | }, 1643 | "dependencies": { 1644 | "punycode": { 1645 | "version": "1.4.1", 1646 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 1647 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 1648 | }, 1649 | "tough-cookie": { 1650 | "version": "2.4.3", 1651 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 1652 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 1653 | "requires": { 1654 | "psl": "^1.1.24", 1655 | "punycode": "^1.4.1" 1656 | } 1657 | } 1658 | } 1659 | }, 1660 | "request-promise-core": { 1661 | "version": "1.1.2", 1662 | "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", 1663 | "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", 1664 | "requires": { 1665 | "lodash": "^4.17.11" 1666 | } 1667 | }, 1668 | "request-promise-native": { 1669 | "version": "1.0.7", 1670 | "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", 1671 | "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", 1672 | "requires": { 1673 | "request-promise-core": "1.1.2", 1674 | "stealthy-require": "^1.1.1", 1675 | "tough-cookie": "^2.3.3" 1676 | } 1677 | }, 1678 | "require-directory": { 1679 | "version": "2.1.1", 1680 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1681 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" 1682 | }, 1683 | "require-main-filename": { 1684 | "version": "2.0.0", 1685 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 1686 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" 1687 | }, 1688 | "requires-port": { 1689 | "version": "1.0.0", 1690 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", 1691 | "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" 1692 | }, 1693 | "resolve-from": { 1694 | "version": "4.0.0", 1695 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1696 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1697 | "dev": true 1698 | }, 1699 | "restore-cursor": { 1700 | "version": "2.0.0", 1701 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 1702 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 1703 | "dev": true, 1704 | "requires": { 1705 | "onetime": "^2.0.0", 1706 | "signal-exit": "^3.0.2" 1707 | } 1708 | }, 1709 | "rimraf": { 1710 | "version": "2.6.3", 1711 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 1712 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 1713 | "requires": { 1714 | "glob": "^7.1.3" 1715 | } 1716 | }, 1717 | "run-async": { 1718 | "version": "2.3.0", 1719 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", 1720 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 1721 | "dev": true, 1722 | "requires": { 1723 | "is-promise": "^2.1.0" 1724 | } 1725 | }, 1726 | "rxjs": { 1727 | "version": "6.5.2", 1728 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", 1729 | "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", 1730 | "dev": true, 1731 | "requires": { 1732 | "tslib": "^1.9.0" 1733 | } 1734 | }, 1735 | "safe-buffer": { 1736 | "version": "5.1.2", 1737 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1738 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1739 | }, 1740 | "safer-buffer": { 1741 | "version": "2.1.2", 1742 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1743 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1744 | }, 1745 | "sanitize-html": { 1746 | "version": "1.20.0", 1747 | "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.20.0.tgz", 1748 | "integrity": "sha512-BpxXkBoAG+uKCHjoXFmox6kCSYpnulABoGcZ/R3QyY9ndXbIM5S94eOr1IqnzTG8TnbmXaxWoDDzKC5eJv7fEQ==", 1749 | "requires": { 1750 | "chalk": "^2.4.1", 1751 | "htmlparser2": "^3.10.0", 1752 | "lodash.clonedeep": "^4.5.0", 1753 | "lodash.escaperegexp": "^4.1.2", 1754 | "lodash.isplainobject": "^4.0.6", 1755 | "lodash.isstring": "^4.0.1", 1756 | "lodash.mergewith": "^4.6.1", 1757 | "postcss": "^7.0.5", 1758 | "srcset": "^1.0.0", 1759 | "xtend": "^4.0.1" 1760 | } 1761 | }, 1762 | "sax": { 1763 | "version": "1.2.4", 1764 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 1765 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" 1766 | }, 1767 | "section-matter": { 1768 | "version": "1.0.0", 1769 | "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", 1770 | "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", 1771 | "requires": { 1772 | "extend-shallow": "^2.0.1", 1773 | "kind-of": "^6.0.0" 1774 | } 1775 | }, 1776 | "semver": { 1777 | "version": "5.6.0", 1778 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", 1779 | "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" 1780 | }, 1781 | "set-blocking": { 1782 | "version": "2.0.0", 1783 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1784 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 1785 | }, 1786 | "setimmediate": { 1787 | "version": "1.0.5", 1788 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 1789 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" 1790 | }, 1791 | "shebang-command": { 1792 | "version": "1.2.0", 1793 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1794 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1795 | "requires": { 1796 | "shebang-regex": "^1.0.0" 1797 | } 1798 | }, 1799 | "shebang-regex": { 1800 | "version": "1.0.0", 1801 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1802 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" 1803 | }, 1804 | "signal-exit": { 1805 | "version": "3.0.2", 1806 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 1807 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 1808 | }, 1809 | "slice-ansi": { 1810 | "version": "2.1.0", 1811 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 1812 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", 1813 | "dev": true, 1814 | "requires": { 1815 | "ansi-styles": "^3.2.0", 1816 | "astral-regex": "^1.0.0", 1817 | "is-fullwidth-code-point": "^2.0.0" 1818 | } 1819 | }, 1820 | "source-map": { 1821 | "version": "0.6.1", 1822 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1823 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 1824 | }, 1825 | "sprintf-js": { 1826 | "version": "1.0.3", 1827 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1828 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" 1829 | }, 1830 | "srcset": { 1831 | "version": "1.0.0", 1832 | "resolved": "https://registry.npmjs.org/srcset/-/srcset-1.0.0.tgz", 1833 | "integrity": "sha1-pWad4StC87HV6D7QPHEEb8SPQe8=", 1834 | "requires": { 1835 | "array-uniq": "^1.0.2", 1836 | "number-is-nan": "^1.0.0" 1837 | } 1838 | }, 1839 | "sshpk": { 1840 | "version": "1.16.1", 1841 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 1842 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 1843 | "requires": { 1844 | "asn1": "~0.2.3", 1845 | "assert-plus": "^1.0.0", 1846 | "bcrypt-pbkdf": "^1.0.0", 1847 | "dashdash": "^1.12.0", 1848 | "ecc-jsbn": "~0.1.1", 1849 | "getpass": "^0.1.1", 1850 | "jsbn": "~0.1.0", 1851 | "safer-buffer": "^2.0.2", 1852 | "tweetnacl": "~0.14.0" 1853 | } 1854 | }, 1855 | "stealthy-require": { 1856 | "version": "1.1.1", 1857 | "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", 1858 | "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" 1859 | }, 1860 | "string-width": { 1861 | "version": "3.0.0", 1862 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.0.0.tgz", 1863 | "integrity": "sha512-rr8CUxBbvOZDUvc5lNIJ+OC1nPVpz+Siw9VBtUjB9b6jZehZLFt0JMCZzShFHIsI8cbhm0EsNIfWJMFV3cu3Ew==", 1864 | "requires": { 1865 | "emoji-regex": "^7.0.1", 1866 | "is-fullwidth-code-point": "^2.0.0", 1867 | "strip-ansi": "^5.0.0" 1868 | }, 1869 | "dependencies": { 1870 | "ansi-regex": { 1871 | "version": "4.0.0", 1872 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", 1873 | "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==" 1874 | }, 1875 | "strip-ansi": { 1876 | "version": "5.0.0", 1877 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", 1878 | "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", 1879 | "requires": { 1880 | "ansi-regex": "^4.0.0" 1881 | } 1882 | } 1883 | } 1884 | }, 1885 | "string_decoder": { 1886 | "version": "1.1.1", 1887 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1888 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1889 | "requires": { 1890 | "safe-buffer": "~5.1.0" 1891 | } 1892 | }, 1893 | "strip-ansi": { 1894 | "version": "4.0.0", 1895 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1896 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1897 | "requires": { 1898 | "ansi-regex": "^3.0.0" 1899 | } 1900 | }, 1901 | "strip-bom-string": { 1902 | "version": "1.0.0", 1903 | "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", 1904 | "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=" 1905 | }, 1906 | "strip-eof": { 1907 | "version": "1.0.0", 1908 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 1909 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" 1910 | }, 1911 | "strip-json-comments": { 1912 | "version": "2.0.1", 1913 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1914 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 1915 | "dev": true 1916 | }, 1917 | "supports-color": { 1918 | "version": "5.5.0", 1919 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1920 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1921 | "requires": { 1922 | "has-flag": "^3.0.0" 1923 | } 1924 | }, 1925 | "symbol-tree": { 1926 | "version": "3.2.2", 1927 | "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", 1928 | "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" 1929 | }, 1930 | "table": { 1931 | "version": "5.4.0", 1932 | "resolved": "https://registry.npmjs.org/table/-/table-5.4.0.tgz", 1933 | "integrity": "sha512-nHFDrxmbrkU7JAFKqKbDJXfzrX2UBsWmrieXFTGxiI5e4ncg3VqsZeI4EzNmX0ncp4XNGVeoxIWJXfCIXwrsvw==", 1934 | "dev": true, 1935 | "requires": { 1936 | "ajv": "^6.9.1", 1937 | "lodash": "^4.17.11", 1938 | "slice-ansi": "^2.1.0", 1939 | "string-width": "^3.0.0" 1940 | } 1941 | }, 1942 | "text-table": { 1943 | "version": "0.2.0", 1944 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1945 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1946 | "dev": true 1947 | }, 1948 | "through": { 1949 | "version": "2.3.8", 1950 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1951 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1952 | "dev": true 1953 | }, 1954 | "tmp": { 1955 | "version": "0.0.33", 1956 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1957 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1958 | "dev": true, 1959 | "requires": { 1960 | "os-tmpdir": "~1.0.2" 1961 | } 1962 | }, 1963 | "tough-cookie": { 1964 | "version": "2.5.0", 1965 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", 1966 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", 1967 | "requires": { 1968 | "psl": "^1.1.28", 1969 | "punycode": "^2.1.1" 1970 | } 1971 | }, 1972 | "tr46": { 1973 | "version": "1.0.1", 1974 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", 1975 | "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", 1976 | "requires": { 1977 | "punycode": "^2.1.0" 1978 | } 1979 | }, 1980 | "traverse": { 1981 | "version": "0.3.9", 1982 | "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", 1983 | "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" 1984 | }, 1985 | "tslib": { 1986 | "version": "1.10.0", 1987 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", 1988 | "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", 1989 | "dev": true 1990 | }, 1991 | "tunnel-agent": { 1992 | "version": "0.6.0", 1993 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1994 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1995 | "requires": { 1996 | "safe-buffer": "^5.0.1" 1997 | } 1998 | }, 1999 | "turndown": { 2000 | "version": "5.0.3", 2001 | "resolved": "https://registry.npmjs.org/turndown/-/turndown-5.0.3.tgz", 2002 | "integrity": "sha512-popfGXEiedpq6F5saRIAThKxq/bbEPVFnsDnUdjaDGIre9f3/OL9Yi/yPbPcZ7RYUDpekghr666bBfZPrwNnhQ==", 2003 | "requires": { 2004 | "jsdom": "^11.9.0" 2005 | } 2006 | }, 2007 | "tweetnacl": { 2008 | "version": "0.14.5", 2009 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 2010 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 2011 | }, 2012 | "type-check": { 2013 | "version": "0.3.2", 2014 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 2015 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 2016 | "requires": { 2017 | "prelude-ls": "~1.1.2" 2018 | } 2019 | }, 2020 | "unzipper": { 2021 | "version": "0.9.11", 2022 | "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.9.11.tgz", 2023 | "integrity": "sha512-G0z5zv8LYv4/XwpOiXgTGTcN4jyxgyg3P1DfdIeCN2QGOd6ZBl49BSbOe9JsIEvKh3tG7/b0bdJvz+UmwA+BRg==", 2024 | "requires": { 2025 | "big-integer": "^1.6.17", 2026 | "binary": "~0.3.0", 2027 | "bluebird": "~3.4.1", 2028 | "buffer-indexof-polyfill": "~1.0.0", 2029 | "duplexer2": "~0.1.4", 2030 | "fstream": "~1.0.10", 2031 | "listenercount": "~1.0.1", 2032 | "readable-stream": "~2.3.6", 2033 | "setimmediate": "~1.0.4" 2034 | } 2035 | }, 2036 | "uri-js": { 2037 | "version": "4.2.2", 2038 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 2039 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 2040 | "requires": { 2041 | "punycode": "^2.1.0" 2042 | } 2043 | }, 2044 | "url-parse": { 2045 | "version": "1.4.4", 2046 | "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz", 2047 | "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==", 2048 | "requires": { 2049 | "querystringify": "^2.0.0", 2050 | "requires-port": "^1.0.0" 2051 | } 2052 | }, 2053 | "util-deprecate": { 2054 | "version": "1.0.2", 2055 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2056 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 2057 | }, 2058 | "uuid": { 2059 | "version": "3.3.2", 2060 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 2061 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" 2062 | }, 2063 | "verror": { 2064 | "version": "1.10.0", 2065 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 2066 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 2067 | "requires": { 2068 | "assert-plus": "^1.0.0", 2069 | "core-util-is": "1.0.2", 2070 | "extsprintf": "^1.2.0" 2071 | } 2072 | }, 2073 | "w3c-hr-time": { 2074 | "version": "1.0.1", 2075 | "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", 2076 | "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", 2077 | "requires": { 2078 | "browser-process-hrtime": "^0.1.2" 2079 | } 2080 | }, 2081 | "webidl-conversions": { 2082 | "version": "4.0.2", 2083 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", 2084 | "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" 2085 | }, 2086 | "whatwg-encoding": { 2087 | "version": "1.0.5", 2088 | "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", 2089 | "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", 2090 | "requires": { 2091 | "iconv-lite": "0.4.24" 2092 | } 2093 | }, 2094 | "whatwg-mimetype": { 2095 | "version": "2.3.0", 2096 | "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", 2097 | "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" 2098 | }, 2099 | "whatwg-url": { 2100 | "version": "6.5.0", 2101 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", 2102 | "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", 2103 | "requires": { 2104 | "lodash.sortby": "^4.7.0", 2105 | "tr46": "^1.0.1", 2106 | "webidl-conversions": "^4.0.2" 2107 | } 2108 | }, 2109 | "which": { 2110 | "version": "1.3.1", 2111 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 2112 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 2113 | "requires": { 2114 | "isexe": "^2.0.0" 2115 | } 2116 | }, 2117 | "which-module": { 2118 | "version": "2.0.0", 2119 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 2120 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" 2121 | }, 2122 | "wordwrap": { 2123 | "version": "1.0.0", 2124 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 2125 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" 2126 | }, 2127 | "wrap-ansi": { 2128 | "version": "2.1.0", 2129 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", 2130 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", 2131 | "requires": { 2132 | "string-width": "^1.0.1", 2133 | "strip-ansi": "^3.0.1" 2134 | }, 2135 | "dependencies": { 2136 | "ansi-regex": { 2137 | "version": "2.1.1", 2138 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 2139 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 2140 | }, 2141 | "is-fullwidth-code-point": { 2142 | "version": "1.0.0", 2143 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 2144 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 2145 | "requires": { 2146 | "number-is-nan": "^1.0.0" 2147 | } 2148 | }, 2149 | "string-width": { 2150 | "version": "1.0.2", 2151 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 2152 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 2153 | "requires": { 2154 | "code-point-at": "^1.0.0", 2155 | "is-fullwidth-code-point": "^1.0.0", 2156 | "strip-ansi": "^3.0.0" 2157 | } 2158 | }, 2159 | "strip-ansi": { 2160 | "version": "3.0.1", 2161 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 2162 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 2163 | "requires": { 2164 | "ansi-regex": "^2.0.0" 2165 | } 2166 | } 2167 | } 2168 | }, 2169 | "wrappy": { 2170 | "version": "1.0.2", 2171 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2172 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 2173 | }, 2174 | "write": { 2175 | "version": "1.0.3", 2176 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", 2177 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", 2178 | "dev": true, 2179 | "requires": { 2180 | "mkdirp": "^0.5.1" 2181 | } 2182 | }, 2183 | "ws": { 2184 | "version": "5.2.2", 2185 | "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", 2186 | "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", 2187 | "requires": { 2188 | "async-limiter": "~1.0.0" 2189 | } 2190 | }, 2191 | "xml-name-validator": { 2192 | "version": "3.0.0", 2193 | "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", 2194 | "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" 2195 | }, 2196 | "xtend": { 2197 | "version": "4.0.1", 2198 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 2199 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" 2200 | }, 2201 | "y18n": { 2202 | "version": "4.0.0", 2203 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", 2204 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" 2205 | }, 2206 | "yargs": { 2207 | "version": "13.2.2", 2208 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", 2209 | "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", 2210 | "requires": { 2211 | "cliui": "^4.0.0", 2212 | "find-up": "^3.0.0", 2213 | "get-caller-file": "^2.0.1", 2214 | "os-locale": "^3.1.0", 2215 | "require-directory": "^2.1.1", 2216 | "require-main-filename": "^2.0.0", 2217 | "set-blocking": "^2.0.0", 2218 | "string-width": "^3.0.0", 2219 | "which-module": "^2.0.0", 2220 | "y18n": "^4.0.0", 2221 | "yargs-parser": "^13.0.0" 2222 | } 2223 | }, 2224 | "yargs-parser": { 2225 | "version": "13.0.0", 2226 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", 2227 | "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", 2228 | "requires": { 2229 | "camelcase": "^5.0.0", 2230 | "decamelize": "^1.2.0" 2231 | } 2232 | } 2233 | } 2234 | } 2235 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@stackbit/stackbit-medium-importer", 3 | "version": "0.2.0", 4 | "description": "Stackbit Medium Importer", 5 | "main": "index.js", 6 | "scripts": {}, 7 | "author": "Stackbit", 8 | "dependencies": { 9 | "axios": "^0.18.0", 10 | "chalk": "^2.4.2", 11 | "cheerio": "^1.0.0-rc.2", 12 | "gray-matter": "^4.0.2", 13 | "js-yaml": "^3.12.2", 14 | "lodash": "^4.17.11", 15 | "p-all": "^2.0.0", 16 | "sanitize-html": "^1.20.0", 17 | "turndown": "^5.0.3", 18 | "unzipper": "^0.9.11", 19 | "url-parse": "^1.4.4", 20 | "yargs": "^13.2.2" 21 | }, 22 | "repository": { 23 | "url": "https://github.com/stackbithq/stackbit-medium-importer.git" 24 | }, 25 | "bugs": { 26 | "url": "https://github.com/stackbithq/gatsby-plugin-menus/issues" 27 | }, 28 | "bin": { 29 | "medium-importer": "./scripts/import-external.js" 30 | }, 31 | "license": "MIT", 32 | "devDependencies": { 33 | "eslint": "^5.16.0" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /scripts/import-external.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const fs = require('fs'); 4 | const path = require('path'); 5 | const yargs = require('yargs'); 6 | const importer = require('../src/importer'); 7 | const chalk = require('chalk'); 8 | 9 | 10 | let argv = yargs 11 | .usage('Usage: $0 --input-file= --output-dir= --concurrency= --download-images= --import-drafts=') 12 | .example( 13 | '$0 -i medium-export.zip -o output/', 14 | 'Convert export located in "medium-export.zip" into Stackbit readable format saved to "output/"' 15 | ) 16 | .alias('input-file', 'i') 17 | .alias('output-dir', 'o') 18 | .alias('concurrency', 'c') 19 | .alias('download-images', 'd') 20 | .alias('import-drafts', 'r') 21 | .describe('input-file', 'medium export zip file') 22 | .describe('output-dir', 'target folder for the converted files') 23 | .describe('concurrency', 'number of posts to process in parallel') 24 | .describe('download-images', 'should images be downloaded') 25 | .describe('import-drafts', 'should drafts be imported') 26 | .default('concurrency', 1) 27 | .default('download-images', true) 28 | .default('import-drafts', true) 29 | .demandOption(['input-file', 'output-dir']) 30 | .wrap(null) 31 | .argv; 32 | 33 | const inputFilename = argv['inputFile']; 34 | const outputDir = argv['outputDir']; 35 | const concurrency = argv['concurrency']; 36 | const shouldDownloadImages = argv['downloadImages'] !== 'false'; 37 | const shouldImportDrafts = argv['importDrafts'] && argv['importDrafts'] !== 'false'; 38 | 39 | const contentDir = path.join(outputDir, 'content'); 40 | const postsDir = path.join(contentDir, 'posts'); 41 | 42 | const staticDir = path.join(outputDir, 'static'); 43 | const imagesDir = path.join(staticDir, 'images'); 44 | 45 | const dataDir = path.join(outputDir, 'data'); 46 | const dataFile = path.join(dataDir, 'data.json'); 47 | 48 | const originalDir = path.join(outputDir, 'original'); 49 | 50 | [outputDir, dataDir, staticDir, contentDir].forEach(dir => { 51 | if (!fs.existsSync(dir)) { 52 | fs.mkdirSync(dir); 53 | } 54 | }); 55 | 56 | importer.doImport(inputFilename, postsDir, imagesDir, dataFile, originalDir, shouldDownloadImages, shouldImportDrafts, concurrency).then(() => { 57 | console.log(chalk.green.bold('Done importing')); 58 | }).catch(error => { 59 | console.error(chalk.red(error.message)); 60 | }); 61 | -------------------------------------------------------------------------------- /src/converter.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | const sanitizeHtml = require('sanitize-html'); 4 | const TurndownService = require('turndown'); 5 | 6 | function processHtml(html, slug, imageMap) { 7 | return sanitizeHtml(html, { 8 | allowedTags: sanitizeHtml.defaults.allowedTags.concat(['figcaption', 'img', 'iframe', 'script', 'hr', 'blockquote', 'pre']), 9 | allowedAttributes: { 10 | iframe: ['*'], 11 | img: ['*'], 12 | a: ['*'], 13 | div: ['class'], 14 | h3: ['class'], 15 | script: ['*'], 16 | blockquote: ['class'] 17 | }, 18 | transformTags: { 19 | 'img': (tagName, attribs) => { 20 | const newAttribs = Object.assign(attribs, { 21 | src: imageMap.has(attribs.src) 22 | ? `/images/${slug}/${imageMap.get(attribs.src)}` 23 | : attribs.src 24 | }); 25 | return { 26 | tagName: tagName, 27 | attribs: newAttribs 28 | }; 29 | }, 30 | 'blockquote': (tagName, attribs) => { 31 | let result = { 32 | tagName: tagName, 33 | attribs: attribs, 34 | }; 35 | if (attribs.class === 'twitter-tweet') { 36 | // placeholder needed to get rendered properly 37 | result.text = 'tweet'; 38 | } 39 | return result; 40 | }, 41 | }, 42 | exclusiveFilter: function(frame) { 43 | return (frame.tag === 'h3' && 44 | frame.attribs['class'].includes('graf--title')) || 45 | (frame.tag === 'h4' && 46 | frame.attribs['class'].includes('graf--subtitle')); 47 | } 48 | }); 49 | } 50 | 51 | function convertToMarkdown(html) { 52 | 53 | // workaround issue with multiline emphasis 54 | let bodyHtml = html.replace(/
<\/em>/gmi, '
'); 55 | 56 | // workaround issue with pre blocks 57 | bodyHtml = bodyHtml.replace(/
/gmi, '
');
58 |     bodyHtml = bodyHtml.replace(/<\/pre>/gmi, '
'); 59 | 60 | // unicode spaces are causing issues with whitespace detection 61 | bodyHtml = bodyHtml.replace(/[\u2000-\u200D]+/gmi, ' '); 62 | 63 | const turndownService = new TurndownService({ 64 | emDelimiter: '*' 65 | }); 66 | turndownService.keep(['iframe', 'figcaption', 'script']); 67 | turndownService.addRule('twitter-tweet', { 68 | filter: (node) => { 69 | return node.nodeName === 'BLOCKQUOTE' && 70 | node.getAttribute('class') === 'twitter-tweet'; 71 | }, 72 | replacement: (innerHTML, node) => node.outerHTML 73 | }); 74 | turndownService.addRule('pre', { 75 | filter: ['pre'], 76 | replacement: (content) => { 77 | return '\n ' + content.split('\n').join('\n '); 78 | } 79 | }); 80 | 81 | const bodyMarkdown = turndownService.turndown(bodyHtml); 82 | 83 | return bodyMarkdown; 84 | } 85 | 86 | function convert(html, slug, imageMap) { 87 | const processedHtml = processHtml(html, slug, imageMap); 88 | 89 | const markdown = convertToMarkdown(processedHtml); 90 | 91 | return markdown; 92 | } 93 | 94 | module.exports = convert; -------------------------------------------------------------------------------- /src/errors.js: -------------------------------------------------------------------------------- 1 | 2 | const Errors = { 3 | InputFileNotFound: { message: 'Input file not found' }, 4 | InvalidZip: { message: 'Error unzipping file' }, 5 | EmptyInput: { message: 'Nothing found to import' } 6 | }; 7 | 8 | module.exports = Errors; -------------------------------------------------------------------------------- /src/image-downloader.js: -------------------------------------------------------------------------------- 1 | const _ = require('lodash'); 2 | const fs = require('fs'); 3 | const path = require('path'); 4 | const pAll = require('p-all'); 5 | const axios = require('axios'); 6 | const chalk = require('chalk'); 7 | 8 | function downloadImage(url, outputFilePath) { 9 | console.log(chalk.gray('downloading image: ' + url)); 10 | 11 | return axios({ 12 | method: 'get', 13 | url: url, 14 | responseType: 'stream', 15 | timeout: 60 * 1000 16 | }).then(function (response) { 17 | response.data.pipe(fs.createWriteStream(outputFilePath)); 18 | return new Promise((resolve, reject) => { 19 | response.data.on('end', () => { 20 | resolve({ 21 | url: url, 22 | filename: path.parse(outputFilePath).base 23 | }); 24 | }); 25 | response.data.on('error', reject); 26 | }); 27 | }).catch((err) => { 28 | // failure to download image is just a warning 29 | console.warn(err); 30 | }); 31 | } 32 | 33 | function downloadAllImages(urls, outputDir) { 34 | console.log(chalk.gray('downloading images to ' + outputDir)); 35 | 36 | const imageDownloads = urls.map((url) => { 37 | let filename = url.substring(url.lastIndexOf('/') + 1); 38 | const ext = path.extname(filename); 39 | if (_.isEmpty(ext) || ext === '.') { 40 | filename += '.jpg'; 41 | } 42 | return () => downloadImage(url, path.join(outputDir, filename)); 43 | }); 44 | return pAll(imageDownloads, { concurrency: 1 }); 45 | } 46 | 47 | module.exports = downloadAllImages; -------------------------------------------------------------------------------- /src/importer.js: -------------------------------------------------------------------------------- 1 | const _ = require('lodash'); 2 | const fs = require('fs'); 3 | const path = require('path'); 4 | const pAll = require('p-all'); 5 | const unzipper = require('unzipper'); 6 | const matter = require('gray-matter'); 7 | const chalk = require('chalk'); 8 | 9 | const Errors = require('./errors'); 10 | const Post = require('./model/post'); 11 | const Profile = require('./model/profile'); 12 | const downloadImages = require('./image-downloader'); 13 | const convertHtml = require('./converter'); 14 | 15 | function unzipInput(inputFilePath, outputDir) { 16 | return fs.createReadStream(inputFilePath) 17 | .pipe(unzipper.Extract({ path: outputDir })) 18 | .promise() 19 | .catch((err) => { 20 | console.error(err); 21 | throw Errors.InvalidZip; 22 | }); 23 | } 24 | 25 | function processPost(postFilePath, outputDir, assetsDir, shouldDownloadImages, shouldImportDrafts) { 26 | console.log(chalk.bold('processing post ' + postFilePath)); 27 | 28 | const post = new Post(fs.readFileSync(postFilePath)); 29 | 30 | const fileName = path.parse(postFilePath).name; 31 | if (!shouldImportDrafts && fileName.startsWith('draft_')) { 32 | console.log('skipping draft: ' + fileName); 33 | return Promise.resolve(); 34 | } 35 | 36 | const slug = fileName 37 | .substring(0, fileName.lastIndexOf('-')) 38 | .substring(fileName.indexOf('_') + 1) 39 | .replace(/-+$/, '') 40 | .substring(0, 200); 41 | const imagesDir = path.join(assetsDir, slug); 42 | 43 | if (!fs.existsSync(imagesDir)) { 44 | fs.mkdirSync(imagesDir); 45 | } 46 | 47 | const imageUrls = post.imageUrls; 48 | 49 | const downloadPromise = shouldDownloadImages 50 | ? downloadImages(imageUrls, imagesDir) 51 | : Promise.resolve([]); 52 | 53 | return downloadPromise.then((results) => { 54 | 55 | const images = results.filter(Boolean); 56 | const imageMap = new Map(images.map(item => [item.url, item.filename])); 57 | 58 | const thumbPath = _.isEmpty(images) 59 | ? (_.isEmpty(imageUrls) ? null : imageUrls[0]) 60 | : `images/${slug}/${images[0].filename}`; 61 | 62 | const bodyMarkdown = convertHtml(post.bodyHtml, slug, imageMap); 63 | 64 | const data = { 65 | template: 'post', 66 | title: post.title, 67 | date: post.publishDate || new Date() 68 | }; 69 | 70 | if (post.subtitle) { 71 | data.subtitle = post.subtitle; 72 | } 73 | if (post.excerpt) { 74 | data.excerpt = post.excerpt; 75 | } 76 | if (thumbPath) { 77 | data.thumb_img_path = thumbPath; 78 | } 79 | if (post.splashImageUrl) { 80 | data.content_img_path = imageMap.has(post.splashImageUrl) 81 | ? `images/${slug}/${imageMap.get(post.splashImageUrl)}` 82 | : post.splashImageUrl; 83 | } 84 | 85 | const outputFilename = path.join(outputDir, `${slug}.md`); 86 | const yamlContent = matter.stringify(bodyMarkdown, data); 87 | fs.writeFileSync(outputFilename, yamlContent); 88 | 89 | console.log('done with ' + outputFilename); 90 | }); 91 | } 92 | 93 | function processPosts(inputDir, outputDir, assetsDir, concurrency, shouldDownloadImages, shouldImportDrafts) { 94 | if (!fs.existsSync(inputDir)) { 95 | throw Errors.EmptyInput; 96 | } 97 | if (!fs.existsSync(outputDir)) { 98 | fs.mkdirSync(outputDir); 99 | } 100 | if (!fs.existsSync(assetsDir)) { 101 | fs.mkdirSync(assetsDir); 102 | } 103 | 104 | const postFiles = fs.readdirSync(inputDir); 105 | 106 | if (_.isEmpty(postFiles)) { 107 | throw Errors.EmptyInput; 108 | } 109 | 110 | return pAll(postFiles.map((filename) => { 111 | return () => processPost(path.join(inputDir, filename), outputDir, assetsDir, shouldDownloadImages, shouldImportDrafts); 112 | }), { concurrency: concurrency }); 113 | } 114 | 115 | function processProfile(inputFile, dataFile, assetsDir) { 116 | console.log(chalk.bold('processing profile ' + inputFile)); 117 | 118 | if (!fs.existsSync(inputFile)) { 119 | console.log('no profile file'); 120 | return Promise.resolve(); 121 | } 122 | 123 | const profile = new Profile(fs.readFileSync(inputFile)); 124 | 125 | let data = { 126 | author: {}, 127 | social: {} 128 | }; 129 | 130 | if (profile.name) { 131 | data.author.name = profile.name; 132 | } 133 | if (profile.email) { 134 | data.author.email = profile.email; 135 | } 136 | if (profile.twitterUsername) { 137 | data.social.twitter = { 138 | username: profile.twitterUsername, 139 | url: `https://twitter.com/${profile.twitterUsername}` 140 | }; 141 | } 142 | 143 | const avatarUrl = profile.avatarUrl; 144 | if (avatarUrl) { 145 | return downloadImages([avatarUrl], assetsDir).then((results) => { 146 | const filename = _.get(results, '[0].filename'); 147 | if (filename) { 148 | fs.renameSync( 149 | path.join(assetsDir, filename), 150 | path.join(assetsDir, 'avatar.png') 151 | ); 152 | data.author.avatar = 'images/avatar.png'; 153 | fs.writeFileSync(dataFile, JSON.stringify(data)); 154 | } 155 | }); 156 | } 157 | 158 | fs.writeFileSync(dataFile, JSON.stringify(data)); 159 | 160 | return Promise.resolve(); 161 | } 162 | 163 | function doImport(inputFilePath, postsDir, imagesDir, dataFile, originalDir, shouldDownloadImages=true, shouldImportDrafts=false, concurrency=1) { 164 | if (!fs.existsSync(inputFilePath)) { 165 | return Promise.reject(Errors.InputFileNotFound); 166 | } 167 | 168 | return unzipInput(inputFilePath, originalDir).then(() => { 169 | return processPosts( 170 | path.join(originalDir, 'posts'), 171 | postsDir, 172 | imagesDir, 173 | concurrency, 174 | shouldDownloadImages, 175 | shouldImportDrafts 176 | ); 177 | }).then(() => { 178 | if (dataFile) { 179 | return processProfile( 180 | path.join(originalDir, 'profile/profile.html'), 181 | dataFile, 182 | imagesDir 183 | ); 184 | } 185 | }); 186 | } 187 | 188 | module.exports = { 189 | doImport 190 | }; -------------------------------------------------------------------------------- /src/model/post.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | const cheerio = require('cheerio'); 4 | const urlParse = require('url-parse'); 5 | 6 | class Post { 7 | constructor(content) { 8 | this.content = content; 9 | this.$ = cheerio.load(content); 10 | } 11 | 12 | get title() { 13 | return this.$('title').text().trim(); 14 | } 15 | 16 | get excerpt() { 17 | return this.$('section[data-field=subtitle]').text().trim() || 18 | this.subtitle; 19 | } 20 | 21 | get subtitle() { 22 | return this.$('h4[class*="graf--subtitle"]').text().trim(); 23 | } 24 | 25 | get publishDate() { 26 | const publishTime = this.$('time[class*="dt-published"]').attr('datetime'); 27 | if (publishTime) { 28 | return new Date(publishTime); 29 | } 30 | return null; 31 | } 32 | 33 | get imageUrls() { 34 | return this.$('img') 35 | .map((i, img) => this.$(img).attr('src')) 36 | .get() 37 | .filter(url => urlParse(url).hostname.includes('medium.com')); 38 | } 39 | 40 | get splashImageUrl() { 41 | return null;//this.$('div[class*=sectionLayout--fullWidth] img').attr('src'); 42 | } 43 | 44 | get bodyHtml() { 45 | return this.$('div[class*=section-content]') 46 | .map((i, section) => this.$(section).html()) 47 | .get() 48 | .join('
'); 49 | } 50 | } 51 | 52 | module.exports = Post; -------------------------------------------------------------------------------- /src/model/profile.js: -------------------------------------------------------------------------------- 1 | const cheerio = require('cheerio'); 2 | 3 | class Profile { 4 | constructor(content) { 5 | this.content = content; 6 | this.$ = cheerio.load(content); 7 | 8 | const props = this.$('li') 9 | .map((i, elem) => this.$(elem).text()) 10 | .get() 11 | .map(propStr => propStr.split(':')) 12 | .reduce((acc, val) => { 13 | acc[val[0]] = val.slice(1).join(':').trim(); 14 | return acc; 15 | }, {}); 16 | 17 | this.name = props['Display name']; 18 | this.email = props['Email address']; 19 | this.twitterUsername = props['Twitter']; 20 | } 21 | 22 | get avatarUrl() { 23 | return this.$('img[class*=u-photo]').attr('src'); 24 | } 25 | } 26 | 27 | module.exports = Profile; --------------------------------------------------------------------------------