├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── .prettierrc ├── package-lock.json ├── package.json ├── readme.md └── src ├── helpers └── index.js ├── index.js └── methods ├── getMfa.js ├── index.js ├── login.js ├── loginMfa.js ├── loginNewPasswordRequired.js ├── logout.js ├── passwordChange.js ├── passwordForgot.js ├── passwordReset.js ├── profile.js ├── profileAttributeConfirm.js ├── profileEdit.js ├── profileEditPhoneNumber.js ├── refreshSession.js ├── setMfa.js ├── signup.js ├── signupConfirm.js └── signupResend.js /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | src/models/flat/ 4 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: "airbnb-base", 3 | parserOptions: { 4 | "ecmaVersion": 2017, 5 | }, 6 | rules: { 7 | "object-curly-newline": 0, 8 | "consistent-return": 0, 9 | "no-unused-vars": 1, 10 | "eol-last": 0, 11 | "arrow-parens": 0, 12 | "camelcase": 0, 13 | "max-len": 0, 14 | "no-underscore-dangle": 0, 15 | "padded-blocks": ["error", { "classes": "always" }], 16 | "brace-style": 0, 17 | "arrow-body-style": 0, 18 | "no-useless-escape": 0, 19 | "prefer-destructuring": [1, { "array": false, "object": true }], 20 | 'no-multi-spaces': 0, 21 | "no-param-reassign": [2, { "props": false }], 22 | "brace-style": ["error", "stroustrup", { "allowSingleLine": true }], 23 | "indent": ["error", 2, { "SwitchCase": 1 }], 24 | "linebreak-style": ["error", "unix"], 25 | }, 26 | }; 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | *.log 4 | dist 5 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "tabWidth": 2, 4 | "printWidth": 100 5 | } 6 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cognito-user-pool", 3 | "version": "0.2.4", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "acorn": { 8 | "version": "5.7.1", 9 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", 10 | "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", 11 | "dev": true 12 | }, 13 | "acorn-jsx": { 14 | "version": "3.0.1", 15 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", 16 | "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", 17 | "dev": true, 18 | "requires": { 19 | "acorn": "^3.0.4" 20 | }, 21 | "dependencies": { 22 | "acorn": { 23 | "version": "3.3.0", 24 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", 25 | "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", 26 | "dev": true 27 | } 28 | } 29 | }, 30 | "ajv": { 31 | "version": "5.5.2", 32 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", 33 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", 34 | "dev": true, 35 | "requires": { 36 | "co": "^4.6.0", 37 | "fast-deep-equal": "^1.0.0", 38 | "fast-json-stable-stringify": "^2.0.0", 39 | "json-schema-traverse": "^0.3.0" 40 | } 41 | }, 42 | "ajv-keywords": { 43 | "version": "2.1.1", 44 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", 45 | "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", 46 | "dev": true 47 | }, 48 | "amazon-cognito-identity-js": { 49 | "version": "1.31.0", 50 | "resolved": "https://registry.npmjs.org/amazon-cognito-identity-js/-/amazon-cognito-identity-js-1.31.0.tgz", 51 | "integrity": "sha1-Hc0PJs6UBMGYo1Ro6LsAQQUDAh0=", 52 | "requires": { 53 | "aws-sdk": "2.177.0", 54 | "js-cookie": "^2.1.4" 55 | } 56 | }, 57 | "ansi-escapes": { 58 | "version": "3.1.0", 59 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", 60 | "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", 61 | "dev": true 62 | }, 63 | "ansi-regex": { 64 | "version": "2.1.1", 65 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 66 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 67 | "dev": true 68 | }, 69 | "ansi-styles": { 70 | "version": "2.2.1", 71 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 72 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 73 | "dev": true 74 | }, 75 | "argparse": { 76 | "version": "1.0.10", 77 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 78 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 79 | "dev": true, 80 | "requires": { 81 | "sprintf-js": "~1.0.2" 82 | } 83 | }, 84 | "array-union": { 85 | "version": "1.0.2", 86 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", 87 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", 88 | "dev": true, 89 | "requires": { 90 | "array-uniq": "^1.0.1" 91 | } 92 | }, 93 | "array-uniq": { 94 | "version": "1.0.3", 95 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 96 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", 97 | "dev": true 98 | }, 99 | "arrify": { 100 | "version": "1.0.1", 101 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 102 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", 103 | "dev": true 104 | }, 105 | "aws-sdk": { 106 | "version": "2.177.0", 107 | "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.177.0.tgz", 108 | "integrity": "sha1-1fvx+CurJQ5VFTaZsDC0T2h/YAs=", 109 | "requires": { 110 | "buffer": "4.9.1", 111 | "crypto-browserify": "1.0.9", 112 | "events": "^1.1.1", 113 | "jmespath": "0.15.0", 114 | "querystring": "0.2.0", 115 | "sax": "1.2.1", 116 | "url": "0.10.3", 117 | "uuid": "3.1.0", 118 | "xml2js": "0.4.17", 119 | "xmlbuilder": "4.2.1" 120 | } 121 | }, 122 | "babel-code-frame": { 123 | "version": "6.26.0", 124 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 125 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", 126 | "dev": true, 127 | "requires": { 128 | "chalk": "^1.1.3", 129 | "esutils": "^2.0.2", 130 | "js-tokens": "^3.0.2" 131 | } 132 | }, 133 | "balanced-match": { 134 | "version": "1.0.0", 135 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 136 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 137 | "dev": true 138 | }, 139 | "base64-js": { 140 | "version": "1.3.0", 141 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", 142 | "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" 143 | }, 144 | "brace-expansion": { 145 | "version": "1.1.11", 146 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 147 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 148 | "dev": true, 149 | "requires": { 150 | "balanced-match": "^1.0.0", 151 | "concat-map": "0.0.1" 152 | } 153 | }, 154 | "buffer": { 155 | "version": "4.9.1", 156 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", 157 | "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", 158 | "requires": { 159 | "base64-js": "^1.0.2", 160 | "ieee754": "^1.1.4", 161 | "isarray": "^1.0.0" 162 | } 163 | }, 164 | "buffer-from": { 165 | "version": "1.1.0", 166 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", 167 | "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", 168 | "dev": true 169 | }, 170 | "builtin-modules": { 171 | "version": "1.1.1", 172 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 173 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 174 | "dev": true 175 | }, 176 | "caller-path": { 177 | "version": "0.1.0", 178 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", 179 | "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", 180 | "dev": true, 181 | "requires": { 182 | "callsites": "^0.2.0" 183 | } 184 | }, 185 | "callsites": { 186 | "version": "0.2.0", 187 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", 188 | "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", 189 | "dev": true 190 | }, 191 | "chalk": { 192 | "version": "1.1.3", 193 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 194 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 195 | "dev": true, 196 | "requires": { 197 | "ansi-styles": "^2.2.1", 198 | "escape-string-regexp": "^1.0.2", 199 | "has-ansi": "^2.0.0", 200 | "strip-ansi": "^3.0.0", 201 | "supports-color": "^2.0.0" 202 | } 203 | }, 204 | "chardet": { 205 | "version": "0.4.2", 206 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", 207 | "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", 208 | "dev": true 209 | }, 210 | "circular-json": { 211 | "version": "0.3.3", 212 | "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", 213 | "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", 214 | "dev": true 215 | }, 216 | "cli-cursor": { 217 | "version": "2.1.0", 218 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 219 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 220 | "dev": true, 221 | "requires": { 222 | "restore-cursor": "^2.0.0" 223 | } 224 | }, 225 | "cli-width": { 226 | "version": "2.2.0", 227 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 228 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 229 | "dev": true 230 | }, 231 | "co": { 232 | "version": "4.6.0", 233 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 234 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", 235 | "dev": true 236 | }, 237 | "color-convert": { 238 | "version": "1.9.2", 239 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", 240 | "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", 241 | "dev": true, 242 | "requires": { 243 | "color-name": "1.1.1" 244 | } 245 | }, 246 | "color-name": { 247 | "version": "1.1.1", 248 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", 249 | "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", 250 | "dev": true 251 | }, 252 | "concat-map": { 253 | "version": "0.0.1", 254 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 255 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 256 | "dev": true 257 | }, 258 | "concat-stream": { 259 | "version": "1.6.2", 260 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 261 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 262 | "dev": true, 263 | "requires": { 264 | "buffer-from": "^1.0.0", 265 | "inherits": "^2.0.3", 266 | "readable-stream": "^2.2.2", 267 | "typedarray": "^0.0.6" 268 | } 269 | }, 270 | "contains-path": { 271 | "version": "0.1.0", 272 | "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", 273 | "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", 274 | "dev": true 275 | }, 276 | "core-util-is": { 277 | "version": "1.0.2", 278 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 279 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 280 | "dev": true 281 | }, 282 | "cross-spawn": { 283 | "version": "5.1.0", 284 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", 285 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", 286 | "dev": true, 287 | "requires": { 288 | "lru-cache": "^4.0.1", 289 | "shebang-command": "^1.2.0", 290 | "which": "^1.2.9" 291 | } 292 | }, 293 | "crypto-browserify": { 294 | "version": "1.0.9", 295 | "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-1.0.9.tgz", 296 | "integrity": "sha1-zFRJaF37hesRyYKKzHy4erW7/MA=" 297 | }, 298 | "debug": { 299 | "version": "2.6.9", 300 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 301 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 302 | "dev": true, 303 | "requires": { 304 | "ms": "2.0.0" 305 | } 306 | }, 307 | "deep-is": { 308 | "version": "0.1.3", 309 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 310 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 311 | "dev": true 312 | }, 313 | "define-properties": { 314 | "version": "1.1.2", 315 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", 316 | "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", 317 | "dev": true, 318 | "requires": { 319 | "foreach": "^2.0.5", 320 | "object-keys": "^1.0.8" 321 | } 322 | }, 323 | "del": { 324 | "version": "2.2.2", 325 | "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", 326 | "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", 327 | "dev": true, 328 | "requires": { 329 | "globby": "^5.0.0", 330 | "is-path-cwd": "^1.0.0", 331 | "is-path-in-cwd": "^1.0.0", 332 | "object-assign": "^4.0.1", 333 | "pify": "^2.0.0", 334 | "pinkie-promise": "^2.0.0", 335 | "rimraf": "^2.2.8" 336 | } 337 | }, 338 | "doctrine": { 339 | "version": "2.1.0", 340 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 341 | "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 342 | "dev": true, 343 | "requires": { 344 | "esutils": "^2.0.2" 345 | } 346 | }, 347 | "error-ex": { 348 | "version": "1.3.2", 349 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 350 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 351 | "dev": true, 352 | "requires": { 353 | "is-arrayish": "^0.2.1" 354 | } 355 | }, 356 | "es-abstract": { 357 | "version": "1.12.0", 358 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", 359 | "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", 360 | "dev": true, 361 | "requires": { 362 | "es-to-primitive": "^1.1.1", 363 | "function-bind": "^1.1.1", 364 | "has": "^1.0.1", 365 | "is-callable": "^1.1.3", 366 | "is-regex": "^1.0.4" 367 | } 368 | }, 369 | "es-to-primitive": { 370 | "version": "1.1.1", 371 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", 372 | "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", 373 | "dev": true, 374 | "requires": { 375 | "is-callable": "^1.1.1", 376 | "is-date-object": "^1.0.1", 377 | "is-symbol": "^1.0.1" 378 | } 379 | }, 380 | "escape-string-regexp": { 381 | "version": "1.0.5", 382 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 383 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 384 | "dev": true 385 | }, 386 | "eslint": { 387 | "version": "4.19.1", 388 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", 389 | "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", 390 | "dev": true, 391 | "requires": { 392 | "ajv": "^5.3.0", 393 | "babel-code-frame": "^6.22.0", 394 | "chalk": "^2.1.0", 395 | "concat-stream": "^1.6.0", 396 | "cross-spawn": "^5.1.0", 397 | "debug": "^3.1.0", 398 | "doctrine": "^2.1.0", 399 | "eslint-scope": "^3.7.1", 400 | "eslint-visitor-keys": "^1.0.0", 401 | "espree": "^3.5.4", 402 | "esquery": "^1.0.0", 403 | "esutils": "^2.0.2", 404 | "file-entry-cache": "^2.0.0", 405 | "functional-red-black-tree": "^1.0.1", 406 | "glob": "^7.1.2", 407 | "globals": "^11.0.1", 408 | "ignore": "^3.3.3", 409 | "imurmurhash": "^0.1.4", 410 | "inquirer": "^3.0.6", 411 | "is-resolvable": "^1.0.0", 412 | "js-yaml": "^3.9.1", 413 | "json-stable-stringify-without-jsonify": "^1.0.1", 414 | "levn": "^0.3.0", 415 | "lodash": "^4.17.4", 416 | "minimatch": "^3.0.2", 417 | "mkdirp": "^0.5.1", 418 | "natural-compare": "^1.4.0", 419 | "optionator": "^0.8.2", 420 | "path-is-inside": "^1.0.2", 421 | "pluralize": "^7.0.0", 422 | "progress": "^2.0.0", 423 | "regexpp": "^1.0.1", 424 | "require-uncached": "^1.0.3", 425 | "semver": "^5.3.0", 426 | "strip-ansi": "^4.0.0", 427 | "strip-json-comments": "~2.0.1", 428 | "table": "4.0.2", 429 | "text-table": "~0.2.0" 430 | }, 431 | "dependencies": { 432 | "ansi-regex": { 433 | "version": "3.0.0", 434 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 435 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 436 | "dev": true 437 | }, 438 | "ansi-styles": { 439 | "version": "3.2.1", 440 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 441 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 442 | "dev": true, 443 | "requires": { 444 | "color-convert": "^1.9.0" 445 | } 446 | }, 447 | "chalk": { 448 | "version": "2.4.1", 449 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", 450 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", 451 | "dev": true, 452 | "requires": { 453 | "ansi-styles": "^3.2.1", 454 | "escape-string-regexp": "^1.0.5", 455 | "supports-color": "^5.3.0" 456 | } 457 | }, 458 | "debug": { 459 | "version": "3.1.0", 460 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 461 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 462 | "dev": true, 463 | "requires": { 464 | "ms": "2.0.0" 465 | } 466 | }, 467 | "globals": { 468 | "version": "11.7.0", 469 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", 470 | "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", 471 | "dev": true 472 | }, 473 | "strip-ansi": { 474 | "version": "4.0.0", 475 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 476 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 477 | "dev": true, 478 | "requires": { 479 | "ansi-regex": "^3.0.0" 480 | } 481 | }, 482 | "supports-color": { 483 | "version": "5.4.0", 484 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", 485 | "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", 486 | "dev": true, 487 | "requires": { 488 | "has-flag": "^3.0.0" 489 | } 490 | } 491 | } 492 | }, 493 | "eslint-config-airbnb": { 494 | "version": "17.0.0", 495 | "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-17.0.0.tgz", 496 | "integrity": "sha512-FLaAYKpu9gLw/ca0qXQRT150Nbfvwc8eaCITaJCU25H9x+5CHsBPW1pFB6EF3r3T2PZTnXrHKisLh+GT43ZY5Q==", 497 | "dev": true, 498 | "requires": { 499 | "eslint-config-airbnb-base": "^13.0.0", 500 | "object.assign": "^4.1.0", 501 | "object.entries": "^1.0.4" 502 | } 503 | }, 504 | "eslint-config-airbnb-base": { 505 | "version": "13.0.0", 506 | "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-13.0.0.tgz", 507 | "integrity": "sha512-hUFXRlE6AY84z0qYh4wKdtSF4EqDnyT8sxrvTpcXCV4ENSLF8li5yNA1yDM26iinH8Ierbpc4lv8Rp62uX6VSQ==", 508 | "dev": true, 509 | "requires": { 510 | "eslint-restricted-globals": "^0.1.1", 511 | "object.assign": "^4.1.0", 512 | "object.entries": "^1.0.4" 513 | } 514 | }, 515 | "eslint-import-resolver-node": { 516 | "version": "0.3.2", 517 | "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", 518 | "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", 519 | "dev": true, 520 | "requires": { 521 | "debug": "^2.6.9", 522 | "resolve": "^1.5.0" 523 | } 524 | }, 525 | "eslint-module-utils": { 526 | "version": "2.2.0", 527 | "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz", 528 | "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", 529 | "dev": true, 530 | "requires": { 531 | "debug": "^2.6.8", 532 | "pkg-dir": "^1.0.0" 533 | } 534 | }, 535 | "eslint-plugin-import": { 536 | "version": "2.13.0", 537 | "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.13.0.tgz", 538 | "integrity": "sha512-t6hGKQDMIt9N8R7vLepsYXgDfeuhp6ZJSgtrLEDxonpSubyxUZHjhm6LsAaZX8q6GYVxkbT3kTsV9G5mBCFR6A==", 539 | "dev": true, 540 | "requires": { 541 | "contains-path": "^0.1.0", 542 | "debug": "^2.6.8", 543 | "doctrine": "1.5.0", 544 | "eslint-import-resolver-node": "^0.3.1", 545 | "eslint-module-utils": "^2.2.0", 546 | "has": "^1.0.1", 547 | "lodash": "^4.17.4", 548 | "minimatch": "^3.0.3", 549 | "read-pkg-up": "^2.0.0", 550 | "resolve": "^1.6.0" 551 | }, 552 | "dependencies": { 553 | "doctrine": { 554 | "version": "1.5.0", 555 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", 556 | "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", 557 | "dev": true, 558 | "requires": { 559 | "esutils": "^2.0.2", 560 | "isarray": "^1.0.0" 561 | } 562 | } 563 | } 564 | }, 565 | "eslint-restricted-globals": { 566 | "version": "0.1.1", 567 | "resolved": "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz", 568 | "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=", 569 | "dev": true 570 | }, 571 | "eslint-scope": { 572 | "version": "3.7.1", 573 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", 574 | "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", 575 | "dev": true, 576 | "requires": { 577 | "esrecurse": "^4.1.0", 578 | "estraverse": "^4.1.1" 579 | } 580 | }, 581 | "eslint-visitor-keys": { 582 | "version": "1.0.0", 583 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", 584 | "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", 585 | "dev": true 586 | }, 587 | "espree": { 588 | "version": "3.5.4", 589 | "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", 590 | "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", 591 | "dev": true, 592 | "requires": { 593 | "acorn": "^5.5.0", 594 | "acorn-jsx": "^3.0.0" 595 | } 596 | }, 597 | "esprima": { 598 | "version": "4.0.1", 599 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 600 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 601 | "dev": true 602 | }, 603 | "esquery": { 604 | "version": "1.0.1", 605 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", 606 | "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", 607 | "dev": true, 608 | "requires": { 609 | "estraverse": "^4.0.0" 610 | } 611 | }, 612 | "esrecurse": { 613 | "version": "4.2.1", 614 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 615 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 616 | "dev": true, 617 | "requires": { 618 | "estraverse": "^4.1.0" 619 | } 620 | }, 621 | "estraverse": { 622 | "version": "4.2.0", 623 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 624 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", 625 | "dev": true 626 | }, 627 | "esutils": { 628 | "version": "2.0.2", 629 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 630 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 631 | "dev": true 632 | }, 633 | "events": { 634 | "version": "1.1.1", 635 | "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", 636 | "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" 637 | }, 638 | "external-editor": { 639 | "version": "2.2.0", 640 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", 641 | "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", 642 | "dev": true, 643 | "requires": { 644 | "chardet": "^0.4.0", 645 | "iconv-lite": "^0.4.17", 646 | "tmp": "^0.0.33" 647 | } 648 | }, 649 | "fast-deep-equal": { 650 | "version": "1.1.0", 651 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", 652 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", 653 | "dev": true 654 | }, 655 | "fast-json-stable-stringify": { 656 | "version": "2.0.0", 657 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 658 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 659 | "dev": true 660 | }, 661 | "fast-levenshtein": { 662 | "version": "2.0.6", 663 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 664 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 665 | "dev": true 666 | }, 667 | "figures": { 668 | "version": "2.0.0", 669 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 670 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 671 | "dev": true, 672 | "requires": { 673 | "escape-string-regexp": "^1.0.5" 674 | } 675 | }, 676 | "file-entry-cache": { 677 | "version": "2.0.0", 678 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", 679 | "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", 680 | "dev": true, 681 | "requires": { 682 | "flat-cache": "^1.2.1", 683 | "object-assign": "^4.0.1" 684 | } 685 | }, 686 | "find-up": { 687 | "version": "1.1.2", 688 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", 689 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", 690 | "dev": true, 691 | "requires": { 692 | "path-exists": "^2.0.0", 693 | "pinkie-promise": "^2.0.0" 694 | } 695 | }, 696 | "flat-cache": { 697 | "version": "1.3.0", 698 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", 699 | "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", 700 | "dev": true, 701 | "requires": { 702 | "circular-json": "^0.3.1", 703 | "del": "^2.0.2", 704 | "graceful-fs": "^4.1.2", 705 | "write": "^0.2.1" 706 | } 707 | }, 708 | "foreach": { 709 | "version": "2.0.5", 710 | "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", 711 | "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", 712 | "dev": true 713 | }, 714 | "fs.realpath": { 715 | "version": "1.0.0", 716 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 717 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 718 | "dev": true 719 | }, 720 | "function-bind": { 721 | "version": "1.1.1", 722 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 723 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 724 | "dev": true 725 | }, 726 | "functional-red-black-tree": { 727 | "version": "1.0.1", 728 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 729 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 730 | "dev": true 731 | }, 732 | "glob": { 733 | "version": "7.1.2", 734 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 735 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 736 | "dev": true, 737 | "requires": { 738 | "fs.realpath": "^1.0.0", 739 | "inflight": "^1.0.4", 740 | "inherits": "2", 741 | "minimatch": "^3.0.4", 742 | "once": "^1.3.0", 743 | "path-is-absolute": "^1.0.0" 744 | } 745 | }, 746 | "globby": { 747 | "version": "5.0.0", 748 | "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", 749 | "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", 750 | "dev": true, 751 | "requires": { 752 | "array-union": "^1.0.1", 753 | "arrify": "^1.0.0", 754 | "glob": "^7.0.3", 755 | "object-assign": "^4.0.1", 756 | "pify": "^2.0.0", 757 | "pinkie-promise": "^2.0.0" 758 | } 759 | }, 760 | "graceful-fs": { 761 | "version": "4.1.11", 762 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 763 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 764 | "dev": true 765 | }, 766 | "has": { 767 | "version": "1.0.3", 768 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 769 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 770 | "dev": true, 771 | "requires": { 772 | "function-bind": "^1.1.1" 773 | } 774 | }, 775 | "has-ansi": { 776 | "version": "2.0.0", 777 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 778 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 779 | "dev": true, 780 | "requires": { 781 | "ansi-regex": "^2.0.0" 782 | } 783 | }, 784 | "has-flag": { 785 | "version": "3.0.0", 786 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 787 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 788 | "dev": true 789 | }, 790 | "has-symbols": { 791 | "version": "1.0.0", 792 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", 793 | "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", 794 | "dev": true 795 | }, 796 | "hosted-git-info": { 797 | "version": "2.7.1", 798 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", 799 | "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", 800 | "dev": true 801 | }, 802 | "iconv-lite": { 803 | "version": "0.4.23", 804 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 805 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 806 | "dev": true, 807 | "requires": { 808 | "safer-buffer": ">= 2.1.2 < 3" 809 | } 810 | }, 811 | "ieee754": { 812 | "version": "1.1.12", 813 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", 814 | "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==" 815 | }, 816 | "ignore": { 817 | "version": "3.3.10", 818 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", 819 | "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", 820 | "dev": true 821 | }, 822 | "imurmurhash": { 823 | "version": "0.1.4", 824 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 825 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 826 | "dev": true 827 | }, 828 | "inflight": { 829 | "version": "1.0.6", 830 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 831 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 832 | "dev": true, 833 | "requires": { 834 | "once": "^1.3.0", 835 | "wrappy": "1" 836 | } 837 | }, 838 | "inherits": { 839 | "version": "2.0.3", 840 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 841 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 842 | "dev": true 843 | }, 844 | "inquirer": { 845 | "version": "3.3.0", 846 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", 847 | "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", 848 | "dev": true, 849 | "requires": { 850 | "ansi-escapes": "^3.0.0", 851 | "chalk": "^2.0.0", 852 | "cli-cursor": "^2.1.0", 853 | "cli-width": "^2.0.0", 854 | "external-editor": "^2.0.4", 855 | "figures": "^2.0.0", 856 | "lodash": "^4.3.0", 857 | "mute-stream": "0.0.7", 858 | "run-async": "^2.2.0", 859 | "rx-lite": "^4.0.8", 860 | "rx-lite-aggregates": "^4.0.8", 861 | "string-width": "^2.1.0", 862 | "strip-ansi": "^4.0.0", 863 | "through": "^2.3.6" 864 | }, 865 | "dependencies": { 866 | "ansi-regex": { 867 | "version": "3.0.0", 868 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 869 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 870 | "dev": true 871 | }, 872 | "ansi-styles": { 873 | "version": "3.2.1", 874 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 875 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 876 | "dev": true, 877 | "requires": { 878 | "color-convert": "^1.9.0" 879 | } 880 | }, 881 | "chalk": { 882 | "version": "2.4.1", 883 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", 884 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", 885 | "dev": true, 886 | "requires": { 887 | "ansi-styles": "^3.2.1", 888 | "escape-string-regexp": "^1.0.5", 889 | "supports-color": "^5.3.0" 890 | } 891 | }, 892 | "strip-ansi": { 893 | "version": "4.0.0", 894 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 895 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 896 | "dev": true, 897 | "requires": { 898 | "ansi-regex": "^3.0.0" 899 | } 900 | }, 901 | "supports-color": { 902 | "version": "5.4.0", 903 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", 904 | "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", 905 | "dev": true, 906 | "requires": { 907 | "has-flag": "^3.0.0" 908 | } 909 | } 910 | } 911 | }, 912 | "is-arrayish": { 913 | "version": "0.2.1", 914 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 915 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 916 | "dev": true 917 | }, 918 | "is-builtin-module": { 919 | "version": "1.0.0", 920 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", 921 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", 922 | "dev": true, 923 | "requires": { 924 | "builtin-modules": "^1.0.0" 925 | } 926 | }, 927 | "is-callable": { 928 | "version": "1.1.4", 929 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", 930 | "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", 931 | "dev": true 932 | }, 933 | "is-date-object": { 934 | "version": "1.0.1", 935 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 936 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", 937 | "dev": true 938 | }, 939 | "is-fullwidth-code-point": { 940 | "version": "2.0.0", 941 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 942 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 943 | "dev": true 944 | }, 945 | "is-path-cwd": { 946 | "version": "1.0.0", 947 | "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", 948 | "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", 949 | "dev": true 950 | }, 951 | "is-path-in-cwd": { 952 | "version": "1.0.1", 953 | "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", 954 | "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", 955 | "dev": true, 956 | "requires": { 957 | "is-path-inside": "^1.0.0" 958 | } 959 | }, 960 | "is-path-inside": { 961 | "version": "1.0.1", 962 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", 963 | "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", 964 | "dev": true, 965 | "requires": { 966 | "path-is-inside": "^1.0.1" 967 | } 968 | }, 969 | "is-promise": { 970 | "version": "2.1.0", 971 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 972 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", 973 | "dev": true 974 | }, 975 | "is-regex": { 976 | "version": "1.0.4", 977 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 978 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 979 | "dev": true, 980 | "requires": { 981 | "has": "^1.0.1" 982 | } 983 | }, 984 | "is-resolvable": { 985 | "version": "1.1.0", 986 | "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", 987 | "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", 988 | "dev": true 989 | }, 990 | "is-symbol": { 991 | "version": "1.0.1", 992 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", 993 | "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", 994 | "dev": true 995 | }, 996 | "isarray": { 997 | "version": "1.0.0", 998 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 999 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1000 | }, 1001 | "isexe": { 1002 | "version": "2.0.0", 1003 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1004 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1005 | "dev": true 1006 | }, 1007 | "jmespath": { 1008 | "version": "0.15.0", 1009 | "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", 1010 | "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" 1011 | }, 1012 | "js-cookie": { 1013 | "version": "2.2.0", 1014 | "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.0.tgz", 1015 | "integrity": "sha1-Gywnmm7s44ChIWi5JIUmWzWx7/s=" 1016 | }, 1017 | "js-tokens": { 1018 | "version": "3.0.2", 1019 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 1020 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", 1021 | "dev": true 1022 | }, 1023 | "js-yaml": { 1024 | "version": "3.13.1", 1025 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 1026 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 1027 | "dev": true, 1028 | "requires": { 1029 | "argparse": "^1.0.7", 1030 | "esprima": "^4.0.0" 1031 | } 1032 | }, 1033 | "json-schema-traverse": { 1034 | "version": "0.3.1", 1035 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 1036 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", 1037 | "dev": true 1038 | }, 1039 | "json-stable-stringify-without-jsonify": { 1040 | "version": "1.0.1", 1041 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1042 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 1043 | "dev": true 1044 | }, 1045 | "levn": { 1046 | "version": "0.3.0", 1047 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1048 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1049 | "dev": true, 1050 | "requires": { 1051 | "prelude-ls": "~1.1.2", 1052 | "type-check": "~0.3.2" 1053 | } 1054 | }, 1055 | "load-json-file": { 1056 | "version": "2.0.0", 1057 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", 1058 | "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", 1059 | "dev": true, 1060 | "requires": { 1061 | "graceful-fs": "^4.1.2", 1062 | "parse-json": "^2.2.0", 1063 | "pify": "^2.0.0", 1064 | "strip-bom": "^3.0.0" 1065 | } 1066 | }, 1067 | "locate-path": { 1068 | "version": "2.0.0", 1069 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 1070 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 1071 | "dev": true, 1072 | "requires": { 1073 | "p-locate": "^2.0.0", 1074 | "path-exists": "^3.0.0" 1075 | }, 1076 | "dependencies": { 1077 | "path-exists": { 1078 | "version": "3.0.0", 1079 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1080 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 1081 | "dev": true 1082 | } 1083 | } 1084 | }, 1085 | "lodash": { 1086 | "version": "4.17.21", 1087 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1088 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 1089 | }, 1090 | "lru-cache": { 1091 | "version": "4.1.3", 1092 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", 1093 | "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", 1094 | "dev": true, 1095 | "requires": { 1096 | "pseudomap": "^1.0.2", 1097 | "yallist": "^2.1.2" 1098 | } 1099 | }, 1100 | "mimic-fn": { 1101 | "version": "1.2.0", 1102 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 1103 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", 1104 | "dev": true 1105 | }, 1106 | "minimatch": { 1107 | "version": "3.0.4", 1108 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1109 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1110 | "dev": true, 1111 | "requires": { 1112 | "brace-expansion": "^1.1.7" 1113 | } 1114 | }, 1115 | "minimist": { 1116 | "version": "0.0.8", 1117 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1118 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1119 | "dev": true 1120 | }, 1121 | "mkdirp": { 1122 | "version": "0.5.1", 1123 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1124 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1125 | "dev": true, 1126 | "requires": { 1127 | "minimist": "0.0.8" 1128 | } 1129 | }, 1130 | "ms": { 1131 | "version": "2.0.0", 1132 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1133 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 1134 | "dev": true 1135 | }, 1136 | "mute-stream": { 1137 | "version": "0.0.7", 1138 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 1139 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 1140 | "dev": true 1141 | }, 1142 | "natural-compare": { 1143 | "version": "1.4.0", 1144 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1145 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1146 | "dev": true 1147 | }, 1148 | "normalize-package-data": { 1149 | "version": "2.4.0", 1150 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", 1151 | "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", 1152 | "dev": true, 1153 | "requires": { 1154 | "hosted-git-info": "^2.1.4", 1155 | "is-builtin-module": "^1.0.0", 1156 | "semver": "2 || 3 || 4 || 5", 1157 | "validate-npm-package-license": "^3.0.1" 1158 | } 1159 | }, 1160 | "object-assign": { 1161 | "version": "4.1.1", 1162 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1163 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1164 | "dev": true 1165 | }, 1166 | "object-keys": { 1167 | "version": "1.0.12", 1168 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", 1169 | "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", 1170 | "dev": true 1171 | }, 1172 | "object.assign": { 1173 | "version": "4.1.0", 1174 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 1175 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 1176 | "dev": true, 1177 | "requires": { 1178 | "define-properties": "^1.1.2", 1179 | "function-bind": "^1.1.1", 1180 | "has-symbols": "^1.0.0", 1181 | "object-keys": "^1.0.11" 1182 | } 1183 | }, 1184 | "object.entries": { 1185 | "version": "1.0.4", 1186 | "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.0.4.tgz", 1187 | "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=", 1188 | "dev": true, 1189 | "requires": { 1190 | "define-properties": "^1.1.2", 1191 | "es-abstract": "^1.6.1", 1192 | "function-bind": "^1.1.0", 1193 | "has": "^1.0.1" 1194 | } 1195 | }, 1196 | "once": { 1197 | "version": "1.4.0", 1198 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1199 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1200 | "dev": true, 1201 | "requires": { 1202 | "wrappy": "1" 1203 | } 1204 | }, 1205 | "onetime": { 1206 | "version": "2.0.1", 1207 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 1208 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 1209 | "dev": true, 1210 | "requires": { 1211 | "mimic-fn": "^1.0.0" 1212 | } 1213 | }, 1214 | "optionator": { 1215 | "version": "0.8.2", 1216 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 1217 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 1218 | "dev": true, 1219 | "requires": { 1220 | "deep-is": "~0.1.3", 1221 | "fast-levenshtein": "~2.0.4", 1222 | "levn": "~0.3.0", 1223 | "prelude-ls": "~1.1.2", 1224 | "type-check": "~0.3.2", 1225 | "wordwrap": "~1.0.0" 1226 | } 1227 | }, 1228 | "os-tmpdir": { 1229 | "version": "1.0.2", 1230 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1231 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1232 | "dev": true 1233 | }, 1234 | "p-limit": { 1235 | "version": "1.3.0", 1236 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", 1237 | "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", 1238 | "dev": true, 1239 | "requires": { 1240 | "p-try": "^1.0.0" 1241 | } 1242 | }, 1243 | "p-locate": { 1244 | "version": "2.0.0", 1245 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 1246 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 1247 | "dev": true, 1248 | "requires": { 1249 | "p-limit": "^1.1.0" 1250 | } 1251 | }, 1252 | "p-try": { 1253 | "version": "1.0.0", 1254 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", 1255 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", 1256 | "dev": true 1257 | }, 1258 | "parse-json": { 1259 | "version": "2.2.0", 1260 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 1261 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 1262 | "dev": true, 1263 | "requires": { 1264 | "error-ex": "^1.2.0" 1265 | } 1266 | }, 1267 | "path-exists": { 1268 | "version": "2.1.0", 1269 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", 1270 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", 1271 | "dev": true, 1272 | "requires": { 1273 | "pinkie-promise": "^2.0.0" 1274 | } 1275 | }, 1276 | "path-is-absolute": { 1277 | "version": "1.0.1", 1278 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1279 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1280 | "dev": true 1281 | }, 1282 | "path-is-inside": { 1283 | "version": "1.0.2", 1284 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 1285 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 1286 | "dev": true 1287 | }, 1288 | "path-parse": { 1289 | "version": "1.0.5", 1290 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", 1291 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", 1292 | "dev": true 1293 | }, 1294 | "path-type": { 1295 | "version": "2.0.0", 1296 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", 1297 | "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", 1298 | "dev": true, 1299 | "requires": { 1300 | "pify": "^2.0.0" 1301 | } 1302 | }, 1303 | "pify": { 1304 | "version": "2.3.0", 1305 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1306 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 1307 | "dev": true 1308 | }, 1309 | "pinkie": { 1310 | "version": "2.0.4", 1311 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 1312 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 1313 | "dev": true 1314 | }, 1315 | "pinkie-promise": { 1316 | "version": "2.0.1", 1317 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 1318 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 1319 | "dev": true, 1320 | "requires": { 1321 | "pinkie": "^2.0.0" 1322 | } 1323 | }, 1324 | "pkg-dir": { 1325 | "version": "1.0.0", 1326 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", 1327 | "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", 1328 | "dev": true, 1329 | "requires": { 1330 | "find-up": "^1.0.0" 1331 | } 1332 | }, 1333 | "pluralize": { 1334 | "version": "7.0.0", 1335 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", 1336 | "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", 1337 | "dev": true 1338 | }, 1339 | "prelude-ls": { 1340 | "version": "1.1.2", 1341 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1342 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1343 | "dev": true 1344 | }, 1345 | "process-nextick-args": { 1346 | "version": "2.0.0", 1347 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 1348 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", 1349 | "dev": true 1350 | }, 1351 | "progress": { 1352 | "version": "2.0.0", 1353 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", 1354 | "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", 1355 | "dev": true 1356 | }, 1357 | "pseudomap": { 1358 | "version": "1.0.2", 1359 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 1360 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", 1361 | "dev": true 1362 | }, 1363 | "punycode": { 1364 | "version": "1.3.2", 1365 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 1366 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" 1367 | }, 1368 | "querystring": { 1369 | "version": "0.2.0", 1370 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 1371 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" 1372 | }, 1373 | "read-pkg": { 1374 | "version": "2.0.0", 1375 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", 1376 | "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", 1377 | "dev": true, 1378 | "requires": { 1379 | "load-json-file": "^2.0.0", 1380 | "normalize-package-data": "^2.3.2", 1381 | "path-type": "^2.0.0" 1382 | } 1383 | }, 1384 | "read-pkg-up": { 1385 | "version": "2.0.0", 1386 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", 1387 | "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", 1388 | "dev": true, 1389 | "requires": { 1390 | "find-up": "^2.0.0", 1391 | "read-pkg": "^2.0.0" 1392 | }, 1393 | "dependencies": { 1394 | "find-up": { 1395 | "version": "2.1.0", 1396 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 1397 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 1398 | "dev": true, 1399 | "requires": { 1400 | "locate-path": "^2.0.0" 1401 | } 1402 | } 1403 | } 1404 | }, 1405 | "readable-stream": { 1406 | "version": "2.3.6", 1407 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 1408 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 1409 | "dev": true, 1410 | "requires": { 1411 | "core-util-is": "~1.0.0", 1412 | "inherits": "~2.0.3", 1413 | "isarray": "~1.0.0", 1414 | "process-nextick-args": "~2.0.0", 1415 | "safe-buffer": "~5.1.1", 1416 | "string_decoder": "~1.1.1", 1417 | "util-deprecate": "~1.0.1" 1418 | } 1419 | }, 1420 | "regexpp": { 1421 | "version": "1.1.0", 1422 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", 1423 | "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", 1424 | "dev": true 1425 | }, 1426 | "require-uncached": { 1427 | "version": "1.0.3", 1428 | "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", 1429 | "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", 1430 | "dev": true, 1431 | "requires": { 1432 | "caller-path": "^0.1.0", 1433 | "resolve-from": "^1.0.0" 1434 | } 1435 | }, 1436 | "resolve": { 1437 | "version": "1.8.1", 1438 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", 1439 | "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", 1440 | "dev": true, 1441 | "requires": { 1442 | "path-parse": "^1.0.5" 1443 | } 1444 | }, 1445 | "resolve-from": { 1446 | "version": "1.0.1", 1447 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", 1448 | "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", 1449 | "dev": true 1450 | }, 1451 | "restore-cursor": { 1452 | "version": "2.0.0", 1453 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 1454 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 1455 | "dev": true, 1456 | "requires": { 1457 | "onetime": "^2.0.0", 1458 | "signal-exit": "^3.0.2" 1459 | } 1460 | }, 1461 | "rimraf": { 1462 | "version": "2.6.2", 1463 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", 1464 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", 1465 | "dev": true, 1466 | "requires": { 1467 | "glob": "^7.0.5" 1468 | } 1469 | }, 1470 | "run-async": { 1471 | "version": "2.3.0", 1472 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", 1473 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 1474 | "dev": true, 1475 | "requires": { 1476 | "is-promise": "^2.1.0" 1477 | } 1478 | }, 1479 | "rx-lite": { 1480 | "version": "4.0.8", 1481 | "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", 1482 | "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", 1483 | "dev": true 1484 | }, 1485 | "rx-lite-aggregates": { 1486 | "version": "4.0.8", 1487 | "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", 1488 | "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", 1489 | "dev": true, 1490 | "requires": { 1491 | "rx-lite": "*" 1492 | } 1493 | }, 1494 | "safe-buffer": { 1495 | "version": "5.1.2", 1496 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1497 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1498 | "dev": true 1499 | }, 1500 | "safer-buffer": { 1501 | "version": "2.1.2", 1502 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1503 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1504 | "dev": true 1505 | }, 1506 | "sax": { 1507 | "version": "1.2.1", 1508 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", 1509 | "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" 1510 | }, 1511 | "semver": { 1512 | "version": "5.5.0", 1513 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", 1514 | "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", 1515 | "dev": true 1516 | }, 1517 | "shebang-command": { 1518 | "version": "1.2.0", 1519 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1520 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1521 | "dev": true, 1522 | "requires": { 1523 | "shebang-regex": "^1.0.0" 1524 | } 1525 | }, 1526 | "shebang-regex": { 1527 | "version": "1.0.0", 1528 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1529 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1530 | "dev": true 1531 | }, 1532 | "signal-exit": { 1533 | "version": "3.0.2", 1534 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 1535 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 1536 | "dev": true 1537 | }, 1538 | "slice-ansi": { 1539 | "version": "1.0.0", 1540 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", 1541 | "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", 1542 | "dev": true, 1543 | "requires": { 1544 | "is-fullwidth-code-point": "^2.0.0" 1545 | } 1546 | }, 1547 | "spdx-correct": { 1548 | "version": "3.0.0", 1549 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", 1550 | "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", 1551 | "dev": true, 1552 | "requires": { 1553 | "spdx-expression-parse": "^3.0.0", 1554 | "spdx-license-ids": "^3.0.0" 1555 | } 1556 | }, 1557 | "spdx-exceptions": { 1558 | "version": "2.1.0", 1559 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", 1560 | "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", 1561 | "dev": true 1562 | }, 1563 | "spdx-expression-parse": { 1564 | "version": "3.0.0", 1565 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", 1566 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", 1567 | "dev": true, 1568 | "requires": { 1569 | "spdx-exceptions": "^2.1.0", 1570 | "spdx-license-ids": "^3.0.0" 1571 | } 1572 | }, 1573 | "spdx-license-ids": { 1574 | "version": "3.0.0", 1575 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", 1576 | "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", 1577 | "dev": true 1578 | }, 1579 | "sprintf-js": { 1580 | "version": "1.0.3", 1581 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1582 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1583 | "dev": true 1584 | }, 1585 | "string-width": { 1586 | "version": "2.1.1", 1587 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1588 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1589 | "dev": true, 1590 | "requires": { 1591 | "is-fullwidth-code-point": "^2.0.0", 1592 | "strip-ansi": "^4.0.0" 1593 | }, 1594 | "dependencies": { 1595 | "ansi-regex": { 1596 | "version": "3.0.0", 1597 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 1598 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 1599 | "dev": true 1600 | }, 1601 | "strip-ansi": { 1602 | "version": "4.0.0", 1603 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1604 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1605 | "dev": true, 1606 | "requires": { 1607 | "ansi-regex": "^3.0.0" 1608 | } 1609 | } 1610 | } 1611 | }, 1612 | "string_decoder": { 1613 | "version": "1.1.1", 1614 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1615 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1616 | "dev": true, 1617 | "requires": { 1618 | "safe-buffer": "~5.1.0" 1619 | } 1620 | }, 1621 | "strip-ansi": { 1622 | "version": "3.0.1", 1623 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1624 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1625 | "dev": true, 1626 | "requires": { 1627 | "ansi-regex": "^2.0.0" 1628 | } 1629 | }, 1630 | "strip-bom": { 1631 | "version": "3.0.0", 1632 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 1633 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 1634 | "dev": true 1635 | }, 1636 | "strip-json-comments": { 1637 | "version": "2.0.1", 1638 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1639 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 1640 | "dev": true 1641 | }, 1642 | "supports-color": { 1643 | "version": "2.0.0", 1644 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1645 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 1646 | "dev": true 1647 | }, 1648 | "table": { 1649 | "version": "4.0.2", 1650 | "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", 1651 | "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", 1652 | "dev": true, 1653 | "requires": { 1654 | "ajv": "^5.2.3", 1655 | "ajv-keywords": "^2.1.0", 1656 | "chalk": "^2.1.0", 1657 | "lodash": "^4.17.4", 1658 | "slice-ansi": "1.0.0", 1659 | "string-width": "^2.1.1" 1660 | }, 1661 | "dependencies": { 1662 | "ansi-styles": { 1663 | "version": "3.2.1", 1664 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 1665 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1666 | "dev": true, 1667 | "requires": { 1668 | "color-convert": "^1.9.0" 1669 | } 1670 | }, 1671 | "chalk": { 1672 | "version": "2.4.1", 1673 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", 1674 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", 1675 | "dev": true, 1676 | "requires": { 1677 | "ansi-styles": "^3.2.1", 1678 | "escape-string-regexp": "^1.0.5", 1679 | "supports-color": "^5.3.0" 1680 | } 1681 | }, 1682 | "supports-color": { 1683 | "version": "5.4.0", 1684 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", 1685 | "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", 1686 | "dev": true, 1687 | "requires": { 1688 | "has-flag": "^3.0.0" 1689 | } 1690 | } 1691 | } 1692 | }, 1693 | "text-table": { 1694 | "version": "0.2.0", 1695 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1696 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1697 | "dev": true 1698 | }, 1699 | "through": { 1700 | "version": "2.3.8", 1701 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1702 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1703 | "dev": true 1704 | }, 1705 | "tmp": { 1706 | "version": "0.0.33", 1707 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1708 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1709 | "dev": true, 1710 | "requires": { 1711 | "os-tmpdir": "~1.0.2" 1712 | } 1713 | }, 1714 | "type-check": { 1715 | "version": "0.3.2", 1716 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1717 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1718 | "dev": true, 1719 | "requires": { 1720 | "prelude-ls": "~1.1.2" 1721 | } 1722 | }, 1723 | "typedarray": { 1724 | "version": "0.0.6", 1725 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1726 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 1727 | "dev": true 1728 | }, 1729 | "url": { 1730 | "version": "0.10.3", 1731 | "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", 1732 | "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", 1733 | "requires": { 1734 | "punycode": "1.3.2", 1735 | "querystring": "0.2.0" 1736 | } 1737 | }, 1738 | "util-deprecate": { 1739 | "version": "1.0.2", 1740 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1741 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1742 | "dev": true 1743 | }, 1744 | "uuid": { 1745 | "version": "3.1.0", 1746 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", 1747 | "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" 1748 | }, 1749 | "validate-npm-package-license": { 1750 | "version": "3.0.3", 1751 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", 1752 | "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", 1753 | "dev": true, 1754 | "requires": { 1755 | "spdx-correct": "^3.0.0", 1756 | "spdx-expression-parse": "^3.0.0" 1757 | } 1758 | }, 1759 | "which": { 1760 | "version": "1.3.1", 1761 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1762 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1763 | "dev": true, 1764 | "requires": { 1765 | "isexe": "^2.0.0" 1766 | } 1767 | }, 1768 | "wordwrap": { 1769 | "version": "1.0.0", 1770 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 1771 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 1772 | "dev": true 1773 | }, 1774 | "wrappy": { 1775 | "version": "1.0.2", 1776 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1777 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1778 | "dev": true 1779 | }, 1780 | "write": { 1781 | "version": "0.2.1", 1782 | "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", 1783 | "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", 1784 | "dev": true, 1785 | "requires": { 1786 | "mkdirp": "^0.5.1" 1787 | } 1788 | }, 1789 | "xml2js": { 1790 | "version": "0.4.17", 1791 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.17.tgz", 1792 | "integrity": "sha1-F76T6q4/O3eTWceVtBlwWogX6Gg=", 1793 | "requires": { 1794 | "sax": ">=0.6.0", 1795 | "xmlbuilder": "^4.1.0" 1796 | } 1797 | }, 1798 | "xmlbuilder": { 1799 | "version": "4.2.1", 1800 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.2.1.tgz", 1801 | "integrity": "sha1-qlijBBoGb5DqoWwvU4n/GfP0YaU=", 1802 | "requires": { 1803 | "lodash": "^4.0.0" 1804 | } 1805 | }, 1806 | "yallist": { 1807 | "version": "2.1.2", 1808 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 1809 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", 1810 | "dev": true 1811 | } 1812 | } 1813 | } 1814 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cognito-user-pool", 3 | "version": "0.2.4", 4 | "description": "A simple Node.js library for managing users on Amazon Cognito User Pool", 5 | "main": "src/index.js", 6 | "scripts": { 7 | "test": "echo 'Sorry, no tests for now, but open to PRs :-)' && exit 0" 8 | }, 9 | "author": "François Falala-Sechet ", 10 | "license": "ISC", 11 | "dependencies": { 12 | "amazon-cognito-identity-js": "^1.31.0" 13 | }, 14 | "repository": { 15 | "type": "git", 16 | "url": "https://github.com/frsechet/cognito-user-pool" 17 | }, 18 | "devDependencies": { 19 | "eslint": "^4.19.1", 20 | "eslint-config-airbnb": "^17.0.0", 21 | "eslint-plugin-import": "^2.13.0" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Easily manage your users with AWS Cognito User Pools 2 | 3 | This library is a wrapper around the client library aws-cognito-identity-js to easily manage your Cognito User Pool in a node.js backend environment. 4 | 5 | ## Note 6 | 7 | This library was first developed when Cognito was still relatively new and complex to use from the backend. The situation improved greatly though, and it is probably better to use standard AWS SDKs now. 8 | 9 | However, if you are looking for something simple, you can use this. If you want to use the full power of Amazon Cognito, you should probably use the official AWS SDK. 10 | 11 | ## Usage 12 | 13 | At the root of your project, do: 14 | ``` 15 | npm install --save cognito-user-pool 16 | ``` 17 | 18 | Then in your project: 19 | ``` 20 | const poolData = { 21 | UserPoolId: USER_POOL_ID, // your user pool ID 22 | ClientId: USER_POOL_CLIENT_ID, // generated in the AWS console 23 | Paranoia: PARANOIA_LEVEL // an integer between 1 - 10 24 | }; 25 | const CognitoUserPoolWrapper = require('cognito-user-pool')(poolData); 26 | ``` 27 | 28 | ## Methods 29 | 30 | ### Signup 31 | 32 | Signup a new user: 33 | 34 | ``` 35 | CognitoUserPoolWrapper.signup(params, callback) 36 | ``` 37 | 38 | 39 | ``` 40 | params: { 41 | "username": "string", 42 | "password": "string", 43 | "attributes": [ 44 | { 45 | "Name": "string", 46 | "Value": "string" 47 | } 48 | ] 49 | } 50 | ``` 51 | 52 | ### Signup Confirmation 53 | 54 | Depending on your settings, email confirmation may be required. 55 | In that case, the following function must be called: 56 | 57 | ``` 58 | CognitoUserPoolWrapper.signupConfirm(params, callback) 59 | ``` 60 | 61 | ``` 62 | params: { 63 | "username": "string", 64 | "confirmationCode": "string" 65 | } 66 | ``` 67 | 68 | ### Resend Signup Confirmation Code 69 | 70 | If the user didn't receive the signup confirmation code, they may request a new code: 71 | 72 | ```CognitoUserPoolWrapper.signupResend(params, callback)``` 73 | 74 | ``` 75 | params: { 76 | "username": "string" 77 | } 78 | ``` 79 | 80 | ### Login 81 | 82 | Login an existing and confirmed user: 83 | 84 | ``` 85 | CognitoUserPoolWrapper.login(params, callback) 86 | ``` 87 | 88 | Note that `username` can be any alias field as defined in user pool settings. 89 | 90 | ``` 91 | params: { 92 | "username": "string", 93 | "password": "string" 94 | } 95 | ``` 96 | This function returns either authentication tokens (more on that later) or a custom challenge for continuing the authentication process. 97 | 98 | In that case, you get: 99 | ``` 100 | { 101 | "nextStep": "string", 102 | "loginSession": "string" 103 | } 104 | ``` 105 | 106 | With `nextStep` being either `MFA_AUTH` or `NEW_PASSWORD_REQUIRED`. 107 | `MFA_AUTH` means a SMS was sent to their cell phone with a code to add to the `loginMfa` method, while `NEW_PASSWORD_REQUIRED` means they need to reset their password in the next step with `loginNewPasswordRequired`. 108 | 109 | If authentication was successful, here is what you get: 110 | 111 | ``` 112 | { 113 | "refreshToken": "string", 114 | "accessToken": "string", 115 | "accessTokenExpiresAt": integer, 116 | "idToken": "string", 117 | "idTokenExpiresAt": integer 118 | } 119 | ``` 120 | Please read [https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html] for more information. 121 | 122 | You can use either `{ idToken, accessToken }` or `{ refreshToken }` to authenticate your user later on. For the sake of the example, we will use `{ idToken, accessToken }` in this readme, but both ways work interchangeably (and as a side note, it is better to use idToken + accessToken wherever possible). 123 | 124 | ### Login: MFA 125 | 126 | Using the information from the `login` method and the `mfaCode` received by SMS: 127 | 128 | ``` 129 | CognitoUserPoolWrapper.loginMfa(params, callback) 130 | ``` 131 | 132 | ``` 133 | params: { 134 | "username": "string", 135 | "loginSession": "string", 136 | "mfaCode": "string" 137 | } 138 | ``` 139 | 140 | ### Login: New Password Required 141 | 142 | Using the information from the `login` method: 143 | 144 | ``` 145 | CognitoUserPoolWrapper.loginNewPasswordRequired(params, callback) 146 | ``` 147 | 148 | ``` 149 | params: { 150 | "username": "string", 151 | "loginSession": "string", 152 | "newPassword": "string" 153 | } 154 | ``` 155 | 156 | ### Logout globally 157 | 158 | This method invalidates all issued tokens, and the user will be logged out everywhere. For a simple local logout, you should use a local invalidation of user tokens (clear cookies, etc.). 159 | 160 | ``` 161 | CognitoUserPoolWrapper.logout(params, callback) 162 | ``` 163 | 164 | ``` 165 | params: { 166 | "username": "string", 167 | "idToken": "string", 168 | "accessToken": "string" 169 | } 170 | ``` 171 | 172 | ### Refresh Session 173 | 174 | Generate new `refreshToken`, `idToken` and `accessToken` with a new expiry date. 175 | 176 | ``` 177 | CognitoUserPoolWrapper.refreshSession(params, callback) 178 | ``` 179 | 180 | ``` 181 | params: { 182 | "username": "string", 183 | "idToken": "string", 184 | "accessToken": "string" 185 | } 186 | ``` 187 | 188 | If successful, you retrieve 3 auth tokens and the associated expiration dates (same as login): 189 | 190 | ``` 191 | { 192 | "refreshToken": "string", 193 | "accessToken": "string", 194 | "accessTokenExpiresAt": integer, 195 | "idToken": "string", 196 | "idTokenExpiresAt": integer 197 | } 198 | ``` 199 | 200 | ### Get MFA status 201 | 202 | If MFA is enabled for this user, retrieve its options. Otherwise, returns `null`. 203 | 204 | ``` 205 | CognitoUserPoolWrapper.getMfa(params, callback) 206 | ``` 207 | 208 | ``` 209 | params: { 210 | "username": "string", 211 | "idToken": "string", 212 | "accessToken": "string" 213 | } 214 | ``` 215 | 216 | ### Enable or Disable MFA 217 | 218 | ``` 219 | CognitoUserPoolWrapper.setMfa(params, callback) 220 | ``` 221 | 222 | ``` 223 | params: { 224 | "enableMfa": boolean, 225 | "username": "string", 226 | "idToken": "string", 227 | "accessToken": "string" 228 | } 229 | ``` 230 | 231 | ### Get profile 232 | 233 | Retrieve all attributes associated with this user. 234 | 235 | ``` 236 | CognitoUserPoolWrapper.profile(params, callback) 237 | ``` 238 | 239 | ``` 240 | params: { 241 | "username": "string", 242 | "idToken": "string", 243 | "accessToken": "string" 244 | } 245 | ``` 246 | 247 | ### Edit profile 248 | 249 | Use this endpoint to edit all user attributes except `phone_number` (see below). 250 | 251 | ``` 252 | CognitoUserPoolWrapper.profileEdit(params, callback) 253 | ``` 254 | 255 | If the `Value` of an attribute is left empty, that attribute will be removed. 256 | 257 | ``` 258 | params: { 259 | "username": "string", 260 | "idToken": "string", 261 | "accessToken": "string", 262 | "attributes": [ 263 | { 264 | "Name": "string", 265 | "Value": "string" 266 | } 267 | ] 268 | } 269 | ``` 270 | 271 | ### Confirm/Verify profile attribute change 272 | 273 | Some attributes (such as `email`) need code verification after they have been updated by the user. Use this endpoint to verify that attribute. 274 | 275 | ``` 276 | CognitoUserPoolWrapper.profileAttributeConfirm(params, callback) 277 | ``` 278 | 279 | ``` 280 | params: { 281 | "username": "string", 282 | "idToken": "string", 283 | "accessToken": "string", 284 | "attribute": "string", 285 | "confirmationCode": "string" 286 | } 287 | ``` 288 | 289 | ### Edit phone number 290 | 291 | Use this endpoint to change the user's phone number. 292 | 293 | ``` 294 | CognitoUserPoolWrapper.profileEditPhoneNumber(params, callback) 295 | ``` 296 | 297 | If `phone_number` is undefined or null, it will be removed and MFA will be disabled for this user. 298 | 299 | ``` 300 | params: { 301 | "username": "string", 302 | "idToken": "string", 303 | "accessToken": "string", 304 | "phone_number: "string" 305 | } 306 | ``` 307 | 308 | ### Change password 309 | 310 | Use this endpoint to change the user's password. 311 | 312 | ``` 313 | CognitoUserPoolWrapper.passwordChange(params, callback) 314 | ``` 315 | 316 | ``` 317 | params: { 318 | "username": "string", 319 | "idToken": "string", 320 | "accessToken": "string", 321 | "oldPassword": "string", 322 | "newPassword: "string" 323 | } 324 | ``` 325 | 326 | ### Forgot password 327 | 328 | Start a forgot password flow. 329 | Cognito will send a `passwordResetCode` to one of the user's confirmed contact methods (email or SMS) to be used in the `passwordReset` method below. 330 | 331 | ``` 332 | CognitoUserPoolWrapper.passwordForgot(params, callback) 333 | ``` 334 | 335 | ``` 336 | params: { 337 | "username": "string" 338 | } 339 | ``` 340 | 341 | ### Reset password 342 | 343 | Finish the forgot password flow. 344 | 345 | ``` 346 | CognitoUserPoolWrapper.passwordReset(params, callback) 347 | ``` 348 | 349 | ``` 350 | params: { 351 | "username": "string", 352 | "passwordResetCode": "string", 353 | "newPassword": "string 354 | } 355 | ``` 356 | 357 | ### Error codes 358 | 359 | The error codes are the standard error codes as returned by AWS Cognito: `https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/CommonErrors.html` 360 | -------------------------------------------------------------------------------- /src/helpers/index.js: -------------------------------------------------------------------------------- 1 | const AmazonCognitoIdentity = require('amazon-cognito-identity-js'); 2 | 3 | /** 4 | * Get the current user session using either refreshToken if provided, or idToken and accessToken 5 | * 6 | * @param {*} cognitoUser 7 | * @param {*} { refreshToken, idToken, accessToken } 8 | * @returns {CognitoUser.signInUserSession} 9 | */ 10 | async function getUserSession(cognitoUser, { refreshToken, idToken, accessToken }) { 11 | let userSession = null; 12 | 13 | // always use refreshToken if it is provided 14 | if (refreshToken) { 15 | const RefreshToken = new AmazonCognitoIdentity.CognitoRefreshToken({ RefreshToken: refreshToken }); 16 | 17 | userSession = await new Promise((resolve, reject) => { 18 | cognitoUser.refreshSession(RefreshToken, (err, res) => { 19 | if (err) return reject(err); 20 | return resolve(res); 21 | }); 22 | }); 23 | } 24 | 25 | else { 26 | const IdToken = new AmazonCognitoIdentity.CognitoIdToken({ IdToken: idToken }); 27 | const AccessToken = new AmazonCognitoIdentity.CognitoAccessToken({ AccessToken: accessToken }); 28 | 29 | userSession = new AmazonCognitoIdentity.CognitoUserSession({ 30 | AccessToken, 31 | IdToken, 32 | }); 33 | } 34 | 35 | return userSession; 36 | } 37 | 38 | /** 39 | * Get the cognito user object data 40 | * 41 | * @param {*} poolData 42 | * @param {*} { username, idToken, accessToken, refreshToken } 43 | */ 44 | async function getCognitoUser(poolData, { username, idToken, accessToken, refreshToken }) { 45 | const Pool = new AmazonCognitoIdentity.CognitoUserPool(poolData); 46 | const cognitoUser = new AmazonCognitoIdentity.CognitoUser({ Username: username, Pool }); 47 | 48 | cognitoUser.signInUserSession = await getUserSession(cognitoUser, { refreshToken, idToken, accessToken }); 49 | return cognitoUser; 50 | } 51 | 52 | module.exports = { 53 | getUserSession, 54 | getCognitoUser, 55 | }; 56 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | const CognitoItentityMethods = require('./methods'); 2 | 3 | class CognitoIdentityWrapper { 4 | constructor(poolData) { 5 | this.poolData = poolData || null; 6 | return this; 7 | } 8 | 9 | login(body, cb) { 10 | return CognitoItentityMethods.login(this.poolData, body, cb); 11 | } 12 | 13 | signup(body, cb) { 14 | return CognitoItentityMethods.signup(this.poolData, body, cb); 15 | } 16 | 17 | signupConfirm(body, cb) { 18 | return CognitoItentityMethods.signupConfirm(this.poolData, body, cb); 19 | } 20 | 21 | signupResend(body, cb) { 22 | return CognitoItentityMethods.signupResend(this.poolData, body, cb); 23 | } 24 | 25 | loginMfa(body, cb) { 26 | return CognitoItentityMethods.loginMfa(this.poolData, body, cb); 27 | } 28 | 29 | loginNewPasswordRequired(body, cb) { 30 | return CognitoItentityMethods.loginNewPasswordRequired(this.poolData, body, cb); 31 | } 32 | 33 | logout(body, cb) { 34 | return CognitoItentityMethods.logout(this.poolData, body, cb); 35 | } 36 | 37 | passwordForgot(body, cb) { 38 | return CognitoItentityMethods.passwordForgot(this.poolData, body, cb); 39 | } 40 | 41 | passwordReset(body, cb) { 42 | return CognitoItentityMethods.passwordReset(this.poolData, body, cb); 43 | } 44 | 45 | passwordChange(body, cb) { 46 | return CognitoItentityMethods.passwordChange(this.poolData, body, cb); 47 | } 48 | 49 | profile(body, cb) { 50 | return CognitoItentityMethods.profile(this.poolData, body, cb); 51 | } 52 | 53 | profileEdit(body, cb) { 54 | return CognitoItentityMethods.profileEdit(this.poolData, body, cb); 55 | } 56 | 57 | profileEditPhoneNumber(body, cb) { 58 | return CognitoItentityMethods.profileEditPhoneNumber(this.poolData, body, cb); 59 | } 60 | 61 | profileAttributeConfirm(body, cb) { 62 | return CognitoItentityMethods.profileAttributeConfirm(this.poolData, body, cb); 63 | } 64 | 65 | setMfa(body, cb) { 66 | return CognitoItentityMethods.setMfa(this.poolData, body, cb); 67 | } 68 | 69 | getMfa(body, cb) { 70 | return CognitoItentityMethods.getMfa(this.poolData, body, cb); 71 | } 72 | 73 | refreshSession(body, cb) { 74 | return CognitoItentityMethods.refreshSession(this.poolData, body, cb); 75 | } 76 | } 77 | 78 | module.exports = function Wrapper(poolData) { 79 | return new CognitoIdentityWrapper(poolData); 80 | }; 81 | -------------------------------------------------------------------------------- /src/methods/getMfa.js: -------------------------------------------------------------------------------- 1 | const Helpers = require('../helpers'); 2 | 3 | /** 4 | * Return the user's MFA status 5 | * 6 | * @param {poolData} poolData 7 | * @param {{username, refreshToken, accessToken, idToken}} body 8 | * @param {*} cb 9 | */ 10 | async function getMFA(poolData, body, cb) { 11 | try { 12 | const cognitoUser = await Helpers.getCognitoUser(poolData, body); 13 | 14 | // when MFA is off, res is undefined. We want to cast it as null instead. 15 | cognitoUser.getMFAOptions((err, res) => cb(err, res || null)); 16 | } 17 | catch (err) { 18 | cb(err); 19 | } 20 | 21 | } 22 | 23 | module.exports = getMFA; 24 | -------------------------------------------------------------------------------- /src/methods/index.js: -------------------------------------------------------------------------------- 1 | const getMfa = require('./getMfa.js'); 2 | const login = require('./login.js'); 3 | const loginMfa = require('./loginMfa.js'); 4 | const loginNewPasswordRequired = require('./loginNewPasswordRequired.js'); 5 | const logout = require('./logout.js'); 6 | const passwordChange = require('./passwordChange.js'); 7 | const passwordForgot = require('./passwordForgot.js'); 8 | const passwordReset = require('./passwordReset.js'); 9 | const profile = require('./profile.js'); 10 | const profileEdit = require('./profileEdit.js'); 11 | const profileEditPhoneNumber = require('./profileEditPhoneNumber.js'); 12 | const profileAttributeConfirm = require('./profileAttributeConfirm.js'); 13 | const refreshSession = require('./refreshSession.js'); 14 | const setMfa = require('./setMfa.js'); 15 | const signup = require('./signup.js'); 16 | const signupConfirm = require('./signupConfirm.js'); 17 | const signupResend = require('./signupResend.js'); 18 | 19 | module.exports = { 20 | getMfa, 21 | login, 22 | loginMfa, 23 | loginNewPasswordRequired, 24 | logout, 25 | passwordChange, 26 | passwordForgot, 27 | passwordReset, 28 | profile, 29 | profileEdit, 30 | profileEditPhoneNumber, 31 | profileAttributeConfirm, 32 | refreshSession, 33 | setMfa, 34 | signup, 35 | signupConfirm, 36 | signupResend 37 | }; 38 | -------------------------------------------------------------------------------- /src/methods/login.js: -------------------------------------------------------------------------------- 1 | const AmazonCognitoIdentity = require('amazon-cognito-identity-js'); 2 | 3 | /** 4 | * Login user 5 | * 6 | * @param {*} poolData 7 | * @param {{username, password}} body 8 | * @param {*} cb 9 | */ 10 | function login(poolData, body, cb) { 11 | 12 | const userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData); 13 | 14 | const { username, password } = body; 15 | 16 | const authenticationData = { 17 | Username: username, 18 | Password: password, 19 | }; 20 | const authenticationDetails = new AmazonCognitoIdentity.AuthenticationDetails(authenticationData); 21 | const userData = { 22 | Username: username, 23 | Pool: userPool, 24 | }; 25 | 26 | const cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData); 27 | 28 | cognitoUser.authenticateUser(authenticationDetails, { 29 | onSuccess(res) { 30 | const data = { 31 | refreshToken: res.getRefreshToken().getToken(), 32 | accessToken: res.getAccessToken().getJwtToken(), 33 | accessTokenExpiresAt: res.getAccessToken().getExpiration(), 34 | idToken: res.getIdToken().getJwtToken(), 35 | idTokenExpiresAt: res.getAccessToken().getExpiration(), 36 | }; 37 | cb(null, data); 38 | }, 39 | onFailure(err) { 40 | cb(err); 41 | }, 42 | mfaRequired() { 43 | const data = { 44 | nextStep: 'MFA_AUTH', 45 | loginSession: cognitoUser.Session, 46 | }; 47 | cb(null, data); 48 | }, 49 | newPasswordRequired() { 50 | const data = { 51 | nextStep: 'NEW_PASSWORD_REQUIRED', 52 | loginSession: cognitoUser.Session, 53 | }; 54 | cb(null, data); 55 | }, 56 | }); 57 | 58 | } 59 | 60 | module.exports = login; 61 | -------------------------------------------------------------------------------- /src/methods/loginMfa.js: -------------------------------------------------------------------------------- 1 | const AmazonCognitoIdentity = require('amazon-cognito-identity-js'); 2 | 3 | /** 4 | * Login 2nd step for users with MFA enabled 5 | * 6 | * @param {*} poolData 7 | * @param {{ username, mfaCode, loginSession }} body 8 | * @param {*} cb 9 | */ 10 | function loginMfa(poolData, body, cb) { 11 | 12 | const userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData); 13 | 14 | const { username, mfaCode, loginSession } = body; 15 | 16 | const userData = { 17 | Username: username, 18 | Pool: userPool, 19 | }; 20 | const cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData); 21 | 22 | // update cognitoUser Session with the Session of the MFA request 23 | cognitoUser.Session = loginSession; 24 | 25 | cognitoUser.sendMFACode(mfaCode, { 26 | 27 | onSuccess(result) { 28 | const data = { 29 | refreshToken: result.getRefreshToken().getToken(), 30 | accessToken: result.getAccessToken().getJwtToken(), 31 | accessTokenExpiresAt: result.getAccessToken().getExpiration(), 32 | idToken: result.getIdToken().getJwtToken(), 33 | idTokenExpiresAt: result.getAccessToken().getExpiration(), 34 | }; 35 | cb(null, data); 36 | }, 37 | onFailure(err) { 38 | cb(err); 39 | }, 40 | }); 41 | 42 | } 43 | 44 | module.exports = loginMfa; 45 | -------------------------------------------------------------------------------- /src/methods/loginNewPasswordRequired.js: -------------------------------------------------------------------------------- 1 | const AmazonCognitoIdentity = require('amazon-cognito-identity-js'); 2 | 3 | /** 4 | * Login user after they set a new password, if a new password is required 5 | * 6 | * @param {*} poolData 7 | * @param {{ username, loginSession, newPassword }} body 8 | * @param {*} cb 9 | */ 10 | function loginNewPasswordRequired(poolData, body, cb) { 11 | 12 | const userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData); 13 | 14 | const { username, loginSession, newPassword } = body; 15 | 16 | const userData = { 17 | Username: username, 18 | Pool: userPool, 19 | }; 20 | const cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData); 21 | 22 | // update cognitoUser Session with the Session of the NEW_PASSWORD_REQUIRED request 23 | cognitoUser.Session = loginSession; 24 | 25 | cognitoUser.completeNewPasswordChallenge(newPassword, body.attributes, { 26 | onSuccess(result) { 27 | const data = { 28 | refreshToken: result.getRefreshToken().getToken(), 29 | accessToken: result.getAccessToken().getJwtToken(), 30 | accessTokenExpiresAt: result.getAccessToken().getExpiration(), 31 | idToken: result.getIdToken().getJwtToken(), 32 | idTokenExpiresAt: result.getAccessToken().getExpiration(), 33 | }; 34 | cb(null, data); 35 | }, 36 | onFailure(err) { 37 | cb(err); 38 | }, 39 | mfaRequired() { 40 | const data = { 41 | nextStep: 'MFA_AUTH', 42 | loginSession: cognitoUser.Session, 43 | }; 44 | cb(null, data); 45 | }, 46 | }); 47 | 48 | } 49 | module.exports = loginNewPasswordRequired; 50 | -------------------------------------------------------------------------------- /src/methods/logout.js: -------------------------------------------------------------------------------- 1 | const Helpers = require('../helpers'); 2 | 3 | /** 4 | * Logout a user from all their sessions 5 | * 6 | * @param {*} poolData 7 | * @param {*} body 8 | * @param {*} cb 9 | */ 10 | async function logout(poolData, body, cb) { 11 | 12 | try { 13 | const cognitoUser = await Helpers.getCognitoUser(poolData, body); 14 | cognitoUser.globalSignOut({ 15 | onFailure(err2) { 16 | cb(err2); 17 | }, 18 | onSuccess(data) { 19 | cb(null, data); 20 | }, 21 | }); 22 | 23 | } 24 | catch (err) { 25 | cb(err); 26 | } 27 | 28 | } 29 | 30 | module.exports = logout; 31 | -------------------------------------------------------------------------------- /src/methods/passwordChange.js: -------------------------------------------------------------------------------- 1 | const Helpers = require('../helpers'); 2 | 3 | /** 4 | * Update a user's password 5 | * 6 | * @param {poolData} poolData 7 | * @param {{username, refreshToken, accessToken, idToken}} body 8 | * @param {*} cb 9 | */ 10 | async function changePassword(poolData, body, cb) { 11 | try { 12 | const { oldPassword, newPassword } = body; 13 | const cognitoUser = await Helpers.getCognitoUser(poolData, body); 14 | 15 | cognitoUser.changePassword(oldPassword, newPassword, (err, res) => cb(err, res)); 16 | } 17 | catch (err) { 18 | cb(err); 19 | } 20 | 21 | } 22 | 23 | module.exports = changePassword; 24 | -------------------------------------------------------------------------------- /src/methods/passwordForgot.js: -------------------------------------------------------------------------------- 1 | const AmazonCognitoIdentity = require('amazon-cognito-identity-js'); 2 | 3 | /** 4 | * Initiate forgot password flow 5 | * 6 | * @param {*} poolData 7 | * @param {{username}} body 8 | * @param {*} cb 9 | */ 10 | async function forgotPassword(poolData, body, cb) { 11 | 12 | const userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData); 13 | 14 | const { username } = body; 15 | 16 | const userData = { 17 | Username: username, 18 | Pool: userPool, 19 | }; 20 | 21 | const cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData); 22 | 23 | cognitoUser.forgotPassword({ 24 | onFailure(err) { 25 | cb(err); 26 | }, 27 | inputVerificationCode(res) { 28 | cb(null, res); 29 | }, 30 | }); 31 | 32 | } 33 | 34 | module.exports = forgotPassword; 35 | -------------------------------------------------------------------------------- /src/methods/passwordReset.js: -------------------------------------------------------------------------------- 1 | const AmazonCognitoIdentity = require('amazon-cognito-identity-js'); 2 | 3 | /** 4 | * Finish forgot password flow 5 | * 6 | * @param {*} poolData 7 | * @param {{ username, passwordResetCode, newPassword }} body 8 | * @param {*} cb 9 | */ 10 | function resetPassword(poolData, body, cb) { 11 | 12 | const userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData); 13 | 14 | const { username, passwordResetCode, newPassword } = body; 15 | 16 | const userData = { 17 | Username: username, 18 | Pool: userPool, 19 | }; 20 | 21 | const cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData); 22 | 23 | cognitoUser.confirmPassword(passwordResetCode, newPassword, { 24 | onSuccess(res) { 25 | cb(null, res || 'SUCCESS'); 26 | }, 27 | onFailure(err) { 28 | cb(err); 29 | }, 30 | }); 31 | 32 | } 33 | 34 | module.exports = resetPassword; 35 | -------------------------------------------------------------------------------- /src/methods/profile.js: -------------------------------------------------------------------------------- 1 | const Helpers = require('../helpers'); 2 | 3 | /** 4 | * Return the user's profile attributes 5 | * 6 | * @param {poolData} poolData 7 | * @param {{username, refreshToken, accessToken, idToken}} body 8 | * @param {*} cb 9 | */ 10 | async function profile(poolData, body, cb) { 11 | try { 12 | const cognitoUser = await Helpers.getCognitoUser(poolData, body); 13 | 14 | cognitoUser.getUserAttributes((err, res) => cb(err, res)); 15 | } 16 | catch (err) { 17 | cb(err); 18 | } 19 | 20 | } 21 | 22 | module.exports = profile; 23 | -------------------------------------------------------------------------------- /src/methods/profileAttributeConfirm.js: -------------------------------------------------------------------------------- 1 | const Helpers = require('../helpers'); 2 | 3 | /** 4 | * Confirm user's attribute (such as email) using a confirmation code 5 | * 6 | * @param {*} poolData 7 | * @param {{attribute, username, confirmationCode, refreshToken, accessToken, idToken}} body 8 | * @param {*} cb 9 | */ 10 | async function profileAttributeConfirm(poolData, body, cb) { 11 | try { 12 | const { attribute, confirmationCode } = body; 13 | const cognitoUser = await Helpers.getCognitoUser(poolData, body); 14 | 15 | cognitoUser.verifyAttribute(attribute, confirmationCode, { 16 | onSuccess(result) { 17 | cb(null, result); 18 | }, 19 | onFailure(err) { 20 | cb(err); 21 | } 22 | }); 23 | } catch (err) { 24 | cb(err); 25 | } 26 | } 27 | 28 | module.exports = profileAttributeConfirm; 29 | -------------------------------------------------------------------------------- /src/methods/profileEdit.js: -------------------------------------------------------------------------------- 1 | const AmazonCognitoIdentity = require('amazon-cognito-identity-js'); 2 | const Helpers = require('../helpers'); 3 | 4 | /** 5 | * Edit a user's profile 6 | * 7 | * @param {poolData} poolData 8 | * @param {{username, refreshToken, accessToken, idToken, attributes}} body 9 | * @param {*} cb 10 | */ 11 | async function editProfile(poolData, body, cb) { 12 | try { 13 | const { attributes } = body; 14 | const cognitoUser = await Helpers.getCognitoUser(poolData, body); 15 | 16 | const attributeUpdateList = []; 17 | const attributeDeleteList = []; 18 | 19 | if (Array.isArray(attributes)) { 20 | attributes.forEach((item) => { 21 | 22 | // if the attribute concerns the phone number 23 | if (item.Name === 'phone_number') { 24 | // do nothing, rather use profileEditPhoneNumber 25 | // as there are some additionals checks concerning MFA to perform 26 | } 27 | 28 | // if the attribute has a value, update it with the new value 29 | else if (item.Value !== null) { 30 | const attribute = new AmazonCognitoIdentity.CognitoUserAttribute(item); 31 | attributeUpdateList.push(attribute); 32 | } 33 | 34 | // otherwise, delete the attribute for that user 35 | else { 36 | attributeDeleteList.push(item.Name); 37 | } 38 | }); 39 | } 40 | 41 | // first, update requested attributes 42 | await new Promise((resolve, reject) => { 43 | cognitoUser.updateAttributes(attributeUpdateList, (err) => { 44 | if (err) return reject(err); 45 | return resolve(); 46 | }); 47 | }); 48 | 49 | // then, delete requested attributes 50 | const data = await new Promise((resolve, reject) => { 51 | cognitoUser.deleteAttributes(attributeDeleteList, (err, res) => { 52 | if (err) return reject(err); 53 | return resolve(res); 54 | }); 55 | }); 56 | 57 | cb(null, data); 58 | } 59 | catch (err) { 60 | cb(err); 61 | } 62 | } 63 | module.exports = editProfile; 64 | -------------------------------------------------------------------------------- /src/methods/profileEditPhoneNumber.js: -------------------------------------------------------------------------------- 1 | const AmazonCognitoIdentity = require('amazon-cognito-identity-js'); 2 | const Helpers = require('../helpers'); 3 | 4 | 5 | /** 6 | * Edit a user's phone number 7 | * 8 | * @param {poolData} poolData 9 | * @param {{username, refreshToken, accessToken, idToken}} body 10 | * @param {*} cb 11 | */ 12 | async function editPhoneNumber(poolData, body, cb) { 13 | try { 14 | const cognitoUser = await Helpers.getCognitoUser(poolData, body); 15 | const { phone_number } = body; 16 | 17 | // the user simply wants to add or change their phone number (required for MFA) 18 | if (phone_number) { 19 | const dataPhoneNumber = { 20 | Name: 'phone_number', 21 | Value: phone_number, 22 | }; 23 | const attributePhoneNumber = new AmazonCognitoIdentity.CognitoUserAttribute(dataPhoneNumber); 24 | cognitoUser.updateAttributes([attributePhoneNumber], (err, res) => cb(err, res)); 25 | } 26 | 27 | else { 28 | // if the user wants to delete their phone number we must first disable MFA 29 | await new Promise((resolve, reject) => { 30 | cognitoUser.disableMFA((err) => { 31 | if (err) return reject(err); 32 | return resolve(); 33 | }); 34 | }); 35 | cognitoUser.deleteAttributes(['phone_number'], (err, res) => cb(err, res)); 36 | } 37 | 38 | } 39 | catch (err) { 40 | cb(err); 41 | } 42 | 43 | } 44 | 45 | module.exports = editPhoneNumber; 46 | -------------------------------------------------------------------------------- /src/methods/refreshSession.js: -------------------------------------------------------------------------------- 1 | const AmazonCognitoIdentity = require('amazon-cognito-identity-js'); 2 | 3 | /** 4 | * Refresh a user's session (retrieve refreshed tokens) 5 | * 6 | * @param {*} poolData 7 | * @param {{username, refreshToken}} body 8 | * @param {*} cb 9 | */ 10 | async function refreshSession(poolData, body, cb) { 11 | 12 | const userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData); 13 | 14 | const { username } = body; 15 | const refreshToken = new AmazonCognitoIdentity.CognitoRefreshToken({ RefreshToken: body.refreshToken }); 16 | 17 | const userData = { 18 | Username: username, 19 | Pool: userPool, 20 | }; 21 | 22 | const cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData); 23 | 24 | cognitoUser.refreshSession(refreshToken, (err, res) => { 25 | if (err) return cb(err); 26 | 27 | const data = { 28 | refreshToken: res.getRefreshToken().getToken(), 29 | accessToken: res.getAccessToken().getJwtToken(), 30 | accessTokenExpiresAt: res.getAccessToken().getExpiration(), 31 | idToken: res.getIdToken().getJwtToken(), 32 | idTokenExpiresAt: res.getAccessToken().getExpiration(), 33 | }; 34 | cb(null, data); 35 | }); 36 | 37 | } 38 | 39 | module.exports = refreshSession; 40 | -------------------------------------------------------------------------------- /src/methods/setMfa.js: -------------------------------------------------------------------------------- 1 | const Helpers = require('../helpers'); 2 | 3 | /** 4 | * Return the user's MFA status (must have a phone_number set) 5 | * 6 | * @param {poolData} poolData 7 | * @param {{username, refreshToken, accessToken, idToken}} body 8 | * @param {*} cb 9 | */ 10 | async function setMfa(poolData, body, cb) { 11 | try { 12 | const { enableMfa = false } = body; 13 | const cognitoUser = await Helpers.getCognitoUser(poolData, body); 14 | 15 | if (enableMfa === true) { 16 | cognitoUser.enableMFA((err, res) => cb(err, res)); 17 | } 18 | else { 19 | cognitoUser.disableMFA((err, res) => cb(err, res)); 20 | } 21 | } 22 | catch (err) { 23 | cb(err); 24 | } 25 | 26 | } 27 | 28 | module.exports = setMfa; 29 | -------------------------------------------------------------------------------- /src/methods/signup.js: -------------------------------------------------------------------------------- 1 | const AmazonCognitoIdentity = require('amazon-cognito-identity-js'); 2 | 3 | /** 4 | * Signup user 5 | * 6 | * @param {poolData} poolData 7 | * @param {{ username: string, password: string, attributes: attributesModel }} body 8 | * @param {*} cb 9 | */ 10 | function signup(poolData, body, cb) { 11 | 12 | const userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData); 13 | 14 | const { username, password, attributes } = body; 15 | 16 | const attributesList = []; 17 | 18 | if (Array.isArray(attributes)) { 19 | attributesList.push(...attributes.map(item => new AmazonCognitoIdentity.CognitoUserAttribute(item))); 20 | } 21 | 22 | userPool.signUp(username, password, attributesList, null, (err, res) => { 23 | if (err) return cb(err); 24 | 25 | const cognitoUser = res.user; 26 | const data = { 27 | username: cognitoUser.getUsername(), 28 | }; 29 | cb(null, data); 30 | }); 31 | 32 | } 33 | 34 | module.exports = signup; 35 | -------------------------------------------------------------------------------- /src/methods/signupConfirm.js: -------------------------------------------------------------------------------- 1 | const AmazonCognitoIdentity = require('amazon-cognito-identity-js'); 2 | 3 | /** 4 | * Confirm the signup action 5 | * 6 | * @param {*} poolData 7 | * @param {{username, confirmationCode}} body 8 | * @param {*} cb 9 | */ 10 | function signupConfirm(poolData, body, cb) { 11 | 12 | const userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData); 13 | 14 | const { username, confirmationCode } = body; 15 | 16 | const userData = { 17 | Username: username, 18 | Pool: userPool, 19 | }; 20 | 21 | const cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData); 22 | 23 | cognitoUser.confirmRegistration(confirmationCode, true, (err, res) => cb(err, res)); 24 | 25 | } 26 | 27 | module.exports = signupConfirm; 28 | -------------------------------------------------------------------------------- /src/methods/signupResend.js: -------------------------------------------------------------------------------- 1 | const AmazonCognitoIdentity = require('amazon-cognito-identity-js'); 2 | 3 | /** 4 | * Resend the signup confirmation code 5 | * 6 | * @param {*} poolData 7 | * @param {{username}} body 8 | * @param {*} cb 9 | */ 10 | function signupResend(poolData, body, cb) { 11 | 12 | const userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData); 13 | 14 | const { username } = body; 15 | 16 | const userData = { 17 | Username: username, 18 | Pool: userPool, 19 | }; 20 | 21 | const cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData); 22 | 23 | cognitoUser.resendConfirmationCode((err, res) => cb(err, res)); 24 | 25 | } 26 | 27 | module.exports = signupResend; 28 | --------------------------------------------------------------------------------