├── .editorconfig ├── .env.example ├── .eslintrc.json ├── .gitignore ├── LICENSE ├── README.md ├── docker-compose.yml ├── package-lock.json ├── package.json ├── src ├── auth │ ├── authenticate.auth.js │ ├── confs.js │ ├── strategies │ │ └── JWT.js │ └── token.auth.js ├── handlers │ ├── login.handler.js │ ├── logout.handler.js │ └── users.handler.js ├── index.js ├── models │ └── users.model.js ├── repositories │ ├── cache.repository.js │ └── users.repository.js ├── routes │ ├── auth.route.js │ ├── index.js │ └── users.route.js ├── schemas │ ├── login.schema.js │ └── users.schema.js ├── server.js ├── services │ ├── mongo.service.js │ └── redis.service.js └── utils │ ├── errorTypes.js │ └── hash.js └── tests └── unit └── routes └── users.route.test.js /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | charset = utf-8 7 | trim_trailing_whitespace = true 8 | insert_final_newline = true -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | MONGO_HOST=mongo 2 | MONGO_PORT=27017 3 | MONGO_DATABASE=eadapi 4 | MONGO_USER=ead_api_user 5 | MONGO_PASSWORD=ead_api_user 6 | SECRET_KEY= 7 | HOST=0.0.0.0 8 | PORT=3000 9 | REDIS_PORT=6379 10 | REDIS_HOST=redis -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "airbnb-base" 3 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .dbcache 3 | .env -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2019 Ayrton Teshima 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Plataforma EAD - Programador a Bordo 2 | 3 | API RESTFul da plataforma de ensino a distância. Projeto em Node/JS seguindo boas práticas e de fácil integração. 4 | 5 | ## Dependências 6 | * Node 14.3 e NPM (apenas se desejar rodar fora do container) 7 | * Docker 8 | * Docker Compose 9 | 10 | ## Configurando e rodando local 11 | Renomeie o arquivo `.env.example` para `.env`, gere uma SECRET_KEY e adicione o valor a variável `SECRET_KEY` no arquivo. 12 | Para rodar local, você pode por qualquer valor no SECRET_KEY ou gerar uma de forma mais segura com o comando: 13 | ``` 14 | node -e "console.log(require('crypto').randomBytes(256).toString('base64'));" 15 | ``` 16 | ### Rode os containers 17 | ``` 18 | docker-compose up -d 19 | ``` 20 | 21 | ### Configure o MongoDB 22 | Para rodar o projeto local, é necessário criar o usuário do banco de dados `eadapi` que utilizamos no sistema. 23 | Acesse o container docker do mongo pelo terminal: 24 | ``` 25 | docker exec -it eadapi-mongo /bin/bash 26 | ``` 27 | 28 | Axecute o seguinte comando dentro do container: 29 | 30 | ``` 31 | mongo -uroot -pexample <= 2.1.2 < 3" 2296 | } 2297 | }, 2298 | "ignore": { 2299 | "version": "5.1.6", 2300 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.6.tgz", 2301 | "integrity": "sha512-cgXgkypZBcCnOgSihyeqbo6gjIaIyDqPQB7Ra4vhE9m6kigdGoQDMHjviFhRZo3IMlRy6yElosoviMs5YxZXUA==", 2302 | "dev": true 2303 | }, 2304 | "ignore-by-default": { 2305 | "version": "1.0.1", 2306 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 2307 | "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", 2308 | "dev": true 2309 | }, 2310 | "import-fresh": { 2311 | "version": "3.2.1", 2312 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", 2313 | "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", 2314 | "dev": true, 2315 | "requires": { 2316 | "parent-module": "^1.0.0", 2317 | "resolve-from": "^4.0.0" 2318 | }, 2319 | "dependencies": { 2320 | "resolve-from": { 2321 | "version": "4.0.0", 2322 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 2323 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 2324 | "dev": true 2325 | } 2326 | } 2327 | }, 2328 | "import-lazy": { 2329 | "version": "2.1.0", 2330 | "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", 2331 | "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", 2332 | "dev": true 2333 | }, 2334 | "import-local": { 2335 | "version": "3.0.2", 2336 | "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", 2337 | "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", 2338 | "dev": true, 2339 | "requires": { 2340 | "pkg-dir": "^4.2.0", 2341 | "resolve-cwd": "^3.0.0" 2342 | } 2343 | }, 2344 | "imurmurhash": { 2345 | "version": "0.1.4", 2346 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 2347 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 2348 | "dev": true 2349 | }, 2350 | "indent-string": { 2351 | "version": "4.0.0", 2352 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", 2353 | "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", 2354 | "dev": true 2355 | }, 2356 | "inflight": { 2357 | "version": "1.0.6", 2358 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 2359 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 2360 | "dev": true, 2361 | "requires": { 2362 | "once": "^1.3.0", 2363 | "wrappy": "1" 2364 | } 2365 | }, 2366 | "inherits": { 2367 | "version": "2.0.4", 2368 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 2369 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 2370 | }, 2371 | "ini": { 2372 | "version": "1.3.5", 2373 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 2374 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", 2375 | "dev": true 2376 | }, 2377 | "inquirer": { 2378 | "version": "7.1.0", 2379 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", 2380 | "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", 2381 | "dev": true, 2382 | "requires": { 2383 | "ansi-escapes": "^4.2.1", 2384 | "chalk": "^3.0.0", 2385 | "cli-cursor": "^3.1.0", 2386 | "cli-width": "^2.0.0", 2387 | "external-editor": "^3.0.3", 2388 | "figures": "^3.0.0", 2389 | "lodash": "^4.17.15", 2390 | "mute-stream": "0.0.8", 2391 | "run-async": "^2.4.0", 2392 | "rxjs": "^6.5.3", 2393 | "string-width": "^4.1.0", 2394 | "strip-ansi": "^6.0.0", 2395 | "through": "^2.3.6" 2396 | }, 2397 | "dependencies": { 2398 | "chalk": { 2399 | "version": "3.0.0", 2400 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", 2401 | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", 2402 | "dev": true, 2403 | "requires": { 2404 | "ansi-styles": "^4.1.0", 2405 | "supports-color": "^7.1.0" 2406 | } 2407 | }, 2408 | "strip-ansi": { 2409 | "version": "6.0.0", 2410 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 2411 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 2412 | "dev": true, 2413 | "requires": { 2414 | "ansi-regex": "^5.0.0" 2415 | } 2416 | } 2417 | } 2418 | }, 2419 | "ioredis": { 2420 | "version": "4.17.1", 2421 | "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-4.17.1.tgz", 2422 | "integrity": "sha512-kfxkN/YO1dnyaoAGyNdH3my4A1eoGDy4QOfqn6o86fo4dTboxyxYVW0S0v/d3MkwCWlvSWhlwq6IJMY9BlWs6w==", 2423 | "requires": { 2424 | "cluster-key-slot": "^1.1.0", 2425 | "debug": "^4.1.1", 2426 | "denque": "^1.1.0", 2427 | "lodash.defaults": "^4.2.0", 2428 | "lodash.flatten": "^4.4.0", 2429 | "redis-commands": "1.5.0", 2430 | "redis-errors": "^1.2.0", 2431 | "redis-parser": "^3.0.0", 2432 | "standard-as-callback": "^2.0.1" 2433 | } 2434 | }, 2435 | "irregular-plurals": { 2436 | "version": "3.2.0", 2437 | "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.2.0.tgz", 2438 | "integrity": "sha512-YqTdPLfwP7YFN0SsD3QUVCkm9ZG2VzOXv3DOrw5G5mkMbVwptTwVcFv7/C0vOpBmgTxAeTG19XpUs1E522LW9Q==", 2439 | "dev": true 2440 | }, 2441 | "is-arrayish": { 2442 | "version": "0.2.1", 2443 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 2444 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 2445 | "dev": true 2446 | }, 2447 | "is-binary-path": { 2448 | "version": "2.1.0", 2449 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 2450 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 2451 | "dev": true, 2452 | "requires": { 2453 | "binary-extensions": "^2.0.0" 2454 | } 2455 | }, 2456 | "is-callable": { 2457 | "version": "1.1.5", 2458 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", 2459 | "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", 2460 | "dev": true 2461 | }, 2462 | "is-ci": { 2463 | "version": "2.0.0", 2464 | "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", 2465 | "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", 2466 | "dev": true, 2467 | "requires": { 2468 | "ci-info": "^2.0.0" 2469 | } 2470 | }, 2471 | "is-date-object": { 2472 | "version": "1.0.2", 2473 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", 2474 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", 2475 | "dev": true 2476 | }, 2477 | "is-error": { 2478 | "version": "2.2.2", 2479 | "resolved": "https://registry.npmjs.org/is-error/-/is-error-2.2.2.tgz", 2480 | "integrity": "sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==", 2481 | "dev": true 2482 | }, 2483 | "is-extglob": { 2484 | "version": "2.1.1", 2485 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 2486 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 2487 | "dev": true 2488 | }, 2489 | "is-fullwidth-code-point": { 2490 | "version": "3.0.0", 2491 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 2492 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 2493 | "dev": true 2494 | }, 2495 | "is-glob": { 2496 | "version": "4.0.1", 2497 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 2498 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 2499 | "dev": true, 2500 | "requires": { 2501 | "is-extglob": "^2.1.1" 2502 | } 2503 | }, 2504 | "is-interactive": { 2505 | "version": "1.0.0", 2506 | "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", 2507 | "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", 2508 | "dev": true 2509 | }, 2510 | "is-npm": { 2511 | "version": "4.0.0", 2512 | "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", 2513 | "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", 2514 | "dev": true 2515 | }, 2516 | "is-number": { 2517 | "version": "7.0.0", 2518 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 2519 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2520 | "dev": true 2521 | }, 2522 | "is-obj": { 2523 | "version": "2.0.0", 2524 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", 2525 | "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", 2526 | "dev": true 2527 | }, 2528 | "is-path-cwd": { 2529 | "version": "2.2.0", 2530 | "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", 2531 | "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", 2532 | "dev": true 2533 | }, 2534 | "is-path-inside": { 2535 | "version": "3.0.2", 2536 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", 2537 | "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", 2538 | "dev": true 2539 | }, 2540 | "is-plain-object": { 2541 | "version": "3.0.0", 2542 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.0.tgz", 2543 | "integrity": "sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==", 2544 | "dev": true, 2545 | "requires": { 2546 | "isobject": "^4.0.0" 2547 | } 2548 | }, 2549 | "is-promise": { 2550 | "version": "4.0.0", 2551 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", 2552 | "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", 2553 | "dev": true 2554 | }, 2555 | "is-regex": { 2556 | "version": "1.0.5", 2557 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", 2558 | "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", 2559 | "dev": true, 2560 | "requires": { 2561 | "has": "^1.0.3" 2562 | } 2563 | }, 2564 | "is-string": { 2565 | "version": "1.0.5", 2566 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", 2567 | "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", 2568 | "dev": true 2569 | }, 2570 | "is-symbol": { 2571 | "version": "1.0.3", 2572 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 2573 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 2574 | "dev": true, 2575 | "requires": { 2576 | "has-symbols": "^1.0.1" 2577 | } 2578 | }, 2579 | "is-typedarray": { 2580 | "version": "1.0.0", 2581 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 2582 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 2583 | "dev": true 2584 | }, 2585 | "is-yarn-global": { 2586 | "version": "0.3.0", 2587 | "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", 2588 | "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", 2589 | "dev": true 2590 | }, 2591 | "isarray": { 2592 | "version": "1.0.0", 2593 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 2594 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 2595 | }, 2596 | "isexe": { 2597 | "version": "2.0.0", 2598 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 2599 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 2600 | "dev": true 2601 | }, 2602 | "isobject": { 2603 | "version": "4.0.0", 2604 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", 2605 | "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", 2606 | "dev": true 2607 | }, 2608 | "js-string-escape": { 2609 | "version": "1.0.1", 2610 | "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", 2611 | "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=", 2612 | "dev": true 2613 | }, 2614 | "js-tokens": { 2615 | "version": "4.0.0", 2616 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 2617 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 2618 | "dev": true 2619 | }, 2620 | "js-yaml": { 2621 | "version": "3.14.0", 2622 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", 2623 | "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", 2624 | "dev": true, 2625 | "requires": { 2626 | "argparse": "^1.0.7", 2627 | "esprima": "^4.0.0" 2628 | } 2629 | }, 2630 | "json-buffer": { 2631 | "version": "3.0.0", 2632 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", 2633 | "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", 2634 | "dev": true 2635 | }, 2636 | "json-parse-better-errors": { 2637 | "version": "1.0.2", 2638 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 2639 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", 2640 | "dev": true 2641 | }, 2642 | "json-schema-traverse": { 2643 | "version": "0.4.1", 2644 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 2645 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 2646 | "dev": true 2647 | }, 2648 | "json-stable-stringify-without-jsonify": { 2649 | "version": "1.0.1", 2650 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 2651 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 2652 | "dev": true 2653 | }, 2654 | "jsonwebtoken": { 2655 | "version": "8.5.1", 2656 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", 2657 | "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", 2658 | "requires": { 2659 | "jws": "^3.2.2", 2660 | "lodash.includes": "^4.3.0", 2661 | "lodash.isboolean": "^3.0.3", 2662 | "lodash.isinteger": "^4.0.4", 2663 | "lodash.isnumber": "^3.0.3", 2664 | "lodash.isplainobject": "^4.0.6", 2665 | "lodash.isstring": "^4.0.1", 2666 | "lodash.once": "^4.0.0", 2667 | "ms": "^2.1.1", 2668 | "semver": "^5.6.0" 2669 | } 2670 | }, 2671 | "just-extend": { 2672 | "version": "4.1.0", 2673 | "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.0.tgz", 2674 | "integrity": "sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==", 2675 | "dev": true 2676 | }, 2677 | "jwa": { 2678 | "version": "1.4.1", 2679 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", 2680 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", 2681 | "requires": { 2682 | "buffer-equal-constant-time": "1.0.1", 2683 | "ecdsa-sig-formatter": "1.0.11", 2684 | "safe-buffer": "^5.0.1" 2685 | } 2686 | }, 2687 | "jws": { 2688 | "version": "3.2.2", 2689 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", 2690 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 2691 | "requires": { 2692 | "jwa": "^1.4.1", 2693 | "safe-buffer": "^5.0.1" 2694 | } 2695 | }, 2696 | "kareem": { 2697 | "version": "2.3.1", 2698 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz", 2699 | "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw==" 2700 | }, 2701 | "keyv": { 2702 | "version": "3.1.0", 2703 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", 2704 | "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", 2705 | "dev": true, 2706 | "requires": { 2707 | "json-buffer": "3.0.0" 2708 | } 2709 | }, 2710 | "latest-version": { 2711 | "version": "5.1.0", 2712 | "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", 2713 | "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", 2714 | "dev": true, 2715 | "requires": { 2716 | "package-json": "^6.3.0" 2717 | } 2718 | }, 2719 | "levn": { 2720 | "version": "0.4.1", 2721 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 2722 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 2723 | "dev": true, 2724 | "requires": { 2725 | "prelude-ls": "^1.2.1", 2726 | "type-check": "~0.4.0" 2727 | } 2728 | }, 2729 | "lines-and-columns": { 2730 | "version": "1.1.6", 2731 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", 2732 | "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", 2733 | "dev": true 2734 | }, 2735 | "load-json-file": { 2736 | "version": "5.3.0", 2737 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", 2738 | "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", 2739 | "dev": true, 2740 | "requires": { 2741 | "graceful-fs": "^4.1.15", 2742 | "parse-json": "^4.0.0", 2743 | "pify": "^4.0.1", 2744 | "strip-bom": "^3.0.0", 2745 | "type-fest": "^0.3.0" 2746 | } 2747 | }, 2748 | "locate-path": { 2749 | "version": "5.0.0", 2750 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 2751 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 2752 | "dev": true, 2753 | "requires": { 2754 | "p-locate": "^4.1.0" 2755 | } 2756 | }, 2757 | "lodash": { 2758 | "version": "4.17.15", 2759 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 2760 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", 2761 | "dev": true 2762 | }, 2763 | "lodash.clonedeep": { 2764 | "version": "4.5.0", 2765 | "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", 2766 | "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", 2767 | "dev": true 2768 | }, 2769 | "lodash.defaults": { 2770 | "version": "4.2.0", 2771 | "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", 2772 | "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" 2773 | }, 2774 | "lodash.flatten": { 2775 | "version": "4.4.0", 2776 | "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", 2777 | "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" 2778 | }, 2779 | "lodash.flattendeep": { 2780 | "version": "4.4.0", 2781 | "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", 2782 | "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", 2783 | "dev": true 2784 | }, 2785 | "lodash.get": { 2786 | "version": "4.4.2", 2787 | "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", 2788 | "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", 2789 | "dev": true 2790 | }, 2791 | "lodash.includes": { 2792 | "version": "4.3.0", 2793 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 2794 | "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" 2795 | }, 2796 | "lodash.isboolean": { 2797 | "version": "3.0.3", 2798 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 2799 | "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" 2800 | }, 2801 | "lodash.isinteger": { 2802 | "version": "4.0.4", 2803 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 2804 | "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" 2805 | }, 2806 | "lodash.islength": { 2807 | "version": "4.0.1", 2808 | "resolved": "https://registry.npmjs.org/lodash.islength/-/lodash.islength-4.0.1.tgz", 2809 | "integrity": "sha1-Tpho1FJXXXUK/9NYyXlUPcIO1Xc=", 2810 | "dev": true 2811 | }, 2812 | "lodash.isnumber": { 2813 | "version": "3.0.3", 2814 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 2815 | "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" 2816 | }, 2817 | "lodash.isplainobject": { 2818 | "version": "4.0.6", 2819 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 2820 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" 2821 | }, 2822 | "lodash.isstring": { 2823 | "version": "4.0.1", 2824 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 2825 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" 2826 | }, 2827 | "lodash.merge": { 2828 | "version": "4.6.2", 2829 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 2830 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 2831 | "dev": true 2832 | }, 2833 | "lodash.once": { 2834 | "version": "4.1.1", 2835 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 2836 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" 2837 | }, 2838 | "log-symbols": { 2839 | "version": "3.0.0", 2840 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", 2841 | "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", 2842 | "dev": true, 2843 | "requires": { 2844 | "chalk": "^2.4.2" 2845 | } 2846 | }, 2847 | "lowercase-keys": { 2848 | "version": "1.0.1", 2849 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", 2850 | "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", 2851 | "dev": true 2852 | }, 2853 | "make-dir": { 2854 | "version": "3.1.0", 2855 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 2856 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 2857 | "dev": true, 2858 | "requires": { 2859 | "semver": "^6.0.0" 2860 | }, 2861 | "dependencies": { 2862 | "semver": { 2863 | "version": "6.3.0", 2864 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 2865 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 2866 | "dev": true 2867 | } 2868 | } 2869 | }, 2870 | "map-age-cleaner": { 2871 | "version": "0.1.3", 2872 | "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", 2873 | "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", 2874 | "dev": true, 2875 | "requires": { 2876 | "p-defer": "^1.0.0" 2877 | } 2878 | }, 2879 | "matcher": { 2880 | "version": "3.0.0", 2881 | "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", 2882 | "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", 2883 | "dev": true, 2884 | "requires": { 2885 | "escape-string-regexp": "^4.0.0" 2886 | }, 2887 | "dependencies": { 2888 | "escape-string-regexp": { 2889 | "version": "4.0.0", 2890 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 2891 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 2892 | "dev": true 2893 | } 2894 | } 2895 | }, 2896 | "md5-hex": { 2897 | "version": "3.0.1", 2898 | "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz", 2899 | "integrity": "sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==", 2900 | "dev": true, 2901 | "requires": { 2902 | "blueimp-md5": "^2.10.0" 2903 | } 2904 | }, 2905 | "md5-o-matic": { 2906 | "version": "0.1.1", 2907 | "resolved": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz", 2908 | "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=", 2909 | "dev": true 2910 | }, 2911 | "mem": { 2912 | "version": "6.1.0", 2913 | "resolved": "https://registry.npmjs.org/mem/-/mem-6.1.0.tgz", 2914 | "integrity": "sha512-RlbnLQgRHk5lwqTtpEkBTQ2ll/CG/iB+J4Hy2Wh97PjgZgXgWJWrFF+XXujh3UUVLvR4OOTgZzcWMMwnehlEUg==", 2915 | "dev": true, 2916 | "requires": { 2917 | "map-age-cleaner": "^0.1.3", 2918 | "mimic-fn": "^3.0.0" 2919 | }, 2920 | "dependencies": { 2921 | "mimic-fn": { 2922 | "version": "3.0.0", 2923 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.0.0.tgz", 2924 | "integrity": "sha512-PiVO95TKvhiwgSwg1IdLYlCTdul38yZxZMIcnDSFIBUm4BNZha2qpQ4GpJ++15bHoKDtrW2D69lMfFwdFYtNZQ==", 2925 | "dev": true 2926 | } 2927 | } 2928 | }, 2929 | "memory-pager": { 2930 | "version": "1.5.0", 2931 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", 2932 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", 2933 | "optional": true 2934 | }, 2935 | "merge2": { 2936 | "version": "1.3.0", 2937 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", 2938 | "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==", 2939 | "dev": true 2940 | }, 2941 | "micromatch": { 2942 | "version": "4.0.2", 2943 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", 2944 | "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", 2945 | "dev": true, 2946 | "requires": { 2947 | "braces": "^3.0.1", 2948 | "picomatch": "^2.0.5" 2949 | } 2950 | }, 2951 | "mime-db": { 2952 | "version": "1.44.0", 2953 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 2954 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" 2955 | }, 2956 | "mimic-fn": { 2957 | "version": "2.1.0", 2958 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 2959 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 2960 | "dev": true 2961 | }, 2962 | "mimic-response": { 2963 | "version": "1.0.1", 2964 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 2965 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", 2966 | "dev": true 2967 | }, 2968 | "minimatch": { 2969 | "version": "3.0.4", 2970 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 2971 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 2972 | "dev": true, 2973 | "requires": { 2974 | "brace-expansion": "^1.1.7" 2975 | } 2976 | }, 2977 | "minimist": { 2978 | "version": "1.2.5", 2979 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 2980 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 2981 | "dev": true 2982 | }, 2983 | "mkdirp": { 2984 | "version": "0.5.5", 2985 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 2986 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 2987 | "dev": true, 2988 | "requires": { 2989 | "minimist": "^1.2.5" 2990 | } 2991 | }, 2992 | "mongodb": { 2993 | "version": "3.5.7", 2994 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.5.7.tgz", 2995 | "integrity": "sha512-lMtleRT+vIgY/JhhTn1nyGwnSMmJkJELp+4ZbrjctrnBxuLbj6rmLuJFz8W2xUzUqWmqoyVxJLYuC58ZKpcTYQ==", 2996 | "requires": { 2997 | "bl": "^2.2.0", 2998 | "bson": "^1.1.4", 2999 | "denque": "^1.4.1", 3000 | "require_optional": "^1.0.1", 3001 | "safe-buffer": "^5.1.2", 3002 | "saslprep": "^1.0.0" 3003 | } 3004 | }, 3005 | "mongoose": { 3006 | "version": "5.9.16", 3007 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.9.16.tgz", 3008 | "integrity": "sha512-b4HNndgh+dacoLE/2SBF3iBBofeaKL+aGVZH7jnPRc2RXRCplX4sfH5sgoz03ryCSXJ+RQNIfqKAADt/ZBzPDA==", 3009 | "requires": { 3010 | "bson": "^1.1.4", 3011 | "kareem": "2.3.1", 3012 | "mongodb": "3.5.7", 3013 | "mongoose-legacy-pluralize": "1.0.2", 3014 | "mpath": "0.7.0", 3015 | "mquery": "3.2.2", 3016 | "ms": "2.1.2", 3017 | "regexp-clone": "1.0.0", 3018 | "safe-buffer": "5.1.2", 3019 | "sift": "7.0.1", 3020 | "sliced": "1.0.1" 3021 | }, 3022 | "dependencies": { 3023 | "ms": { 3024 | "version": "2.1.2", 3025 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 3026 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 3027 | } 3028 | } 3029 | }, 3030 | "mongoose-legacy-pluralize": { 3031 | "version": "1.0.2", 3032 | "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", 3033 | "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" 3034 | }, 3035 | "mpath": { 3036 | "version": "0.7.0", 3037 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.7.0.tgz", 3038 | "integrity": "sha512-Aiq04hILxhz1L+f7sjGyn7IxYzWm1zLNNXcfhDtx04kZ2Gk7uvFdgZ8ts1cWa/6d0TQmag2yR8zSGZUmp0tFNg==" 3039 | }, 3040 | "mquery": { 3041 | "version": "3.2.2", 3042 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.2.tgz", 3043 | "integrity": "sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q==", 3044 | "requires": { 3045 | "bluebird": "3.5.1", 3046 | "debug": "3.1.0", 3047 | "regexp-clone": "^1.0.0", 3048 | "safe-buffer": "5.1.2", 3049 | "sliced": "1.0.1" 3050 | }, 3051 | "dependencies": { 3052 | "bluebird": { 3053 | "version": "3.5.1", 3054 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", 3055 | "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" 3056 | }, 3057 | "debug": { 3058 | "version": "3.1.0", 3059 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 3060 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 3061 | "requires": { 3062 | "ms": "2.0.0" 3063 | } 3064 | }, 3065 | "ms": { 3066 | "version": "2.0.0", 3067 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 3068 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 3069 | } 3070 | } 3071 | }, 3072 | "ms": { 3073 | "version": "2.1.1", 3074 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 3075 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 3076 | }, 3077 | "mute-stream": { 3078 | "version": "0.0.8", 3079 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 3080 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", 3081 | "dev": true 3082 | }, 3083 | "natural-compare": { 3084 | "version": "1.4.0", 3085 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 3086 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 3087 | "dev": true 3088 | }, 3089 | "nise": { 3090 | "version": "4.0.3", 3091 | "resolved": "https://registry.npmjs.org/nise/-/nise-4.0.3.tgz", 3092 | "integrity": "sha512-EGlhjm7/4KvmmE6B/UFsKh7eHykRl9VH+au8dduHLCyWUO/hr7+N+WtTvDUwc9zHuM1IaIJs/0lQ6Ag1jDkQSg==", 3093 | "dev": true, 3094 | "requires": { 3095 | "@sinonjs/commons": "^1.7.0", 3096 | "@sinonjs/fake-timers": "^6.0.0", 3097 | "@sinonjs/text-encoding": "^0.7.1", 3098 | "just-extend": "^4.0.2", 3099 | "path-to-regexp": "^1.7.0" 3100 | } 3101 | }, 3102 | "nodemon": { 3103 | "version": "2.0.4", 3104 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.4.tgz", 3105 | "integrity": "sha512-Ltced+hIfTmaS28Zjv1BM552oQ3dbwPqI4+zI0SLgq+wpJhSyqgYude/aZa/3i31VCQWMfXJVxvu86abcam3uQ==", 3106 | "dev": true, 3107 | "requires": { 3108 | "chokidar": "^3.2.2", 3109 | "debug": "^3.2.6", 3110 | "ignore-by-default": "^1.0.1", 3111 | "minimatch": "^3.0.4", 3112 | "pstree.remy": "^1.1.7", 3113 | "semver": "^5.7.1", 3114 | "supports-color": "^5.5.0", 3115 | "touch": "^3.1.0", 3116 | "undefsafe": "^2.0.2", 3117 | "update-notifier": "^4.0.0" 3118 | }, 3119 | "dependencies": { 3120 | "debug": { 3121 | "version": "3.2.6", 3122 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 3123 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 3124 | "dev": true, 3125 | "requires": { 3126 | "ms": "^2.1.1" 3127 | } 3128 | }, 3129 | "semver": { 3130 | "version": "5.7.1", 3131 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 3132 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 3133 | "dev": true 3134 | }, 3135 | "supports-color": { 3136 | "version": "5.5.0", 3137 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 3138 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 3139 | "dev": true, 3140 | "requires": { 3141 | "has-flag": "^3.0.0" 3142 | } 3143 | } 3144 | } 3145 | }, 3146 | "nopt": { 3147 | "version": "1.0.10", 3148 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 3149 | "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", 3150 | "dev": true, 3151 | "requires": { 3152 | "abbrev": "1" 3153 | } 3154 | }, 3155 | "normalize-package-data": { 3156 | "version": "2.5.0", 3157 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 3158 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 3159 | "dev": true, 3160 | "requires": { 3161 | "hosted-git-info": "^2.1.4", 3162 | "resolve": "^1.10.0", 3163 | "semver": "2 || 3 || 4 || 5", 3164 | "validate-npm-package-license": "^3.0.1" 3165 | } 3166 | }, 3167 | "normalize-path": { 3168 | "version": "3.0.0", 3169 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 3170 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 3171 | "dev": true 3172 | }, 3173 | "normalize-url": { 3174 | "version": "4.5.0", 3175 | "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", 3176 | "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", 3177 | "dev": true 3178 | }, 3179 | "object-inspect": { 3180 | "version": "1.7.0", 3181 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", 3182 | "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", 3183 | "dev": true 3184 | }, 3185 | "object-keys": { 3186 | "version": "1.1.1", 3187 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 3188 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 3189 | "dev": true 3190 | }, 3191 | "object.assign": { 3192 | "version": "4.1.0", 3193 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 3194 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 3195 | "dev": true, 3196 | "requires": { 3197 | "define-properties": "^1.1.2", 3198 | "function-bind": "^1.1.1", 3199 | "has-symbols": "^1.0.0", 3200 | "object-keys": "^1.0.11" 3201 | } 3202 | }, 3203 | "object.entries": { 3204 | "version": "1.1.2", 3205 | "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz", 3206 | "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==", 3207 | "dev": true, 3208 | "requires": { 3209 | "define-properties": "^1.1.3", 3210 | "es-abstract": "^1.17.5", 3211 | "has": "^1.0.3" 3212 | } 3213 | }, 3214 | "object.values": { 3215 | "version": "1.1.1", 3216 | "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", 3217 | "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", 3218 | "dev": true, 3219 | "requires": { 3220 | "define-properties": "^1.1.3", 3221 | "es-abstract": "^1.17.0-next.1", 3222 | "function-bind": "^1.1.1", 3223 | "has": "^1.0.3" 3224 | } 3225 | }, 3226 | "once": { 3227 | "version": "1.4.0", 3228 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 3229 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 3230 | "dev": true, 3231 | "requires": { 3232 | "wrappy": "1" 3233 | } 3234 | }, 3235 | "onetime": { 3236 | "version": "5.1.0", 3237 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", 3238 | "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", 3239 | "dev": true, 3240 | "requires": { 3241 | "mimic-fn": "^2.1.0" 3242 | } 3243 | }, 3244 | "optionator": { 3245 | "version": "0.9.1", 3246 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 3247 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 3248 | "dev": true, 3249 | "requires": { 3250 | "deep-is": "^0.1.3", 3251 | "fast-levenshtein": "^2.0.6", 3252 | "levn": "^0.4.1", 3253 | "prelude-ls": "^1.2.1", 3254 | "type-check": "^0.4.0", 3255 | "word-wrap": "^1.2.3" 3256 | } 3257 | }, 3258 | "ora": { 3259 | "version": "4.0.4", 3260 | "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.4.tgz", 3261 | "integrity": "sha512-77iGeVU1cIdRhgFzCK8aw1fbtT1B/iZAvWjS+l/o1x0RShMgxHUZaD2yDpWsNCPwXg9z1ZA78Kbdvr8kBmG/Ww==", 3262 | "dev": true, 3263 | "requires": { 3264 | "chalk": "^3.0.0", 3265 | "cli-cursor": "^3.1.0", 3266 | "cli-spinners": "^2.2.0", 3267 | "is-interactive": "^1.0.0", 3268 | "log-symbols": "^3.0.0", 3269 | "mute-stream": "0.0.8", 3270 | "strip-ansi": "^6.0.0", 3271 | "wcwidth": "^1.0.1" 3272 | }, 3273 | "dependencies": { 3274 | "chalk": { 3275 | "version": "3.0.0", 3276 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", 3277 | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", 3278 | "dev": true, 3279 | "requires": { 3280 | "ansi-styles": "^4.1.0", 3281 | "supports-color": "^7.1.0" 3282 | } 3283 | }, 3284 | "mute-stream": { 3285 | "version": "0.0.8", 3286 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 3287 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", 3288 | "dev": true 3289 | }, 3290 | "strip-ansi": { 3291 | "version": "6.0.0", 3292 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 3293 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 3294 | "dev": true, 3295 | "requires": { 3296 | "ansi-regex": "^5.0.0" 3297 | } 3298 | } 3299 | } 3300 | }, 3301 | "os-tmpdir": { 3302 | "version": "1.0.2", 3303 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 3304 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 3305 | "dev": true 3306 | }, 3307 | "p-cancelable": { 3308 | "version": "1.1.0", 3309 | "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", 3310 | "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", 3311 | "dev": true 3312 | }, 3313 | "p-defer": { 3314 | "version": "1.0.0", 3315 | "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", 3316 | "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", 3317 | "dev": true 3318 | }, 3319 | "p-limit": { 3320 | "version": "2.3.0", 3321 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 3322 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 3323 | "dev": true, 3324 | "requires": { 3325 | "p-try": "^2.0.0" 3326 | } 3327 | }, 3328 | "p-locate": { 3329 | "version": "4.1.0", 3330 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 3331 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 3332 | "dev": true, 3333 | "requires": { 3334 | "p-limit": "^2.2.0" 3335 | } 3336 | }, 3337 | "p-map": { 3338 | "version": "4.0.0", 3339 | "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", 3340 | "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", 3341 | "dev": true, 3342 | "requires": { 3343 | "aggregate-error": "^3.0.0" 3344 | } 3345 | }, 3346 | "p-try": { 3347 | "version": "2.2.0", 3348 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 3349 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 3350 | "dev": true 3351 | }, 3352 | "package-json": { 3353 | "version": "6.5.0", 3354 | "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", 3355 | "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", 3356 | "dev": true, 3357 | "requires": { 3358 | "got": "^9.6.0", 3359 | "registry-auth-token": "^4.0.0", 3360 | "registry-url": "^5.0.0", 3361 | "semver": "^6.2.0" 3362 | }, 3363 | "dependencies": { 3364 | "semver": { 3365 | "version": "6.3.0", 3366 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 3367 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 3368 | "dev": true 3369 | } 3370 | } 3371 | }, 3372 | "parent-module": { 3373 | "version": "1.0.1", 3374 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 3375 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 3376 | "dev": true, 3377 | "requires": { 3378 | "callsites": "^3.0.0" 3379 | } 3380 | }, 3381 | "parse-json": { 3382 | "version": "4.0.0", 3383 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", 3384 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", 3385 | "dev": true, 3386 | "requires": { 3387 | "error-ex": "^1.3.1", 3388 | "json-parse-better-errors": "^1.0.1" 3389 | } 3390 | }, 3391 | "parse-ms": { 3392 | "version": "2.1.0", 3393 | "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", 3394 | "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", 3395 | "dev": true 3396 | }, 3397 | "path-exists": { 3398 | "version": "4.0.0", 3399 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 3400 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 3401 | "dev": true 3402 | }, 3403 | "path-is-absolute": { 3404 | "version": "1.0.1", 3405 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 3406 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 3407 | "dev": true 3408 | }, 3409 | "path-key": { 3410 | "version": "3.1.1", 3411 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 3412 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 3413 | "dev": true 3414 | }, 3415 | "path-parse": { 3416 | "version": "1.0.6", 3417 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 3418 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 3419 | "dev": true 3420 | }, 3421 | "path-to-regexp": { 3422 | "version": "1.8.0", 3423 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", 3424 | "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", 3425 | "dev": true, 3426 | "requires": { 3427 | "isarray": "0.0.1" 3428 | }, 3429 | "dependencies": { 3430 | "isarray": { 3431 | "version": "0.0.1", 3432 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 3433 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 3434 | "dev": true 3435 | } 3436 | } 3437 | }, 3438 | "path-type": { 3439 | "version": "4.0.0", 3440 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 3441 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 3442 | "dev": true 3443 | }, 3444 | "picomatch": { 3445 | "version": "2.2.2", 3446 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", 3447 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", 3448 | "dev": true 3449 | }, 3450 | "pify": { 3451 | "version": "4.0.1", 3452 | "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", 3453 | "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", 3454 | "dev": true 3455 | }, 3456 | "pkg-conf": { 3457 | "version": "3.1.0", 3458 | "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", 3459 | "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==", 3460 | "dev": true, 3461 | "requires": { 3462 | "find-up": "^3.0.0", 3463 | "load-json-file": "^5.2.0" 3464 | }, 3465 | "dependencies": { 3466 | "find-up": { 3467 | "version": "3.0.0", 3468 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 3469 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 3470 | "dev": true, 3471 | "requires": { 3472 | "locate-path": "^3.0.0" 3473 | } 3474 | }, 3475 | "locate-path": { 3476 | "version": "3.0.0", 3477 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 3478 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 3479 | "dev": true, 3480 | "requires": { 3481 | "p-locate": "^3.0.0", 3482 | "path-exists": "^3.0.0" 3483 | } 3484 | }, 3485 | "p-locate": { 3486 | "version": "3.0.0", 3487 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 3488 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 3489 | "dev": true, 3490 | "requires": { 3491 | "p-limit": "^2.0.0" 3492 | } 3493 | }, 3494 | "path-exists": { 3495 | "version": "3.0.0", 3496 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 3497 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 3498 | "dev": true 3499 | } 3500 | } 3501 | }, 3502 | "pkg-dir": { 3503 | "version": "4.2.0", 3504 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", 3505 | "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", 3506 | "dev": true, 3507 | "requires": { 3508 | "find-up": "^4.0.0" 3509 | } 3510 | }, 3511 | "plur": { 3512 | "version": "4.0.0", 3513 | "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", 3514 | "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", 3515 | "dev": true, 3516 | "requires": { 3517 | "irregular-plurals": "^3.2.0" 3518 | } 3519 | }, 3520 | "prelude-ls": { 3521 | "version": "1.2.1", 3522 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 3523 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 3524 | "dev": true 3525 | }, 3526 | "prepend-http": { 3527 | "version": "2.0.0", 3528 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", 3529 | "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", 3530 | "dev": true 3531 | }, 3532 | "pretty-ms": { 3533 | "version": "7.0.0", 3534 | "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.0.tgz", 3535 | "integrity": "sha512-J3aPWiC5e9ZeZFuSeBraGxSkGMOvulSWsxDByOcbD1Pr75YL3LSNIKIb52WXbCLE1sS5s4inBBbryjF4Y05Ceg==", 3536 | "dev": true, 3537 | "requires": { 3538 | "parse-ms": "^2.1.0" 3539 | } 3540 | }, 3541 | "process-nextick-args": { 3542 | "version": "2.0.1", 3543 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 3544 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 3545 | }, 3546 | "progress": { 3547 | "version": "2.0.3", 3548 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 3549 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 3550 | "dev": true 3551 | }, 3552 | "pstree.remy": { 3553 | "version": "1.1.8", 3554 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", 3555 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", 3556 | "dev": true 3557 | }, 3558 | "pump": { 3559 | "version": "3.0.0", 3560 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 3561 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 3562 | "dev": true, 3563 | "requires": { 3564 | "end-of-stream": "^1.1.0", 3565 | "once": "^1.3.1" 3566 | } 3567 | }, 3568 | "punycode": { 3569 | "version": "2.1.1", 3570 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 3571 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 3572 | "dev": true 3573 | }, 3574 | "pupa": { 3575 | "version": "2.0.1", 3576 | "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz", 3577 | "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==", 3578 | "dev": true, 3579 | "requires": { 3580 | "escape-goat": "^2.0.0" 3581 | } 3582 | }, 3583 | "rc": { 3584 | "version": "1.2.8", 3585 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 3586 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 3587 | "dev": true, 3588 | "requires": { 3589 | "deep-extend": "^0.6.0", 3590 | "ini": "~1.3.0", 3591 | "minimist": "^1.2.0", 3592 | "strip-json-comments": "~2.0.1" 3593 | } 3594 | }, 3595 | "read-pkg": { 3596 | "version": "5.2.0", 3597 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", 3598 | "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", 3599 | "dev": true, 3600 | "requires": { 3601 | "@types/normalize-package-data": "^2.4.0", 3602 | "normalize-package-data": "^2.5.0", 3603 | "parse-json": "^5.0.0", 3604 | "type-fest": "^0.6.0" 3605 | }, 3606 | "dependencies": { 3607 | "parse-json": { 3608 | "version": "5.0.0", 3609 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", 3610 | "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", 3611 | "dev": true, 3612 | "requires": { 3613 | "@babel/code-frame": "^7.0.0", 3614 | "error-ex": "^1.3.1", 3615 | "json-parse-better-errors": "^1.0.1", 3616 | "lines-and-columns": "^1.1.6" 3617 | } 3618 | }, 3619 | "type-fest": { 3620 | "version": "0.6.0", 3621 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", 3622 | "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", 3623 | "dev": true 3624 | } 3625 | } 3626 | }, 3627 | "readable-stream": { 3628 | "version": "2.3.7", 3629 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 3630 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 3631 | "requires": { 3632 | "core-util-is": "~1.0.0", 3633 | "inherits": "~2.0.3", 3634 | "isarray": "~1.0.0", 3635 | "process-nextick-args": "~2.0.0", 3636 | "safe-buffer": "~5.1.1", 3637 | "string_decoder": "~1.1.1", 3638 | "util-deprecate": "~1.0.1" 3639 | } 3640 | }, 3641 | "readdirp": { 3642 | "version": "3.4.0", 3643 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", 3644 | "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", 3645 | "dev": true, 3646 | "requires": { 3647 | "picomatch": "^2.2.1" 3648 | } 3649 | }, 3650 | "redis-commands": { 3651 | "version": "1.5.0", 3652 | "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.5.0.tgz", 3653 | "integrity": "sha512-6KxamqpZ468MeQC3bkWmCB1fp56XL64D4Kf0zJSwDZbVLLm7KFkoIcHrgRvQ+sk8dnhySs7+yBg94yIkAK7aJg==" 3654 | }, 3655 | "redis-errors": { 3656 | "version": "1.2.0", 3657 | "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", 3658 | "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=" 3659 | }, 3660 | "redis-parser": { 3661 | "version": "3.0.0", 3662 | "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", 3663 | "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=", 3664 | "requires": { 3665 | "redis-errors": "^1.0.0" 3666 | } 3667 | }, 3668 | "regexp-clone": { 3669 | "version": "1.0.0", 3670 | "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", 3671 | "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" 3672 | }, 3673 | "regexpp": { 3674 | "version": "3.1.0", 3675 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", 3676 | "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", 3677 | "dev": true 3678 | }, 3679 | "registry-auth-token": { 3680 | "version": "4.1.1", 3681 | "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.1.1.tgz", 3682 | "integrity": "sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==", 3683 | "dev": true, 3684 | "requires": { 3685 | "rc": "^1.2.8" 3686 | } 3687 | }, 3688 | "registry-url": { 3689 | "version": "5.1.0", 3690 | "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", 3691 | "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", 3692 | "dev": true, 3693 | "requires": { 3694 | "rc": "^1.2.8" 3695 | } 3696 | }, 3697 | "require-directory": { 3698 | "version": "2.1.1", 3699 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 3700 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 3701 | "dev": true 3702 | }, 3703 | "require-main-filename": { 3704 | "version": "2.0.0", 3705 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 3706 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", 3707 | "dev": true 3708 | }, 3709 | "require_optional": { 3710 | "version": "1.0.1", 3711 | "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", 3712 | "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", 3713 | "requires": { 3714 | "resolve-from": "^2.0.0", 3715 | "semver": "^5.1.0" 3716 | }, 3717 | "dependencies": { 3718 | "resolve-from": { 3719 | "version": "2.0.0", 3720 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", 3721 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" 3722 | } 3723 | } 3724 | }, 3725 | "resolve": { 3726 | "version": "1.17.0", 3727 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", 3728 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", 3729 | "dev": true, 3730 | "requires": { 3731 | "path-parse": "^1.0.6" 3732 | } 3733 | }, 3734 | "resolve-cwd": { 3735 | "version": "3.0.0", 3736 | "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", 3737 | "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", 3738 | "dev": true, 3739 | "requires": { 3740 | "resolve-from": "^5.0.0" 3741 | } 3742 | }, 3743 | "resolve-from": { 3744 | "version": "5.0.0", 3745 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", 3746 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", 3747 | "dev": true 3748 | }, 3749 | "responselike": { 3750 | "version": "1.0.2", 3751 | "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", 3752 | "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", 3753 | "dev": true, 3754 | "requires": { 3755 | "lowercase-keys": "^1.0.0" 3756 | } 3757 | }, 3758 | "restore-cursor": { 3759 | "version": "3.1.0", 3760 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 3761 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 3762 | "dev": true, 3763 | "requires": { 3764 | "onetime": "^5.1.0", 3765 | "signal-exit": "^3.0.2" 3766 | } 3767 | }, 3768 | "reusify": { 3769 | "version": "1.0.4", 3770 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 3771 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 3772 | "dev": true 3773 | }, 3774 | "rimraf": { 3775 | "version": "3.0.2", 3776 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 3777 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 3778 | "dev": true, 3779 | "requires": { 3780 | "glob": "^7.1.3" 3781 | } 3782 | }, 3783 | "run-async": { 3784 | "version": "2.4.1", 3785 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", 3786 | "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", 3787 | "dev": true 3788 | }, 3789 | "run-parallel": { 3790 | "version": "1.1.9", 3791 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", 3792 | "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", 3793 | "dev": true 3794 | }, 3795 | "rxjs": { 3796 | "version": "6.5.5", 3797 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", 3798 | "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", 3799 | "dev": true, 3800 | "requires": { 3801 | "tslib": "^1.9.0" 3802 | } 3803 | }, 3804 | "safe-buffer": { 3805 | "version": "5.1.2", 3806 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 3807 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 3808 | }, 3809 | "safer-buffer": { 3810 | "version": "2.1.2", 3811 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 3812 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 3813 | "dev": true 3814 | }, 3815 | "saslprep": { 3816 | "version": "1.0.3", 3817 | "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", 3818 | "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", 3819 | "optional": true, 3820 | "requires": { 3821 | "sparse-bitfield": "^3.0.3" 3822 | } 3823 | }, 3824 | "semver": { 3825 | "version": "5.7.0", 3826 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", 3827 | "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" 3828 | }, 3829 | "serialize-error": { 3830 | "version": "2.1.0", 3831 | "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", 3832 | "integrity": "sha1-ULZ51WNc34Rme9yOWa9OW4HV9go=", 3833 | "dev": true 3834 | }, 3835 | "set-blocking": { 3836 | "version": "2.0.0", 3837 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 3838 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 3839 | "dev": true 3840 | }, 3841 | "shebang-command": { 3842 | "version": "2.0.0", 3843 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 3844 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 3845 | "dev": true, 3846 | "requires": { 3847 | "shebang-regex": "^3.0.0" 3848 | } 3849 | }, 3850 | "shebang-regex": { 3851 | "version": "3.0.0", 3852 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 3853 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 3854 | "dev": true 3855 | }, 3856 | "sift": { 3857 | "version": "7.0.1", 3858 | "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", 3859 | "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==" 3860 | }, 3861 | "signal-exit": { 3862 | "version": "3.0.3", 3863 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 3864 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", 3865 | "dev": true 3866 | }, 3867 | "sinon": { 3868 | "version": "9.0.2", 3869 | "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.0.2.tgz", 3870 | "integrity": "sha512-0uF8Q/QHkizNUmbK3LRFqx5cpTttEVXudywY9Uwzy8bTfZUhljZ7ARzSxnRHWYWtVTeh4Cw+tTb3iU21FQVO9A==", 3871 | "dev": true, 3872 | "requires": { 3873 | "@sinonjs/commons": "^1.7.2", 3874 | "@sinonjs/fake-timers": "^6.0.1", 3875 | "@sinonjs/formatio": "^5.0.1", 3876 | "@sinonjs/samsam": "^5.0.3", 3877 | "diff": "^4.0.2", 3878 | "nise": "^4.0.1", 3879 | "supports-color": "^7.1.0" 3880 | } 3881 | }, 3882 | "slash": { 3883 | "version": "3.0.0", 3884 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 3885 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 3886 | "dev": true 3887 | }, 3888 | "slice-ansi": { 3889 | "version": "3.0.0", 3890 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", 3891 | "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", 3892 | "dev": true, 3893 | "requires": { 3894 | "ansi-styles": "^4.0.0", 3895 | "astral-regex": "^2.0.0", 3896 | "is-fullwidth-code-point": "^3.0.0" 3897 | } 3898 | }, 3899 | "sliced": { 3900 | "version": "1.0.1", 3901 | "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", 3902 | "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" 3903 | }, 3904 | "source-map-support": { 3905 | "version": "0.5.19", 3906 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", 3907 | "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", 3908 | "dev": true, 3909 | "requires": { 3910 | "buffer-from": "^1.0.0", 3911 | "source-map": "^0.6.0" 3912 | }, 3913 | "dependencies": { 3914 | "source-map": { 3915 | "version": "0.6.1", 3916 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 3917 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 3918 | "dev": true 3919 | } 3920 | } 3921 | }, 3922 | "sparse-bitfield": { 3923 | "version": "3.0.3", 3924 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 3925 | "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", 3926 | "optional": true, 3927 | "requires": { 3928 | "memory-pager": "^1.0.2" 3929 | } 3930 | }, 3931 | "spdx-correct": { 3932 | "version": "3.1.1", 3933 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", 3934 | "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", 3935 | "dev": true, 3936 | "requires": { 3937 | "spdx-expression-parse": "^3.0.0", 3938 | "spdx-license-ids": "^3.0.0" 3939 | } 3940 | }, 3941 | "spdx-exceptions": { 3942 | "version": "2.3.0", 3943 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", 3944 | "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", 3945 | "dev": true 3946 | }, 3947 | "spdx-expression-parse": { 3948 | "version": "3.0.1", 3949 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", 3950 | "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", 3951 | "dev": true, 3952 | "requires": { 3953 | "spdx-exceptions": "^2.1.0", 3954 | "spdx-license-ids": "^3.0.0" 3955 | } 3956 | }, 3957 | "spdx-license-ids": { 3958 | "version": "3.0.5", 3959 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", 3960 | "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", 3961 | "dev": true 3962 | }, 3963 | "sprintf-js": { 3964 | "version": "1.0.3", 3965 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 3966 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 3967 | "dev": true 3968 | }, 3969 | "stack-utils": { 3970 | "version": "2.0.2", 3971 | "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", 3972 | "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", 3973 | "dev": true, 3974 | "requires": { 3975 | "escape-string-regexp": "^2.0.0" 3976 | }, 3977 | "dependencies": { 3978 | "escape-string-regexp": { 3979 | "version": "2.0.0", 3980 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", 3981 | "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", 3982 | "dev": true 3983 | } 3984 | } 3985 | }, 3986 | "standard-as-callback": { 3987 | "version": "2.0.1", 3988 | "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.0.1.tgz", 3989 | "integrity": "sha512-NQOxSeB8gOI5WjSaxjBgog2QFw55FV8TkS6Y07BiB3VJ8xNTvUYm0wl0s8ObgQ5NhdpnNfigMIKjgPESzgr4tg==" 3990 | }, 3991 | "string-width": { 3992 | "version": "4.2.0", 3993 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", 3994 | "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", 3995 | "dev": true, 3996 | "requires": { 3997 | "emoji-regex": "^8.0.0", 3998 | "is-fullwidth-code-point": "^3.0.0", 3999 | "strip-ansi": "^6.0.0" 4000 | }, 4001 | "dependencies": { 4002 | "strip-ansi": { 4003 | "version": "6.0.0", 4004 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 4005 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 4006 | "dev": true, 4007 | "requires": { 4008 | "ansi-regex": "^5.0.0" 4009 | } 4010 | } 4011 | } 4012 | }, 4013 | "string.prototype.trimend": { 4014 | "version": "1.0.1", 4015 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", 4016 | "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", 4017 | "dev": true, 4018 | "requires": { 4019 | "define-properties": "^1.1.3", 4020 | "es-abstract": "^1.17.5" 4021 | } 4022 | }, 4023 | "string.prototype.trimleft": { 4024 | "version": "2.1.2", 4025 | "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", 4026 | "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", 4027 | "dev": true, 4028 | "requires": { 4029 | "define-properties": "^1.1.3", 4030 | "es-abstract": "^1.17.5", 4031 | "string.prototype.trimstart": "^1.0.0" 4032 | } 4033 | }, 4034 | "string.prototype.trimright": { 4035 | "version": "2.1.2", 4036 | "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", 4037 | "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", 4038 | "dev": true, 4039 | "requires": { 4040 | "define-properties": "^1.1.3", 4041 | "es-abstract": "^1.17.5", 4042 | "string.prototype.trimend": "^1.0.0" 4043 | } 4044 | }, 4045 | "string.prototype.trimstart": { 4046 | "version": "1.0.1", 4047 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", 4048 | "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", 4049 | "dev": true, 4050 | "requires": { 4051 | "define-properties": "^1.1.3", 4052 | "es-abstract": "^1.17.5" 4053 | } 4054 | }, 4055 | "string_decoder": { 4056 | "version": "1.1.1", 4057 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 4058 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 4059 | "requires": { 4060 | "safe-buffer": "~5.1.0" 4061 | } 4062 | }, 4063 | "strip-ansi": { 4064 | "version": "5.2.0", 4065 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 4066 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 4067 | "dev": true, 4068 | "requires": { 4069 | "ansi-regex": "^4.1.0" 4070 | }, 4071 | "dependencies": { 4072 | "ansi-regex": { 4073 | "version": "4.1.0", 4074 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 4075 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 4076 | "dev": true 4077 | } 4078 | } 4079 | }, 4080 | "strip-bom": { 4081 | "version": "3.0.0", 4082 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 4083 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 4084 | "dev": true 4085 | }, 4086 | "strip-json-comments": { 4087 | "version": "2.0.1", 4088 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 4089 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 4090 | "dev": true 4091 | }, 4092 | "supertap": { 4093 | "version": "1.0.0", 4094 | "resolved": "https://registry.npmjs.org/supertap/-/supertap-1.0.0.tgz", 4095 | "integrity": "sha512-HZJ3geIMPgVwKk2VsmO5YHqnnJYl6bV5A9JW2uzqV43WmpgliNEYbuvukfor7URpaqpxuw3CfZ3ONdVbZjCgIA==", 4096 | "dev": true, 4097 | "requires": { 4098 | "arrify": "^1.0.1", 4099 | "indent-string": "^3.2.0", 4100 | "js-yaml": "^3.10.0", 4101 | "serialize-error": "^2.1.0", 4102 | "strip-ansi": "^4.0.0" 4103 | }, 4104 | "dependencies": { 4105 | "ansi-regex": { 4106 | "version": "3.0.0", 4107 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 4108 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 4109 | "dev": true 4110 | }, 4111 | "arrify": { 4112 | "version": "1.0.1", 4113 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 4114 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", 4115 | "dev": true 4116 | }, 4117 | "indent-string": { 4118 | "version": "3.2.0", 4119 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", 4120 | "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", 4121 | "dev": true 4122 | }, 4123 | "strip-ansi": { 4124 | "version": "4.0.0", 4125 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 4126 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 4127 | "dev": true, 4128 | "requires": { 4129 | "ansi-regex": "^3.0.0" 4130 | } 4131 | } 4132 | } 4133 | }, 4134 | "supports-color": { 4135 | "version": "7.1.0", 4136 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", 4137 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", 4138 | "dev": true, 4139 | "requires": { 4140 | "has-flag": "^4.0.0" 4141 | }, 4142 | "dependencies": { 4143 | "has-flag": { 4144 | "version": "4.0.0", 4145 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 4146 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 4147 | "dev": true 4148 | } 4149 | } 4150 | }, 4151 | "table": { 4152 | "version": "5.4.6", 4153 | "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", 4154 | "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", 4155 | "dev": true, 4156 | "requires": { 4157 | "ajv": "^6.10.2", 4158 | "lodash": "^4.17.14", 4159 | "slice-ansi": "^2.1.0", 4160 | "string-width": "^3.0.0" 4161 | }, 4162 | "dependencies": { 4163 | "ansi-styles": { 4164 | "version": "3.2.1", 4165 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 4166 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 4167 | "dev": true, 4168 | "requires": { 4169 | "color-convert": "^1.9.0" 4170 | } 4171 | }, 4172 | "astral-regex": { 4173 | "version": "1.0.0", 4174 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 4175 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", 4176 | "dev": true 4177 | }, 4178 | "emoji-regex": { 4179 | "version": "7.0.3", 4180 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 4181 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 4182 | "dev": true 4183 | }, 4184 | "is-fullwidth-code-point": { 4185 | "version": "2.0.0", 4186 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 4187 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 4188 | "dev": true 4189 | }, 4190 | "slice-ansi": { 4191 | "version": "2.1.0", 4192 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 4193 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", 4194 | "dev": true, 4195 | "requires": { 4196 | "ansi-styles": "^3.2.0", 4197 | "astral-regex": "^1.0.0", 4198 | "is-fullwidth-code-point": "^2.0.0" 4199 | } 4200 | }, 4201 | "string-width": { 4202 | "version": "3.1.0", 4203 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 4204 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 4205 | "dev": true, 4206 | "requires": { 4207 | "emoji-regex": "^7.0.1", 4208 | "is-fullwidth-code-point": "^2.0.0", 4209 | "strip-ansi": "^5.1.0" 4210 | } 4211 | } 4212 | } 4213 | }, 4214 | "temp-dir": { 4215 | "version": "2.0.0", 4216 | "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", 4217 | "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", 4218 | "dev": true 4219 | }, 4220 | "text-table": { 4221 | "version": "0.2.0", 4222 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 4223 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 4224 | "dev": true 4225 | }, 4226 | "through": { 4227 | "version": "2.3.8", 4228 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 4229 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 4230 | "dev": true 4231 | }, 4232 | "time-zone": { 4233 | "version": "1.0.0", 4234 | "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", 4235 | "integrity": "sha1-mcW/VZWJZq9tBtg73zgA3IL67F0=", 4236 | "dev": true 4237 | }, 4238 | "tmp": { 4239 | "version": "0.0.33", 4240 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 4241 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 4242 | "dev": true, 4243 | "requires": { 4244 | "os-tmpdir": "~1.0.2" 4245 | } 4246 | }, 4247 | "to-readable-stream": { 4248 | "version": "1.0.0", 4249 | "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", 4250 | "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", 4251 | "dev": true 4252 | }, 4253 | "to-regex-range": { 4254 | "version": "5.0.1", 4255 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 4256 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 4257 | "dev": true, 4258 | "requires": { 4259 | "is-number": "^7.0.0" 4260 | } 4261 | }, 4262 | "touch": { 4263 | "version": "3.1.0", 4264 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", 4265 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", 4266 | "dev": true, 4267 | "requires": { 4268 | "nopt": "~1.0.10" 4269 | } 4270 | }, 4271 | "trim-off-newlines": { 4272 | "version": "1.0.1", 4273 | "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", 4274 | "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", 4275 | "dev": true 4276 | }, 4277 | "tslib": { 4278 | "version": "1.13.0", 4279 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", 4280 | "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", 4281 | "dev": true 4282 | }, 4283 | "type-check": { 4284 | "version": "0.4.0", 4285 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 4286 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 4287 | "dev": true, 4288 | "requires": { 4289 | "prelude-ls": "^1.2.1" 4290 | } 4291 | }, 4292 | "type-detect": { 4293 | "version": "4.0.8", 4294 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 4295 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 4296 | "dev": true 4297 | }, 4298 | "type-fest": { 4299 | "version": "0.3.1", 4300 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", 4301 | "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", 4302 | "dev": true 4303 | }, 4304 | "typedarray-to-buffer": { 4305 | "version": "3.1.5", 4306 | "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", 4307 | "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", 4308 | "dev": true, 4309 | "requires": { 4310 | "is-typedarray": "^1.0.0" 4311 | } 4312 | }, 4313 | "undefsafe": { 4314 | "version": "2.0.3", 4315 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", 4316 | "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", 4317 | "dev": true, 4318 | "requires": { 4319 | "debug": "^2.2.0" 4320 | }, 4321 | "dependencies": { 4322 | "debug": { 4323 | "version": "2.6.9", 4324 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 4325 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 4326 | "dev": true, 4327 | "requires": { 4328 | "ms": "2.0.0" 4329 | } 4330 | }, 4331 | "ms": { 4332 | "version": "2.0.0", 4333 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 4334 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 4335 | "dev": true 4336 | } 4337 | } 4338 | }, 4339 | "update-notifier": { 4340 | "version": "4.1.0", 4341 | "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.0.tgz", 4342 | "integrity": "sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew==", 4343 | "dev": true, 4344 | "requires": { 4345 | "boxen": "^4.2.0", 4346 | "chalk": "^3.0.0", 4347 | "configstore": "^5.0.1", 4348 | "has-yarn": "^2.1.0", 4349 | "import-lazy": "^2.1.0", 4350 | "is-ci": "^2.0.0", 4351 | "is-installed-globally": "^0.3.1", 4352 | "is-npm": "^4.0.0", 4353 | "is-yarn-global": "^0.3.0", 4354 | "latest-version": "^5.0.0", 4355 | "pupa": "^2.0.1", 4356 | "semver-diff": "^3.1.1", 4357 | "xdg-basedir": "^4.0.0" 4358 | }, 4359 | "dependencies": { 4360 | "chalk": { 4361 | "version": "3.0.0", 4362 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", 4363 | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", 4364 | "dev": true, 4365 | "requires": { 4366 | "ansi-styles": "^4.1.0", 4367 | "supports-color": "^7.1.0" 4368 | } 4369 | }, 4370 | "global-dirs": { 4371 | "version": "2.0.1", 4372 | "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", 4373 | "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", 4374 | "dev": true, 4375 | "requires": { 4376 | "ini": "^1.3.5" 4377 | } 4378 | }, 4379 | "is-installed-globally": { 4380 | "version": "0.3.2", 4381 | "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", 4382 | "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", 4383 | "dev": true, 4384 | "requires": { 4385 | "global-dirs": "^2.0.1", 4386 | "is-path-inside": "^3.0.1" 4387 | } 4388 | }, 4389 | "semver": { 4390 | "version": "6.3.0", 4391 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 4392 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 4393 | "dev": true 4394 | }, 4395 | "semver-diff": { 4396 | "version": "3.1.1", 4397 | "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", 4398 | "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", 4399 | "dev": true, 4400 | "requires": { 4401 | "semver": "^6.3.0" 4402 | } 4403 | }, 4404 | "xdg-basedir": { 4405 | "version": "4.0.0", 4406 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", 4407 | "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", 4408 | "dev": true 4409 | } 4410 | } 4411 | }, 4412 | "uri-js": { 4413 | "version": "4.2.2", 4414 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 4415 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 4416 | "dev": true, 4417 | "requires": { 4418 | "punycode": "^2.1.0" 4419 | } 4420 | }, 4421 | "url-parse-lax": { 4422 | "version": "3.0.0", 4423 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", 4424 | "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", 4425 | "dev": true, 4426 | "requires": { 4427 | "prepend-http": "^2.0.0" 4428 | } 4429 | }, 4430 | "util-deprecate": { 4431 | "version": "1.0.2", 4432 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 4433 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 4434 | }, 4435 | "uuid": { 4436 | "version": "8.1.0", 4437 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.1.0.tgz", 4438 | "integrity": "sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg==" 4439 | }, 4440 | "v8-compile-cache": { 4441 | "version": "2.1.0", 4442 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", 4443 | "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", 4444 | "dev": true 4445 | }, 4446 | "validate-npm-package-license": { 4447 | "version": "3.0.4", 4448 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 4449 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 4450 | "dev": true, 4451 | "requires": { 4452 | "spdx-correct": "^3.0.0", 4453 | "spdx-expression-parse": "^3.0.0" 4454 | } 4455 | }, 4456 | "wcwidth": { 4457 | "version": "1.0.1", 4458 | "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", 4459 | "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", 4460 | "dev": true, 4461 | "requires": { 4462 | "defaults": "^1.0.3" 4463 | } 4464 | }, 4465 | "well-known-symbols": { 4466 | "version": "2.0.0", 4467 | "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz", 4468 | "integrity": "sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==", 4469 | "dev": true 4470 | }, 4471 | "which": { 4472 | "version": "2.0.2", 4473 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 4474 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 4475 | "dev": true, 4476 | "requires": { 4477 | "isexe": "^2.0.0" 4478 | } 4479 | }, 4480 | "which-module": { 4481 | "version": "2.0.0", 4482 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 4483 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", 4484 | "dev": true 4485 | }, 4486 | "word-wrap": { 4487 | "version": "1.2.3", 4488 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 4489 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 4490 | "dev": true 4491 | }, 4492 | "wrap-ansi": { 4493 | "version": "6.2.0", 4494 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", 4495 | "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", 4496 | "dev": true, 4497 | "requires": { 4498 | "ansi-styles": "^4.0.0", 4499 | "string-width": "^4.1.0", 4500 | "strip-ansi": "^6.0.0" 4501 | }, 4502 | "dependencies": { 4503 | "strip-ansi": { 4504 | "version": "6.0.0", 4505 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 4506 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 4507 | "dev": true, 4508 | "requires": { 4509 | "ansi-regex": "^5.0.0" 4510 | } 4511 | } 4512 | } 4513 | }, 4514 | "wrappy": { 4515 | "version": "1.0.2", 4516 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 4517 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 4518 | "dev": true 4519 | }, 4520 | "write": { 4521 | "version": "1.0.3", 4522 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", 4523 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", 4524 | "dev": true, 4525 | "requires": { 4526 | "mkdirp": "^0.5.1" 4527 | } 4528 | }, 4529 | "write-file-atomic": { 4530 | "version": "3.0.3", 4531 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", 4532 | "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", 4533 | "dev": true, 4534 | "requires": { 4535 | "imurmurhash": "^0.1.4", 4536 | "is-typedarray": "^1.0.0", 4537 | "signal-exit": "^3.0.2", 4538 | "typedarray-to-buffer": "^3.1.5" 4539 | } 4540 | }, 4541 | "y18n": { 4542 | "version": "4.0.0", 4543 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", 4544 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", 4545 | "dev": true 4546 | }, 4547 | "yargs": { 4548 | "version": "15.3.1", 4549 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", 4550 | "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", 4551 | "dev": true, 4552 | "requires": { 4553 | "cliui": "^6.0.0", 4554 | "decamelize": "^1.2.0", 4555 | "find-up": "^4.1.0", 4556 | "get-caller-file": "^2.0.1", 4557 | "require-directory": "^2.1.1", 4558 | "require-main-filename": "^2.0.0", 4559 | "set-blocking": "^2.0.0", 4560 | "string-width": "^4.2.0", 4561 | "which-module": "^2.0.0", 4562 | "y18n": "^4.0.0", 4563 | "yargs-parser": "^18.1.1" 4564 | } 4565 | }, 4566 | "yargs-parser": { 4567 | "version": "18.1.3", 4568 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", 4569 | "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", 4570 | "dev": true, 4571 | "requires": { 4572 | "camelcase": "^5.0.0", 4573 | "decamelize": "^1.2.0" 4574 | }, 4575 | "dependencies": { 4576 | "camelcase": { 4577 | "version": "5.3.1", 4578 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 4579 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 4580 | "dev": true 4581 | } 4582 | } 4583 | } 4584 | } 4585 | } 4586 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ead-api", 3 | "version": "0.0.1", 4 | "description": "API da plataforma de ensino a distância", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "ava -f tests/**/*.test.js", 8 | "start": "nodemon src/index", 9 | "eslint": "eslint ./src/**/*.js" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "git+https://github.com/programadorabordo/ead-api.git" 14 | }, 15 | "keywords": [ 16 | "plataforma", 17 | "EAD", 18 | "programador", 19 | "a", 20 | "bordo" 21 | ], 22 | "author": "Programador a Bordo, Ayrton Teshima", 23 | "license": "MIT", 24 | "bugs": { 25 | "url": "https://github.com/programadorabordo/ead-api/issues" 26 | }, 27 | "homepage": "https://github.com/programadorabordo/ead-api#readme", 28 | "devDependencies": { 29 | "ava": "^3.8.2", 30 | "eslint": "^7.1.0", 31 | "eslint-config-airbnb-base": "^14.1.0", 32 | "eslint-plugin-import": "^2.20.2", 33 | "nodemon": "^2.0.4", 34 | "sinon": "^9.0.2" 35 | }, 36 | "dependencies": { 37 | "@hapi/boom": "^9.1.0", 38 | "@hapi/hapi": "^19.1.1", 39 | "@hapi/joi": "^17.1.1", 40 | "bcryptjs": "^2.4.3", 41 | "dotenv-safe": "^8.2.0", 42 | "hapi-auth-jwt2": "^10.1.0", 43 | "ioredis": "^4.17.1", 44 | "jsonwebtoken": "^8.5.1", 45 | "mongoose": "^5.9.16", 46 | "uuid": "^8.1.0" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/auth/authenticate.auth.js: -------------------------------------------------------------------------------- 1 | const Token = require('./token.auth'); 2 | const Cache = require('../repositories/cache.repository'); 3 | const { findByEmail } = require('../repositories/users.repository'); 4 | const { LOGIN_EXPIRATION_TIME, BLACKLIST_CACHE_PREFIX } = require('./confs'); 5 | 6 | const hash = require('../utils/hash'); 7 | 8 | const { 9 | ERR_USER_NOT_FOUND, 10 | ERR_INVALID_PASSWORD, 11 | } = require('../utils/errorTypes'); 12 | 13 | const login = async (email, password) => { 14 | const user = await findByEmail(email); 15 | 16 | if (!user) { 17 | throw new Error(ERR_USER_NOT_FOUND); 18 | } 19 | 20 | const passwordOk = await hash.compare(password, user.password); 21 | 22 | if (!passwordOk) { 23 | throw new Error(ERR_INVALID_PASSWORD); 24 | } 25 | 26 | const JWTData = { 27 | exp: Math.floor(Date.now() / 1000) + LOGIN_EXPIRATION_TIME, 28 | sub: user.id, 29 | iss: 'ead-api', 30 | data: { 31 | user_id: user.id, 32 | }, 33 | }; 34 | 35 | const token = await Token.generate(JWTData); 36 | 37 | return { user, token }; 38 | }; 39 | 40 | const logout = token => ( 41 | Cache.set(`${BLACKLIST_CACHE_PREFIX}${token}`, 1, LOGIN_EXPIRATION_TIME) 42 | ); 43 | 44 | module.exports = { 45 | login, 46 | logout, 47 | }; 48 | -------------------------------------------------------------------------------- /src/auth/confs.js: -------------------------------------------------------------------------------- 1 | exports.LOGIN_EXPIRATION_TIME = 3600; // 1h 2 | exports.BLACKLIST_CACHE_PREFIX = 'backlistUserToken:'; 3 | exports.ALGORITHM = 'HS256'; 4 | -------------------------------------------------------------------------------- /src/auth/strategies/JWT.js: -------------------------------------------------------------------------------- 1 | const Cache = require('../../repositories/cache.repository'); 2 | const { BLACKLIST_CACHE_PREFIX, ALGORITHM } = require('../confs') 3 | 4 | const name = 'jwt'; 5 | 6 | const schema = 'jwt'; 7 | 8 | const options = { 9 | key: process.env.SECRET_KEY, 10 | validate: async (decoded, h) => { 11 | const unlogged = await Cache.exists(`${BLACKLIST_CACHE_PREFIX}${h.auth.token}`); 12 | return { isValid: !unlogged }; 13 | }, 14 | verifyOptions: { algorithms: [ALGORITHM] }, 15 | }; 16 | 17 | module.exports = { 18 | name, 19 | schema, 20 | options, 21 | }; 22 | -------------------------------------------------------------------------------- /src/auth/token.auth.js: -------------------------------------------------------------------------------- 1 | const JWT = require('jsonwebtoken'); 2 | 3 | const { ERR_INVALID_TOKEN } = require('../utils/errorTypes'); 4 | const { ALGORITHM } = require('./confs'); 5 | 6 | const generate = data => ( 7 | new Promise((resolve) => { 8 | JWT.sign(data, process.env.SECRET_KEY, { algorithm: ALGORITHM }, (err, token) => { 9 | if (err) { 10 | console.error(err); 11 | throw new Error(ERR_INVALID_TOKEN); 12 | } 13 | 14 | resolve(token); 15 | }); 16 | }) 17 | ); 18 | 19 | module.exports = { 20 | generate, 21 | }; 22 | -------------------------------------------------------------------------------- /src/handlers/login.handler.js: -------------------------------------------------------------------------------- 1 | const boom = require('@hapi/boom'); 2 | const authenticate = require('../auth/authenticate.auth'); 3 | const userRepository = require('../repositories/users.repository'); 4 | 5 | const { 6 | ERR_INVALID_PASSWORD, 7 | ERR_INVALID_TOKEN, 8 | ERR_USER_NOT_FOUND, 9 | } = require('../utils/errorTypes'); 10 | 11 | const login = async (req, h) => { 12 | const { email, password } = req.payload; 13 | 14 | try { 15 | const { user, token } = await authenticate.login(email, password); 16 | 17 | await userRepository.setCache(user); 18 | 19 | return h.response({ token }).code(200); 20 | } catch (e) { 21 | switch (e.message) { 22 | case ERR_INVALID_PASSWORD: 23 | throw boom.notFound('E-mail ou senha inválido'); 24 | case ERR_INVALID_TOKEN: 25 | throw boom.badImplementation('Erro ao gerar token'); 26 | case ERR_USER_NOT_FOUND: 27 | throw boom.notFound('E-mail ou senha inválido'); 28 | default: 29 | throw boom.badImplementation(e); 30 | } 31 | } 32 | }; 33 | 34 | module.exports = { 35 | login, 36 | }; 37 | -------------------------------------------------------------------------------- /src/handlers/logout.handler.js: -------------------------------------------------------------------------------- 1 | const boom = require('@hapi/boom'); 2 | const auth = require('../auth/authenticate.auth'); 3 | const userRepository = require('../repositories/users.repository'); 4 | 5 | const logout = async (req, h) => { 6 | const { credentials, token } = req.auth; 7 | try { 8 | await Promise.all([ 9 | auth.logout(token), 10 | userRepository.removeCache(credentials.data.user_id), 11 | ]); 12 | 13 | return h.response().code(200); 14 | } catch (e) { 15 | console.error(e); 16 | throw boom.badImplementation(); 17 | } 18 | }; 19 | 20 | module.exports = { 21 | logout, 22 | }; 23 | -------------------------------------------------------------------------------- /src/handlers/users.handler.js: -------------------------------------------------------------------------------- 1 | const boom = require('@hapi/boom'); 2 | const userRepository = require('../repositories/users.repository'); 3 | const hash = require('../utils/hash'); 4 | const { ERR_DUPLICATE_EMAIL } = require('../utils/errorTypes'); 5 | 6 | const create = async (req, h) => { 7 | try { 8 | const userData = req.payload; 9 | const passwordHashed = await hash.make(userData.password); 10 | 11 | userData.password = passwordHashed; 12 | 13 | const user = await userRepository.create(userData); 14 | return h.response(user).code(201); 15 | } catch (e) { 16 | switch (e.message) { 17 | case ERR_DUPLICATE_EMAIL: 18 | throw boom.badData('E-mail duplicado'); 19 | default: 20 | throw boom.badImplementation(e); 21 | } 22 | } 23 | }; 24 | 25 | const getAll = async () => []; 26 | 27 | module.exports = { 28 | create, 29 | getAll, 30 | }; 31 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | require('dotenv-safe').config(); 2 | require('./services/mongo.service'); 3 | require('./services/redis.service').connect(); 4 | 5 | const { start } = require('./server'); 6 | 7 | const init = async () => { 8 | // Inicializando servidor 9 | const server = await start(); 10 | console.log('Server running on %ss', server.info.uri); 11 | }; 12 | 13 | process.on('unhandledRejection', (err) => { 14 | console.log(err); 15 | process.exit(1); 16 | }); 17 | 18 | init(); 19 | -------------------------------------------------------------------------------- /src/models/users.model.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | const { v4: uuidv4 } = require('uuid'); 3 | 4 | const { Schema } = mongoose; 5 | 6 | const UserSchema = new Schema({ 7 | _id: { 8 | type: String, 9 | default: uuidv4, 10 | }, 11 | name: String, 12 | dateOfBirth: Date, 13 | docType: String, 14 | docNumber: String, 15 | email: String, 16 | status: Boolean, 17 | password: String, 18 | address: { 19 | street: String, 20 | complement: String, 21 | country: String, 22 | state: String, 23 | city: String, 24 | zipcode: String, 25 | number: String, 26 | }, 27 | }, { 28 | timestamps: {}, 29 | }); 30 | 31 | module.exports = new mongoose.model('User', UserSchema); 32 | -------------------------------------------------------------------------------- /src/repositories/cache.repository.js: -------------------------------------------------------------------------------- 1 | const Redis = require('../services/redis.service').get(); 2 | 3 | const set = (key, value, seconds) => ( 4 | Redis.set(key, value, 'EX', seconds) 5 | ); 6 | 7 | const exists = key => Redis.exists(key); 8 | 9 | const del = key => Redis.del(key); 10 | 11 | module.exports = { 12 | set, 13 | exists, 14 | del, 15 | }; 16 | -------------------------------------------------------------------------------- /src/repositories/users.repository.js: -------------------------------------------------------------------------------- 1 | const UserModel = require('../models/users.model'); 2 | const Cache = require('./cache.repository'); 3 | const { ERR_DUPLICATE_EMAIL } = require('../utils/errorTypes'); 4 | const { LOGIN_EXPIRATION_TIME } = require('../auth/confs'); 5 | 6 | const PREFIX_CACHE = 'userId:'; 7 | 8 | const create = async (userData) => { 9 | const userExists = await UserModel.exists({ email: userData.email }); 10 | 11 | if (userExists) { 12 | throw new Error(ERR_DUPLICATE_EMAIL); 13 | } 14 | 15 | const userModel = new UserModel(userData); 16 | return userModel.save(); 17 | }; 18 | 19 | const findByEmail = email => ( 20 | UserModel.findOne({ email }) 21 | ); 22 | 23 | const setCache = user => ( 24 | Cache.set(`${PREFIX_CACHE}${user.id}`, JSON.stringify(user), LOGIN_EXPIRATION_TIME) 25 | ); 26 | 27 | const removeCache = userId => ( 28 | Cache.del(`${PREFIX_CACHE}${userId}`) 29 | ); 30 | 31 | module.exports = { 32 | create, 33 | findByEmail, 34 | setCache, 35 | removeCache, 36 | }; 37 | -------------------------------------------------------------------------------- /src/routes/auth.route.js: -------------------------------------------------------------------------------- 1 | const loginHandler = require('../handlers/login.handler'); 2 | const logoutHandler = require('../handlers/logout.handler'); 3 | const loginSchema = require('../schemas/login.schema'); 4 | 5 | module.exports = [ 6 | { 7 | method: 'POST', 8 | path: '/login', 9 | handler: loginHandler.login, 10 | options: { 11 | auth: false, 12 | validate: { 13 | payload: loginSchema, 14 | }, 15 | }, 16 | }, 17 | { 18 | method: 'POST', 19 | path: '/logout', 20 | handler: logoutHandler.logout, 21 | }, 22 | ]; 23 | -------------------------------------------------------------------------------- /src/routes/index.js: -------------------------------------------------------------------------------- 1 | const userRoutes = require('./users.route'); 2 | const authRoutes = require('./auth.route'); 3 | 4 | module.exports = [ 5 | ...userRoutes, 6 | ...authRoutes, 7 | ]; 8 | -------------------------------------------------------------------------------- /src/routes/users.route.js: -------------------------------------------------------------------------------- 1 | const userHandler = require('../handlers/users.handler'); 2 | const userSchema = require('../schemas/users.schema.js'); 3 | 4 | module.exports = [ 5 | { 6 | method: 'POST', 7 | path: '/users', 8 | handler: userHandler.create, 9 | options: { 10 | validate: { 11 | payload: userSchema, 12 | }, 13 | auth: false, 14 | }, 15 | }, 16 | { 17 | method: 'GET', 18 | path: '/users', 19 | handler: userHandler.getAll, 20 | }, 21 | ]; 22 | -------------------------------------------------------------------------------- /src/schemas/login.schema.js: -------------------------------------------------------------------------------- 1 | const Joi = require('@hapi/joi'); 2 | 3 | module.exports = Joi.object({ 4 | email: Joi.string().email().required(), 5 | password: Joi.string().min(6).required(), 6 | }); 7 | -------------------------------------------------------------------------------- /src/schemas/users.schema.js: -------------------------------------------------------------------------------- 1 | const Joi = require('@hapi/joi'); 2 | 3 | module.exports = Joi.object({ 4 | name: Joi.string().min(3).required(), 5 | dateOfBirth: Joi.date().iso(), 6 | docType: Joi.string(), 7 | docNumber: Joi.string().min(3), 8 | email: Joi.string().email().required(), 9 | status: Joi.string(), 10 | password: Joi.string().min(6).required(), 11 | address: { 12 | street: Joi.string(), 13 | country: Joi.string(), 14 | state: Joi.string(), 15 | city: Joi.string(), 16 | zipcode: Joi.string(), 17 | number: Joi.string(), 18 | complement: Joi.string(), 19 | }, 20 | timestamps: Joi.any().forbidden(), 21 | }); 22 | -------------------------------------------------------------------------------- /src/server.js: -------------------------------------------------------------------------------- 1 | const Hapi = require('@hapi/hapi'); 2 | const hapiAuthJwt2 = require('hapi-auth-jwt2'); 3 | const routes = require('./routes'); 4 | const jwtStrategy = require('./auth/strategies/JWT'); 5 | 6 | const { PORT } = process.env; 7 | const { HOST } = process.env; 8 | 9 | const server = Hapi.server({ 10 | port: PORT, 11 | host: HOST, 12 | }); 13 | 14 | // Definindo rotas 15 | server.route(routes); 16 | 17 | const initializePlugins = async () => { 18 | await server.register(hapiAuthJwt2); 19 | 20 | // Definindo estratégia de autenticação 21 | server.auth.strategy(jwtStrategy.name, jwtStrategy.schema, jwtStrategy.options); 22 | server.auth.default(jwtStrategy.name); 23 | }; 24 | 25 | const start = async () => { 26 | await initializePlugins(); 27 | await server.start(); 28 | 29 | return server; 30 | }; 31 | 32 | const init = async () => { 33 | await initializePlugins(); 34 | await server.initialize(); 35 | 36 | return server; 37 | }; 38 | 39 | module.exports = { 40 | start, 41 | init, 42 | }; 43 | -------------------------------------------------------------------------------- /src/services/mongo.service.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | 3 | const HOST = process.env.MONGO_HOST; 4 | const PORT = process.env.MONGO_PORT; 5 | const DATABASE = process.env.MONGO_DATABASE; 6 | const USER = process.env.MONGO_USER; 7 | const PASSWORD = process.env.MONGO_PASSWORD; 8 | 9 | const uri = `mongodb://${USER}:${PASSWORD}@${HOST}:${PORT}/${DATABASE}`; 10 | 11 | const options = { 12 | useNewUrlParser: true, 13 | useUnifiedTopology: true, 14 | }; 15 | 16 | try { 17 | mongoose.connect(uri, options); 18 | } catch (error) { 19 | console.error(error); 20 | } 21 | 22 | mongoose.connection.on('error', (err) => { 23 | console.error(err); 24 | }); 25 | -------------------------------------------------------------------------------- /src/services/redis.service.js: -------------------------------------------------------------------------------- 1 | const Redis = require('ioredis'); 2 | 3 | let redis = null; 4 | 5 | exports.connect = () => { 6 | redis = new Redis({ 7 | port: process.env.REDIS_PORT, 8 | host: process.env.REDIS_HOST, 9 | }) 10 | }; 11 | 12 | exports.get = () => { 13 | if (!redis) { 14 | throw new Error('REDIS_NOT_INITIALIZED'); 15 | } 16 | 17 | return redis; 18 | }; 19 | -------------------------------------------------------------------------------- /src/utils/errorTypes.js: -------------------------------------------------------------------------------- 1 | const ERR_USER_NOT_FOUND = 'USER_NOT_FOUND'; 2 | const ERR_INVALID_PASSWORD = 'INVALID_PASSWORD'; 3 | const ERR_INVALID_TOKEN = 'TOKEN_ERROR'; 4 | 5 | const ERR_DUPLICATE_EMAIL = 'DUPLICATE_EMAIL'; 6 | 7 | module.exports = { 8 | ERR_USER_NOT_FOUND, 9 | ERR_INVALID_PASSWORD, 10 | ERR_INVALID_TOKEN, 11 | ERR_DUPLICATE_EMAIL, 12 | }; 13 | -------------------------------------------------------------------------------- /src/utils/hash.js: -------------------------------------------------------------------------------- 1 | const bcrypt = require('bcryptjs'); 2 | 3 | const make = async (value) => ( 4 | bcrypt.hash(value, 10) 5 | ); 6 | 7 | const compare = (value, valueHash) => ( 8 | bcrypt.compare(value, valueHash) 9 | ); 10 | 11 | module.exports = { 12 | make, 13 | compare, 14 | }; 15 | -------------------------------------------------------------------------------- /tests/unit/routes/users.route.test.js: -------------------------------------------------------------------------------- 1 | const test = require('ava'); 2 | const sinon = require('sinon'); 3 | const Redis = require('../../../src/services/redis.service'); 4 | 5 | sinon.stub(Redis, 'get').returns({}); 6 | 7 | const { init } = require('../../../src/server'); 8 | 9 | const auth = { 10 | strategy: 'jwt', 11 | credentials: 'Bearer abc' 12 | }; 13 | 14 | let server; 15 | 16 | test.before(async t => { 17 | server = await init(); 18 | }); 19 | 20 | test('should return empty array', async (t) => { 21 | const res = await server.inject({ 22 | method: 'get', 23 | url: '/users', 24 | auth, 25 | }); 26 | t.is(res.payload, '[]'); 27 | }) --------------------------------------------------------------------------------