diff --git a/package-lock.json b/package-lock.json index 689c2db67..8c96c04c3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -352,15 +352,69 @@ } } }, - "@loopback/boot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@loopback/boot/-/boot-1.0.3.tgz", - "integrity": "sha512-sO2xOBETdpw2mvaj4oJyWqhTzt1AMgk1NtF0LIejbPVA99lVjYkX/K0hsLE+JGNvXJ6XgQ1qeouKVkEuQFjALA==", + "@fimbul/bifrost": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@fimbul/bifrost/-/bifrost-0.17.0.tgz", + "integrity": "sha512-gVTkJAOef5HtN6LPmrtt5fAUmBywwlgmObsU3FBhPoNeXPLaIl2zywXkJEtvvVLQnaFmtff3x+wIj5lHRCDE3Q==", + "dev": true, "requires": { - "@loopback/context": "^1.0.1", - "@loopback/core": "^1.0.1", - "@loopback/repository": "^1.0.3", - "@loopback/service-proxy": "^1.0.1", + "@fimbul/ymir": "^0.17.0", + "get-caller-file": "^2.0.0", + "tslib": "^1.8.1", + "tsutils": "^3.5.0" + }, + "dependencies": { + "get-caller-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.1.tgz", + "integrity": "sha512-SpOZHfz845AH0wJYVuZk2jWDqFmu7Xubsx+ldIpwzy5pDUpu7OJHK7QYNSA2NPlDSKQwM1GFaAkciOWjjW92Sg==", + "dev": true + }, + "tsutils": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.7.0.tgz", + "integrity": "sha512-n+e+3q7Jx2kfZw7tjfI9axEIWBY0sFMOlC+1K70X0SeXpO/UYSB+PN+E9tIJNqViB7oiXQdqD7dNchnvoneZew==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + } + } + }, + "@fimbul/ymir": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@fimbul/ymir/-/ymir-0.17.0.tgz", + "integrity": "sha512-xMXM9KTXRLHLVS6dnX1JhHNEkmWHcAVCQ/4+DA1KKwC/AFnGHzu/7QfQttEPgw3xplT+ILf9e3i64jrFwB3JtA==", + "dev": true, + "requires": { + "inversify": "^5.0.0", + "reflect-metadata": "^0.1.12", + "tslib": "^1.8.1" + } + }, + "@loopback/authentication": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@loopback/authentication/-/authentication-1.0.9.tgz", + "integrity": "sha512-ELr0Z1OZTNe75/jakdZe8jlaTGnoW7wJ68gkc4E7Q3ztOr1D8QlSuZOvSsvTLi1WXQxlbs7DaDkacgodiaQolA==", + "requires": { + "@loopback/context": "^1.4.1", + "@loopback/core": "^1.1.4", + "@loopback/metadata": "^1.0.4", + "@loopback/openapi-v3": "^1.1.6", + "@loopback/rest": "^1.5.2", + "passport": "^0.4.0", + "passport-strategy": "^1.0.0" + } + }, + "@loopback/boot": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@loopback/boot/-/boot-1.0.9.tgz", + "integrity": "sha512-g9yXmgs+5AU+UeXHXDpRRIYe89ky5wuAT4QpZ5XisgpTrucUM4i0uRcY9JBR3onxWoC5308HZ7YqcXT81rMhtg==", + "requires": { + "@loopback/context": "^1.4.1", + "@loopback/core": "^1.1.4", + "@loopback/repository": "^1.1.2", + "@loopback/service-proxy": "^1.0.6", "@types/debug": "0.0.30", "@types/glob": "^7.1.1", "debug": "^4.0.1", @@ -375,11 +429,12 @@ } }, "@loopback/build": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@loopback/build/-/build-1.0.1.tgz", - "integrity": "sha512-nImS5oJeXcMMZxVIcguvdkEIjihYTFUyox0F2sPwV8F1WCDcpjSW00luh8zzqXC0o49aEj9BNxkMOxnUt0KZEA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@loopback/build/-/build-1.2.0.tgz", + "integrity": "sha512-KJI8fzRffdhoS06IzX4XEWMve279kVz0ucxDwjpKCHO2O1T7fFaYdcDAd4ltzZ6BHXacqmMmSwJtAEK8UNhWFA==", "dev": true, "requires": { + "@loopback/tslint-config": "^2.0.0", "@types/mocha": "^5.0.0", "@types/node": "^10.11.2", "cross-spawn": "^6.0.5", @@ -392,40 +447,68 @@ "rimraf": "^2.6.2", "source-map-support": "^0.5.5", "strong-docs": "^4.0.0", - "tslint": "^5.9.1", - "typescript": "^3.1.1" + "tslint": "^5.12.0", + "typescript": "^3.2.2" + }, + "dependencies": { + "tslint": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.12.1.tgz", + "integrity": "sha512-sfodBHOucFg6egff8d1BvuofoOQ/nOeYNfbp7LDlKBcLNrL3lmS5zoiDGyOMdT7YsEXAwWpTdAHwOGOc8eRZAw==", + "dev": true, + "requires": { + "babel-code-frame": "^6.22.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^3.2.0", + "glob": "^7.1.1", + "js-yaml": "^3.7.0", + "minimatch": "^3.0.4", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.27.2" + } + }, + "typescript": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz", + "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==", + "dev": true + } } }, "@loopback/context": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@loopback/context/-/context-1.0.1.tgz", - "integrity": "sha512-Fcg8V+DVuGqK3NR2prtxhVud4OhVE3kYcbJXEvVajl9x07go/TrkWrrxCaQ2Tn2RNC59di9BwJtIsVpL8jSIuA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@loopback/context/-/context-1.4.1.tgz", + "integrity": "sha512-e0XqqOQMCsF5jBH/hni03XrQB0DC7F5Ml+xvIG7D2VXUOUCb0H536T8lRk58pYVhOJX7hck5wCBD25bN7Cpobg==", "requires": { - "@loopback/metadata": "^1.0.1", + "@loopback/metadata": "^1.0.4", "debug": "^4.0.1", "uuid": "^3.2.1" } }, "@loopback/core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@loopback/core/-/core-1.0.1.tgz", - "integrity": "sha512-o3gQkr3VBFL8CtOwgIOJtZKV9+T2eK8o1Dr8lWW4ywGNi3offu1Ehkdy233QEqrGswFPZo3z8L0oRPZx4lLgCw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@loopback/core/-/core-1.1.4.tgz", + "integrity": "sha512-hGpwMBQuJINLIC3ota1gYJ7+POBfsfg2iMnH75JqGRYV5dkrREbi7f5kqDz7ZBut2zDYxZi8AtRoWMJVlR/Zpw==", "requires": { - "@loopback/context": "^1.0.1" + "@loopback/context": "^1.4.1" } }, "@loopback/http-server": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@loopback/http-server/-/http-server-1.0.1.tgz", - "integrity": "sha512-fIyCVQOWOxex+BCuMqYpnTI7bISC+HM9rK8qfkYc8gYSTvhBMlGY8NaH7RJl0d+HrXiCMst43pa0/Y3RZn8Nog==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@loopback/http-server/-/http-server-1.1.3.tgz", + "integrity": "sha512-2EzHJ8syZEiPbPXyWxoPauKgXDG3FPKsP4XQ2NYDNAM1aR39AuNmSwU84Mc1UweceNE8KAg5uD1ssuUwEdJPeg==", "requires": { "p-event": "^2.0.0" } }, "@loopback/metadata": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@loopback/metadata/-/metadata-1.0.1.tgz", - "integrity": "sha512-HS2Zbjyv05fl8Zxs3iLZFpAcBc62+wkQO+COqs3QqqjVIZJSfCSaZl4zsMm3YxG57ZxCpYGC3eDRM0xmFTq99w==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@loopback/metadata/-/metadata-1.0.4.tgz", + "integrity": "sha512-sLehVg4xXCN971RViQUdM6VO1khRda5RND5fAxWrNRkgyu3A+XGP/oFg1RRG3ef2t8dr8UpQFW2T3LglLvlhtA==", "requires": { "debug": "^4.0.1", "lodash": "^4.17.5", @@ -433,32 +516,32 @@ } }, "@loopback/openapi-v3": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@loopback/openapi-v3/-/openapi-v3-1.1.0.tgz", - "integrity": "sha512-am0nUj5Cc+iGx4rRLc8ObebtjeE2Mu/3LfOn60+bIeRc8SOJ0HkVWAHfzuDNwmhHF0vtwv8XkzZEqZhIxkJXfw==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@loopback/openapi-v3/-/openapi-v3-1.1.6.tgz", + "integrity": "sha512-mSdlIlJBB6b/UJBlL4DItvnPKVSgd7lOvBFwk5n+tXaO5p/53WWfkscQ9YfyP7hq2KSC/ihwlqFZiPqflTEfBA==", "requires": { - "@loopback/context": "^1.0.1", - "@loopback/openapi-v3-types": "^1.0.1", - "@loopback/repository-json-schema": "^1.2.0", + "@loopback/context": "^1.4.1", + "@loopback/openapi-v3-types": "^1.0.4", + "@loopback/repository-json-schema": "^1.2.6", "debug": "^4.0.1", "lodash": "^4.17.5" } }, "@loopback/openapi-v3-types": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@loopback/openapi-v3-types/-/openapi-v3-types-1.0.1.tgz", - "integrity": "sha512-UF9sjdiPbW4oWOfoPDudws+FENIugphf+VSF5W+FAgArTryxss6maeTr70EbfnYhvrjd5ZCm9ASMKv6CJMog7g==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@loopback/openapi-v3-types/-/openapi-v3-types-1.0.4.tgz", + "integrity": "sha512-ZdtMWIuPm8G9KB4LmaRHrshQKA6Klw0vrkMtjI3jABwrR5VNBEZwTYOtDtfmhYIQCS78UBWJ5eiXEsXzFei4HQ==", "requires": { "openapi3-ts": "^1.0.0" } }, "@loopback/repository": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@loopback/repository/-/repository-1.0.3.tgz", - "integrity": "sha512-CqHOv+/ZZCvRXUUyC7EssFT8g660SPmTJ9ksk4gESgkQsQPBtYDvldDLa8rYk2N8rXKqeZf06qRIHBtMFNX0Gw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@loopback/repository/-/repository-1.1.2.tgz", + "integrity": "sha512-/a756oP1f08fcbr2mLlHwJXR7zPGLqz4nT8QOu5jXdBBvYe4drijj9v7hNlbpMomrqRn7utwY0A8WlXldEYE+w==", "requires": { - "@loopback/context": "^1.0.1", - "@loopback/core": "^1.0.1", + "@loopback/context": "^1.4.1", + "@loopback/core": "^1.1.4", "@types/debug": "0.0.30", "debug": "^4.0.1", "lodash": "^4.17.10", @@ -473,34 +556,35 @@ } }, "@loopback/repository-json-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@loopback/repository-json-schema/-/repository-json-schema-1.2.0.tgz", - "integrity": "sha512-KQ5DN5ETPWimCEF2vKiUQvJ1FcNYu6c9lParLXNGamYGpsV3lN8LvxMWhvK/jbbrBhcYGP/20I8UXV7IkrDQZw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@loopback/repository-json-schema/-/repository-json-schema-1.2.6.tgz", + "integrity": "sha512-fG1utZU2d44k+y50q1oqVOkIIwIA2TrQSNO4h/eXCd/eYjX9Sth2zAYGv6mJt6zyxdZe4uq07ol5/I5pqJECJw==", "requires": { - "@loopback/context": "^1.0.1", - "@loopback/metadata": "^1.0.1", - "@loopback/repository": "^1.0.3", + "@loopback/context": "^1.4.1", + "@loopback/metadata": "^1.0.4", + "@loopback/repository": "^1.1.2", "@types/json-schema": "^7.0.1" } }, "@loopback/rest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@loopback/rest/-/rest-1.2.0.tgz", - "integrity": "sha512-sxp2Ralrhd+fZ/L6vqO+Wr53r1zhtobNO/zNJh5gSbgBxI7wy2j0t8dRP9znbsUHOvXBZvWskETdk8jjptldmg==", - "requires": { - "@loopback/context": "^1.0.1", - "@loopback/core": "^1.0.1", - "@loopback/http-server": "^1.0.1", - "@loopback/openapi-v3": "^1.1.0", - "@loopback/openapi-v3-types": "^1.0.1", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@loopback/rest/-/rest-1.5.2.tgz", + "integrity": "sha512-+7+XaWz6lifxKKzLVG9JIwpSOvIToUD5gvUOi2KvJjQdLm/in76z1FXhLam23lyIyc6CoExqnX1TmADspq193w==", + "requires": { + "@loopback/context": "^1.4.1", + "@loopback/core": "^1.1.4", + "@loopback/http-server": "^1.1.3", + "@loopback/openapi-v3": "^1.1.6", + "@loopback/openapi-v3-types": "^1.0.4", + "@types/body-parser": "^1.17.0", "@types/cors": "^2.8.3", "@types/express": "^4.11.1", "@types/express-serve-static-core": "^4.16.0", "@types/http-errors": "^1.6.1", - "@types/parseurl": "^1.3.1", "@types/serve-static": "1.13.2", + "@types/type-is": "^1.6.2", "ajv": "^6.5.1", - "body": "^5.1.0", + "body-parser": "^1.18.3", "cors": "^2.8.4", "debug": "^4.0.1", "express": "^4.16.3", @@ -509,7 +593,6 @@ "lodash": "^4.17.5", "openapi-schema-to-json-schema": "^2.1.0", "openapi3-ts": "^1.0.0", - "parseurl": "^1.3.2", "path-to-regexp": "^2.2.0", "qs": "^6.5.2", "strong-error-handler": "^3.2.0", @@ -525,33 +608,326 @@ } }, "@loopback/service-proxy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@loopback/service-proxy/-/service-proxy-1.0.1.tgz", - "integrity": "sha512-jLhlJ/VZbjTneBMlztphJ6FNQWGdw4HUYem9jds5eyooeZYUccCLDwhQtjQ2f59QN9/ZBieAUWHE8jtUlV5Ncg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@loopback/service-proxy/-/service-proxy-1.0.6.tgz", + "integrity": "sha512-B2f/FMZAbqlOx3JnE6a71DArk4KGRRp2GI6DNuxIztglvNeD3pvTsL16P5nlxd1/3eZbIRtcuVUCyVNiEmnHxw==", "requires": { - "@loopback/context": "^1.0.1", - "@loopback/core": "^1.0.1", + "@loopback/context": "^1.4.1", + "@loopback/core": "^1.1.4", "loopback-datasource-juggler": "^4.0.0" } }, "@loopback/testlab": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@loopback/testlab/-/testlab-1.0.1.tgz", - "integrity": "sha512-/gSlvIAnq2WtmUKj8i+UztFp1x1HVSljA/cBaMytJBD4eSkKTc9zbUXPH/0zDwgqUz7VgVJy7Th/ld6KcBnRFQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@loopback/testlab/-/testlab-1.0.4.tgz", + "integrity": "sha512-p3EWE69bqgvfohkL5frxDCT7oP7BS8SwG/3n8jwrbaOPqeekA1tWpYsUvMxXJDmmjY8rtmswaNm9QzUbJBnFvQ==", "dev": true, "requires": { - "@types/express": "^4.11.1", - "@types/fs-extra": "^5.0.1", - "@types/shot": "^3.4.0", - "@types/sinon": "^5.0.2", - "@types/supertest": "^2.0.4", - "express": "^4.16.3", - "fs-extra": "^7.0.0", - "oas-validator": "^1.1.9", - "shot": "^4.0.5", - "should": "^13.2.1", - "sinon": "^6.3.4", - "supertest": "^3.0.0" + "@types/express": "^4.16.0", + "@types/fs-extra": "^5.0.4", + "@types/shot": "^4.0.0", + "@types/sinon": "^7.0.2", + "@types/supertest": "^2.0.7", + "express": "^4.16.4", + "fs-extra": "^7.0.1", + "oas-validator": "^2.0.0", + "shot": "^4.0.7", + "should": "^13.2.3", + "sinon": "^7.2.2", + "supertest": "^3.3.0" + }, + "dependencies": { + "@sinonjs/formatio": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.1.0.tgz", + "integrity": "sha512-ZAR2bPHOl4Xg6eklUGpsdiIJ4+J1SNag1DHHrG/73Uz/nVwXqjgUtRPLoS+aVyieN9cSbc0E4LsU984tWcDyNg==", + "dev": true, + "requires": { + "@sinonjs/samsam": "^2 || ^3" + } + }, + "@sinonjs/samsam": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.0.2.tgz", + "integrity": "sha512-m08g4CS3J6lwRQk1pj1EO+KEVWbrbXsmi9Pw0ySmrIbcVxVaedoFgLvFsV8wHLwh01EpROVz3KvVcD1Jmks9FQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.0.2", + "array-from": "^2.1.1", + "lodash.get": "^4.4.2" + } + }, + "@types/shot": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/shot/-/shot-4.0.0.tgz", + "integrity": "sha512-Xv+n8yfccuicMlwBY58K5PVVNtXRm7uDzcwwmCarBxMP+XxGfnh1BI06YiVAsPbTAzcnYsrzpoS5QHeyV7LS8A==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/sinon": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-7.0.3.tgz", + "integrity": "sha512-cjmJQLx2B5Hp9SzO7rdSivipo3kBqRqeYkTW17nLST1tn5YLWBjTdnzdmeTJXA1+KrrBLsEuvKQ0fUPGrfazQg==", + "dev": true + }, + "@types/supertest": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.7.tgz", + "integrity": "sha512-GibTh4OTkal71btYe2fpZP/rVHIPnnUsYphEaoywVHo+mo2a/LhlOFkIm5wdN0H0DA0Hx8x+tKgCYMD9elHu5w==", + "dev": true, + "requires": { + "@types/superagent": "*" + } + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", + "dev": true + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "just-extend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz", + "integrity": "sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw==", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lolex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-3.0.0.tgz", + "integrity": "sha512-hcnW80h3j2lbUfFdMArd5UPA/vxZJ+G8vobd+wg3nVEQA0EigStbYcrG030FJxL6xiDDPEkoMatV9xIh5OecQQ==", + "dev": true + }, + "nise": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.4.8.tgz", + "integrity": "sha512-kGASVhuL4tlAV0tvA34yJYZIVihrUt/5bDwpp4tTluigxUr2bBlJeDXmivb6NuEdFkqvdv/Ybb9dm16PSKUhtw==", + "dev": true, + "requires": { + "@sinonjs/formatio": "^3.1.0", + "just-extend": "^4.0.2", + "lolex": "^2.3.2", + "path-to-regexp": "^1.7.0", + "text-encoding": "^0.6.4" + }, + "dependencies": { + "lolex": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz", + "integrity": "sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==", + "dev": true + } + } + }, + "oas-kit-common": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/oas-kit-common/-/oas-kit-common-1.0.6.tgz", + "integrity": "sha512-O2yrllppfpPFfeIrAlnUP+hxMgbwN5Hi8x9a1KGazZ4zlHJ+m6hj3jc2XO39q/fHxoJtjQgwSY2hAf9LBqlqCw==", + "dev": true, + "requires": { + "js-yaml": "^3.12.0" + } + }, + "oas-linter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/oas-linter/-/oas-linter-2.0.1.tgz", + "integrity": "sha512-wNkoc5JB7hWvc+Gt4b2i57uDxJg04epuyJ4i54f2etMLyRfaqfhvIY3MW8bS2xZ3twzaAeAJsMs6skWEA1+PCQ==", + "dev": true, + "requires": { + "js-yaml": "^3.12.0", + "should": "^13.2.1" + } + }, + "oas-resolver": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/oas-resolver/-/oas-resolver-1.1.1.tgz", + "integrity": "sha512-r7jWfhtW/eQ42/eqnUXMUS46jB+XoNlIOSkjN6ZQH+3tqPQHMwAqRUQTqdh+0Qw7IAipftb6zFVwyfE6kVCmGQ==", + "dev": true, + "requires": { + "js-yaml": "^3.12.0", + "node-fetch-h2": "^2.3.0", + "oas-kit-common": "^1.0.6", + "reftools": "^1.0.4", + "yargs": "^12.0.2" + } + }, + "oas-schema-walker": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/oas-schema-walker/-/oas-schema-walker-1.1.2.tgz", + "integrity": "sha512-Q9xqeUtc17ccP/dpUfARci4kwFFszyJAgR/wbDhrRR/73GqsY5uSmKaIK+RmBqO8J4jVYrrDPjQKvt1IcpQdGw==", + "dev": true + }, + "oas-validator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/oas-validator/-/oas-validator-2.0.1.tgz", + "integrity": "sha512-5hzVYqpp7YJ1A8akq0vuLs/lRp6UnKVSmwRj0qLSf39KruT0Wh7xpyy8s4/Eds7MSJ+dG7J49Lg96WImooyjBQ==", + "dev": true, + "requires": { + "ajv": "^5.5.2", + "better-ajv-errors": "^0.5.2", + "js-yaml": "^3.12.0", + "oas-kit-common": "^1.0.6", + "oas-linter": "^2.0.1", + "oas-resolver": "^1.1.1", + "oas-schema-walker": "^1.1.2", + "reftools": "^1.0.4", + "should": "^13.2.1" + } + }, + "p-limit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", + "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + }, + "reftools": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.0.4.tgz", + "integrity": "sha512-A0FKS2nFjcYabdsUCKp2ljafugUU62+782DVbs/xl6hz2jwK9ljUStmMbcx//+Wo/1M9TkxHCFTsoECF5kq/tA==", + "dev": true + }, + "sinon": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.2.2.tgz", + "integrity": "sha512-WLagdMHiEsrRmee3jr6IIDntOF4kbI6N2pfbi8wkv50qaUQcBglkzkjtoOEbeJ2vf1EsrHhLI+5Ny8//WHdMoA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.2.0", + "@sinonjs/formatio": "^3.1.0", + "@sinonjs/samsam": "^3.0.2", + "diff": "^3.5.0", + "lolex": "^3.0.0", + "nise": "^1.4.7", + "supports-color": "^5.5.0" + } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "@loopback/tslint-config": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@loopback/tslint-config/-/tslint-config-2.0.0.tgz", + "integrity": "sha512-fZqoCjwoeDsAzbDHjaiEPbK3v93+j3Z5g1qd1Jydug8UVrIGswjAYrDDTzmH29ZHgbwgU9yoFySUdYf/9YG3Yg==", + "dev": true, + "requires": { + "tslint-consistent-codestyle": "^1.14.1" } }, "@marionebl/sander": { @@ -574,32 +950,6 @@ "type-detect": "4.0.8" } }, - "@sinonjs/formatio": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.0.0.tgz", - "integrity": "sha512-vdjoYLDptCgvtJs57ULshak3iJe4NW3sJ3g36xVDGff5AE8P30S6A093EIEPjdi2noGhfuNOEkbxt3J3awFW1w==", - "dev": true, - "requires": { - "@sinonjs/samsam": "2.1.0" - }, - "dependencies": { - "@sinonjs/samsam": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-2.1.0.tgz", - "integrity": "sha512-5x2kFgJYupaF1ns/RmharQ90lQkd2ELS8A9X0ymkAAdemYHGtI2KiUHG8nX2WU0T1qgnOU5YMqnBM2V7NUanNw==", - "dev": true, - "requires": { - "array-from": "^2.1.1" - } - } - } - }, - "@sinonjs/samsam": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-2.1.2.tgz", - "integrity": "sha512-ZwTHAlC9akprWDinwEPD4kOuwaYZlyMwVJIANsKNC3QVp0AHB04m7RnB4eqeWfgmxw8MGTzS9uMaw93Z3QcZbw==", - "dev": true - }, "@types/bcryptjs": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.2.tgz", @@ -688,9 +1038,9 @@ } }, "@types/handlebars": { - "version": "4.0.39", - "resolved": "https://registry.npmjs.org/@types/handlebars/-/handlebars-4.0.39.tgz", - "integrity": "sha512-vjaS7Q0dVqFp85QhyPSZqDKnTTCemcSHNHFvDdalO1s0Ifz5KuE64jQD5xoUkfdWwF4WpqdJEl7LsWH8rzhKJA==", + "version": "4.0.40", + "resolved": "https://registry.npmjs.org/@types/handlebars/-/handlebars-4.0.40.tgz", + "integrity": "sha512-sGWNtsjNrLOdKha2RV1UeF8+UbQnPSG7qbe5wwbni0mw4h2gHXyPFUMOC+xwGirIiiydM/HSqjDO4rk6NFB18w==", "dev": true }, "@types/highlight.js": { @@ -709,6 +1059,14 @@ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.1.tgz", "integrity": "sha512-NVQEMviDWjuen3UW+mU1J6fZ0WhOfG1yRce/2OTcbaz+fgmTw2cahx6N2wh0Yl+a+hg2UZj/oElZmtULWyGIsA==" }, + "@types/jsonwebtoken": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.3.0.tgz", + "integrity": "sha512-YKnUTR4VxwljbPORPrRon9E3uel1aD8nUdvzqArCCdMTWPvo0gnI2UZkwIHN2QATdj6HYXV/Iq3/KcecAO42Ww==", + "requires": { + "@types/node": "*" + } + }, "@types/lodash": { "version": "4.14.118", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.118.tgz", @@ -738,16 +1096,16 @@ "dev": true }, "@types/node": { - "version": "10.12.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.3.tgz", - "integrity": "sha512-sfGmOtSMSbQ/AKG8V9xD1gmjquC9awIIZ/Kj309pHb2n3bcRAcGMQv5nJ6gCXZVsneGE4+ve8DXKRCsrg3TFzg==" + "version": "10.12.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", + "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==" }, - "@types/parseurl": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@types/parseurl/-/parseurl-1.3.1.tgz", - "integrity": "sha1-48sRAhYOSO+ln0l8TsIt7k87Wyc=", + "@types/passport": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.0.tgz", + "integrity": "sha512-R2FXqM+AgsMIym0PuKj08Ybx+GR6d2rU3b1/8OcHolJ+4ga2pRPX105wboV6hq1AJvMo2frQzYKdqXS5+4cyMw==", "requires": { - "@types/node": "*" + "@types/express": "*" } }, "@types/range-parser": { @@ -765,30 +1123,15 @@ } }, "@types/shelljs": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@types/shelljs/-/shelljs-0.8.0.tgz", - "integrity": "sha512-vs1hCC8RxLHRu2bwumNyYRNrU3o8BtZhLysH5A4I98iYmA2APl6R3uNQb5ihl+WiwH0xdC9LLO+vRrXLs/Kyxg==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@types/shelljs/-/shelljs-0.8.1.tgz", + "integrity": "sha512-1lQw+48BuVgp6c1+z8EMipp18IdnV2dLh6KQGwOm+kJy9nPjEkaqRKmwbDNEYf//EKBvKcwOC6V2cDrNxVoQeQ==", "dev": true, "requires": { "@types/glob": "*", "@types/node": "*" } }, - "@types/shot": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@types/shot/-/shot-3.4.2.tgz", - "integrity": "sha512-FxZK8HGgOFCVUHfhr6QF0dAMNONnmr8PSkA1Pob361lnQDyThm5/ZZbXmb4tZIXuxaPdXfFyNhqEgnC5A4I/Ng==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/sinon": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-5.0.5.tgz", - "integrity": "sha512-Wnuv66VhvAD2LEJfZkq8jowXGxe+gjVibeLCYcVBp7QLdw0BFx2sRkKzoiiDkYEPGg5VyqO805Rcj0stVjQwCQ==", - "dev": true - }, "@types/superagent": { "version": "3.8.4", "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-3.8.4.tgz", @@ -799,13 +1142,12 @@ "@types/node": "*" } }, - "@types/supertest": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.6.tgz", - "integrity": "sha512-qRvPP8dO7IBqJz8LaQ7/Lw2oo/geiDUPAMx/L+CQCkR9sN622O30XCH7RSyUmilyCSyjxyhJ7cEtd3hmwPwvhw==", - "dev": true, + "@types/type-is": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@types/type-is/-/type-is-1.6.2.tgz", + "integrity": "sha512-q8d51ZdF/D8xebrtNDsZH+4XBUFdz8xEgWhE4U4F4WWmcBZ8+i/r/qs9DmjAprYh5qQTYlY4BxaVKDrWIwNQ9w==", "requires": { - "@types/superagent": "*" + "@types/node": "*" } }, "JSONStream": { @@ -843,9 +1185,9 @@ } }, "ajv": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", - "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz", + "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==", "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", @@ -1097,47 +1439,15 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-2.0.1.tgz", "integrity": "sha512-FrMgLukB9jujvJ92p5TA0hcKIHtInVXXhxD7qgAuV7k0cbPt9USZmOYnhDXH6IsnGeIUglX42TSBV7Gn4q5sbQ==", "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "bluebird": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz", - "integrity": "sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==" - }, - "body": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz", - "integrity": "sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=", - "requires": { - "continuable-cache": "^0.3.1", - "error": "^7.0.0", - "raw-body": "~1.1.0", - "safe-json-parse": "~1.0.1" - }, - "dependencies": { - "bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", - "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=" - }, - "raw-body": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", - "integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=", - "requires": { - "bytes": "1", - "string_decoder": "0.10" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" } }, + "bluebird": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz", + "integrity": "sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==" + }, "body-parser": { "version": "1.18.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", @@ -1209,6 +1519,11 @@ "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.0.tgz", "integrity": "sha512-9Aeai9TacfNtWXOYarkFJRW2CWo+dRon+fuLZYJmvLV3+MiUp0bEI6IAZfXEIg7/Pl/7IWlLaDnhzTsD81etQA==" }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -1603,11 +1918,6 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, - "continuable-cache": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz", - "integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=" - }, "conventional-changelog-angular": { "version": "1.6.6", "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz", @@ -1775,9 +2085,9 @@ "dev": true }, "debug": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", - "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { "ms": "^2.1.1" } @@ -1898,6 +2208,14 @@ "safer-buffer": "^2.1.0" } }, + "ecdsa-sig-formatter": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz", + "integrity": "sha1-HFlQAPBKiJffuFAAiSoPTDOvhsM=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -1919,15 +2237,6 @@ "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", "dev": true }, - "error": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz", - "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=", - "requires": { - "string-template": "~0.2.1", - "xtend": "~4.0.0" - } - }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -2539,9 +2848,15 @@ } }, "http-status": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-status/-/http-status-1.2.0.tgz", - "integrity": "sha512-cSX+i/g4Kj5lkfOqS9w0SrxQF4hX7gsfikBtSDm5PFrAy+8fjRKk9+JRCG5cEZ40b6q6GOJk3P0QyDB5JpE0Ig==" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-status/-/http-status-1.3.1.tgz", + "integrity": "sha512-PcI9NUm6EUOhHlaxYABCqDQQWS7IgoBZ/PmPkhuzj+oR01ffjv3EJfKnnWJZcUhILtUh6/NdJi1Zs/mIr6v8DA==" + }, + "http2-client": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.1.tgz", + "integrity": "sha512-3oWAo1MOb8VlQ26wxydOP7cD4Kt0KAtMZhTrl2HWjBtiLCQ80zgr1mvt6iNyKiVTN2wHwOP290b8KfErNcVZlg==", + "dev": true }, "husky": { "version": "1.1.3", @@ -2744,6 +3059,12 @@ "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", "dev": true }, + "inversify": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/inversify/-/inversify-5.0.1.tgz", + "integrity": "sha512-Ieh06s48WnEYGcqHepdsJUIJUXpwH5o5vodAX+DK2JA/gjy4EbEcQZxw+uFfzysmKjiLXGYwNG3qDZsKVMcINQ==", + "dev": true + }, "invert-kv": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", @@ -3108,6 +3429,22 @@ "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", "dev": true }, + "jsonwebtoken": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.4.0.tgz", + "integrity": "sha512-coyXjRTCy0pw5WYBpMvWOMN+Kjaik2MwTUIq9cna/W7NpO9E+iYbumZONAz3hcr+tXFJECoQVrtmIoC3Oz0gvg==", + "requires": { + "jws": "^3.1.5", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1" + } + }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -3119,11 +3456,24 @@ "verror": "1.10.0" } }, - "just-extend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-3.0.0.tgz", - "integrity": "sha512-Fu3T6pKBuxjWT/p4DkqGHFRsysc8OauWr4ZRTY9dIx07Y9O0RkoR5jcv28aeD1vuAwhm3nLkDurwLXoALp4DpQ==", - "dev": true + "jwa": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.6.tgz", + "integrity": "sha512-tBO/cf++BUsJkYql/kBbJroKOgHWEigTKBAjjBEmrMGYd1QMBC74Hr4Wo2zCZw6ZrVhlJPvoMrkcOnlWR/DJfw==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.10", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.5.tgz", + "integrity": "sha512-GsCSexFADNQUr8T5HPJvayTjvPIfoyJPtLQBwn5a4WZQchcrPMPMAWcC1AzJVRDKyD6ZPROPAxgv6rfHViO4uQ==", + "requires": { + "jwa": "^1.1.5", + "safe-buffer": "^5.0.1" + } }, "kind-of": { "version": "3.2.2", @@ -3149,9 +3499,9 @@ "dev": true }, "linkify-it": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.0.3.tgz", - "integrity": "sha1-2UpGSPmxwXnWT6lykSaL22zpQ08=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.1.0.tgz", + "integrity": "sha512-4REs8/062kV2DSHxNfq5183zrqXMl7WP0WzABH9IeJI+NLm429FgE1PDecltYfnOoFDFlZGh2T8PfZn0r+GTRg==", "dev": true, "requires": { "uc.micro": "^1.0.1" @@ -3242,11 +3592,41 @@ "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", "dev": true }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, "lodash.isempty": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", "integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4=" }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, "lodash.kebabcase": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", @@ -3287,6 +3667,11 @@ "integrity": "sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA=", "dev": true }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, "lodash.partial": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/lodash.partial/-/lodash.partial-4.2.1.tgz", @@ -3355,12 +3740,6 @@ "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-4.3.0.tgz", "integrity": "sha1-o6bCsOvsxcLLocF+bmIP6BtT00c=" }, - "lolex": { - "version": "2.7.5", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz", - "integrity": "sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==", - "dev": true - }, "longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", @@ -3458,13 +3837,13 @@ } }, "loopback-datasource-juggler": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/loopback-datasource-juggler/-/loopback-datasource-juggler-4.2.1.tgz", - "integrity": "sha512-nXsPhydEguU183AKZavlH04wnJbtE054Od9KIexz9iA7zrzbICgfGn3bjvlilLLUTc6ldnsvyojhAUVOQyTRoA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/loopback-datasource-juggler/-/loopback-datasource-juggler-4.5.0.tgz", + "integrity": "sha512-0HuScgs2DyEcByp4w3m+/RwKcvo0yUzV0uTENndQr8F0rZBsyt7zMUs2zqUO+zG938lqz8/hdp3ifp++Jrh0Jw==", "requires": { "async": "^2.6.0", - "debug": "^3.1.0", - "depd": "^1.0.0", + "debug": "^4.1.0", + "depd": "^2.0.0", "inflection": "^1.6.0", "lodash": "^4.17.4", "loopback-connector": "^4.4.0", @@ -3476,13 +3855,10 @@ "uuid": "^3.0.1" }, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" } } }, @@ -3543,9 +3919,9 @@ } }, "marked": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.5.1.tgz", - "integrity": "sha512-iUkBZegCZou4AdwbKTwSW/lNDcz5OuRSl3qdcl31Ia0B2QPG0Jn+tKblh/9/eP9/6+4h27vpoh8wel/vQOV0vw==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.5.2.tgz", + "integrity": "sha512-fdZvBa7/vSQIZCi4uuwo2N3q+7jJURpMVCcbaX0S1Mg65WZ5ilXvC67MviJAsdjqqgD+CEq4RKo5AYGgINkVAA==", "dev": true }, "math-random": { @@ -3815,42 +4191,15 @@ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, - "nise": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.4.6.tgz", - "integrity": "sha512-1GedetLKzmqmgwabuMSqPsT7oumdR77SBpDfNNJhADRIeA3LN/2RVqR4fFqwvzhAqcTef6PPCzQwITE/YQ8S8A==", + "node-fetch-h2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz", + "integrity": "sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==", "dev": true, "requires": { - "@sinonjs/formatio": "3.0.0", - "just-extend": "^3.0.0", - "lolex": "^2.3.2", - "path-to-regexp": "^1.7.0", - "text-encoding": "^0.6.4" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "path-to-regexp": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", - "dev": true, - "requires": { - "isarray": "0.0.1" - } - } + "http2-client": "^1.2.5" } }, - "node-fetch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.2.1.tgz", - "integrity": "sha512-ObXBpNCD3A/vYQiQtEWl7DuqjAXjfptYFuGHLdPl5U19/6kJuZV+8uMHLrkj3wJrJoyfg4nhgyFixZdaZoAiEQ==", - "dev": true - }, "nopt": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.1.2.tgz", @@ -3930,7 +4279,8 @@ "dependencies": { "align-text": { "version": "0.1.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, "requires": { "kind-of": "^3.0.2", @@ -3940,17 +4290,20 @@ }, "amdefine": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "dev": true }, "ansi-regex": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "append-transform": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", "dev": true, "requires": { "default-require-extensions": "^2.0.0" @@ -3958,27 +4311,32 @@ }, "archy": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, "arrify": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, "async": { "version": "1.5.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true }, "balanced-match": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, "brace-expansion": { "version": "1.1.11", - "bundled": true, + "resolved": false, + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -3987,12 +4345,14 @@ }, "builtin-modules": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, "caching-transform": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-tTfemGmFWe7KZ3KN6VsSgQZbd9Bgo7A40wlp4PTsJJvFu4YAnEC5YnfdiKq6Vh2i9XJLnA9n8OXD46orVpnPMw==", "dev": true, "requires": { "make-dir": "^1.0.0", @@ -4003,13 +4363,15 @@ }, "camelcase": { "version": "1.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", "dev": true, "optional": true }, "center-align": { "version": "0.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "dev": true, "optional": true, "requires": { @@ -4019,7 +4381,8 @@ }, "cliui": { "version": "2.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "dev": true, "optional": true, "requires": { @@ -4030,7 +4393,8 @@ "dependencies": { "wordwrap": { "version": "0.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", "dev": true, "optional": true } @@ -4038,22 +4402,26 @@ }, "code-point-at": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, "commondir": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, "concat-map": { "version": "0.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "convert-source-map": { "version": "1.6.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", "dev": true, "requires": { "safe-buffer": "~5.1.1" @@ -4061,7 +4429,8 @@ }, "cross-spawn": { "version": "4.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", "dev": true, "requires": { "lru-cache": "^4.0.1", @@ -4070,7 +4439,8 @@ }, "debug": { "version": "3.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { "ms": "2.0.0" @@ -4078,17 +4448,20 @@ }, "debug-log": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", "dev": true }, "decamelize": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, "default-require-extensions": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", "dev": true, "requires": { "strip-bom": "^3.0.0" @@ -4096,7 +4469,8 @@ }, "error-ex": { "version": "1.3.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { "is-arrayish": "^0.2.1" @@ -4104,12 +4478,14 @@ }, "es6-error": { "version": "4.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, "execa": { "version": "0.7.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, "requires": { "cross-spawn": "^5.0.1", @@ -4123,7 +4499,8 @@ "dependencies": { "cross-spawn": { "version": "5.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { "lru-cache": "^4.0.1", @@ -4135,7 +4512,8 @@ }, "find-cache-dir": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", "dev": true, "requires": { "commondir": "^1.0.1", @@ -4145,7 +4523,8 @@ }, "find-up": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { "locate-path": "^3.0.0" @@ -4153,7 +4532,8 @@ }, "foreground-child": { "version": "1.5.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", "dev": true, "requires": { "cross-spawn": "^4", @@ -4162,22 +4542,26 @@ }, "fs.realpath": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "get-caller-file": { "version": "1.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, "get-stream": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "dev": true }, "glob": { "version": "7.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -4190,12 +4574,14 @@ }, "graceful-fs": { "version": "4.1.11", - "bundled": true, + "resolved": false, + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, "handlebars": { "version": "4.0.11", - "bundled": true, + "resolved": false, + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", "dev": true, "requires": { "async": "^1.4.0", @@ -4206,7 +4592,8 @@ "dependencies": { "source-map": { "version": "0.4.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { "amdefine": ">=0.0.4" @@ -4216,22 +4603,26 @@ }, "has-flag": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "hosted-git-info": { "version": "2.7.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", "dev": true }, "imurmurhash": { "version": "0.1.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, "inflight": { "version": "1.0.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { "once": "^1.3.0", @@ -4240,27 +4631,32 @@ }, "inherits": { "version": "2.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, "invert-kv": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true }, "is-arrayish": { "version": "0.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, "is-buffer": { "version": "1.1.6", - "bundled": true, + "resolved": false, + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, "is-builtin-module": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { "builtin-modules": "^1.0.0" @@ -4268,27 +4664,32 @@ }, "is-fullwidth-code-point": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "is-stream": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, "isexe": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "istanbul-lib-coverage": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA==", "dev": true }, "istanbul-lib-hook": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-ufiZoiJ8CxY577JJWEeFuxXZoMqiKpq/RqZtOAYuQLvlkbJWscq9n3gc4xrCGH9n4pW0qnTxOz1oyMmVtk8E1w==", "dev": true, "requires": { "append-transform": "^1.0.0" @@ -4296,7 +4697,8 @@ }, "istanbul-lib-report": { "version": "2.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-rJ8uR3peeIrwAxoDEbK4dJ7cqqtxBisZKCuwkMtMv0xYzaAnsAi3AHrHPAAtNXzG/bcCgZZ3OJVqm1DTi9ap2Q==", "dev": true, "requires": { "istanbul-lib-coverage": "^2.0.1", @@ -4306,7 +4708,8 @@ }, "istanbul-lib-source-maps": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-30l40ySg+gvBLcxTrLzR4Z2XTRj3HgRCA/p2rnbs/3OiTaoj054gAbuP5DcLOtwqmy4XW8qXBHzrmP2/bQ9i3A==", "dev": true, "requires": { "debug": "^3.1.0", @@ -4318,14 +4721,16 @@ "dependencies": { "source-map": { "version": "0.6.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "istanbul-reports": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-CT0QgMBJqs6NJLF678ZHcquUAZIoBIUNzdJrRJfpkI9OnzG6MkUfHxbJC3ln981dMswC7/B1mfX3LNkhgJxsuw==", "dev": true, "requires": { "handlebars": "^4.0.11" @@ -4333,12 +4738,14 @@ }, "json-parse-better-errors": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, "kind-of": { "version": "3.2.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -4346,13 +4753,15 @@ }, "lazy-cache": { "version": "1.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", "dev": true, "optional": true }, "lcid": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, "requires": { "invert-kv": "^1.0.0" @@ -4360,7 +4769,8 @@ }, "load-json-file": { "version": "4.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -4371,7 +4781,8 @@ }, "locate-path": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { "p-locate": "^3.0.0", @@ -4380,17 +4791,20 @@ }, "lodash.flattendeep": { "version": "4.4.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, "longest": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", "dev": true }, "lru-cache": { "version": "4.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", "dev": true, "requires": { "pseudomap": "^1.0.2", @@ -4399,7 +4813,8 @@ }, "make-dir": { "version": "1.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "requires": { "pify": "^3.0.0" @@ -4407,7 +4822,8 @@ }, "md5-hex": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM=", "dev": true, "requires": { "md5-o-matic": "^0.1.1" @@ -4415,12 +4831,14 @@ }, "md5-o-matic": { "version": "0.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=", "dev": true }, "mem": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "dev": true, "requires": { "mimic-fn": "^1.0.0" @@ -4428,7 +4846,8 @@ }, "merge-source-map": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", "dev": true, "requires": { "source-map": "^0.6.1" @@ -4436,19 +4855,22 @@ "dependencies": { "source-map": { "version": "0.6.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "mimic-fn": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, "minimatch": { "version": "3.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -4456,12 +4878,14 @@ }, "minimist": { "version": "0.0.10", - "bundled": true, + "resolved": false, + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", "dev": true }, "mkdirp": { "version": "0.5.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { "minimist": "0.0.8" @@ -4469,19 +4893,22 @@ "dependencies": { "minimist": { "version": "0.0.8", - "bundled": true, + "resolved": false, + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true } } }, "ms": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, "normalize-package-data": { "version": "2.4.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { "hosted-git-info": "^2.1.4", @@ -4492,7 +4919,8 @@ }, "npm-run-path": { "version": "2.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { "path-key": "^2.0.0" @@ -4500,12 +4928,14 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, "once": { "version": "1.4.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { "wrappy": "1" @@ -4513,7 +4943,8 @@ }, "optimist": { "version": "0.6.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { "minimist": "~0.0.1", @@ -4522,12 +4953,14 @@ }, "os-homedir": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, "os-locale": { "version": "2.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "dev": true, "requires": { "execa": "^0.7.0", @@ -4537,12 +4970,14 @@ }, "p-finally": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, "p-limit": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -4550,7 +4985,8 @@ }, "p-locate": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { "p-limit": "^2.0.0" @@ -4558,12 +4994,14 @@ }, "p-try": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", "dev": true }, "package-hash": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-eK4ybIngWk2BO2hgGXevBcANKg0=", "dev": true, "requires": { "graceful-fs": "^4.1.11", @@ -4574,7 +5012,8 @@ }, "parse-json": { "version": "4.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { "error-ex": "^1.3.1", @@ -4583,22 +5022,26 @@ }, "path-exists": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, "path-is-absolute": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "path-key": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, "path-type": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { "pify": "^3.0.0" @@ -4606,12 +5049,14 @@ }, "pify": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, "pkg-dir": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "requires": { "find-up": "^3.0.0" @@ -4619,12 +5064,14 @@ }, "pseudomap": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, "read-pkg": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "requires": { "load-json-file": "^4.0.0", @@ -4634,7 +5081,8 @@ }, "read-pkg-up": { "version": "4.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", "dev": true, "requires": { "find-up": "^3.0.0", @@ -4643,7 +5091,8 @@ }, "release-zalgo": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", "dev": true, "requires": { "es6-error": "^4.0.1" @@ -4651,27 +5100,32 @@ }, "repeat-string": { "version": "1.6.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, "require-directory": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, "require-main-filename": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, "resolve-from": { "version": "4.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, "right-align": { "version": "0.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "dev": true, "optional": true, "requires": { @@ -4680,7 +5134,8 @@ }, "rimraf": { "version": "2.6.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { "glob": "^7.0.5" @@ -4688,22 +5143,26 @@ }, "safe-buffer": { "version": "5.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, "semver": { "version": "5.5.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", "dev": true }, "set-blocking": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "shebang-command": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { "shebang-regex": "^1.0.0" @@ -4711,23 +5170,27 @@ }, "shebang-regex": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, "signal-exit": { "version": "3.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, "source-map": { "version": "0.5.7", - "bundled": true, + "resolved": false, + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true, "optional": true }, "spawn-wrap": { "version": "1.4.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", "dev": true, "requires": { "foreground-child": "^1.5.6", @@ -4740,7 +5203,8 @@ }, "spdx-correct": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -4749,12 +5213,14 @@ }, "spdx-exceptions": { "version": "2.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", "dev": true }, "spdx-expression-parse": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, "requires": { "spdx-exceptions": "^2.1.0", @@ -4763,12 +5229,14 @@ }, "spdx-license-ids": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", "dev": true }, "string-width": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", @@ -4777,7 +5245,8 @@ }, "strip-ansi": { "version": "4.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { "ansi-regex": "^3.0.0" @@ -4785,17 +5254,20 @@ }, "strip-bom": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, "strip-eof": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, "supports-color": { "version": "5.4.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -4803,7 +5275,8 @@ }, "test-exclude": { "version": "5.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-bO3Lj5+qFa9YLfYW2ZcXMOV1pmQvw+KS/DpjqhyX6Y6UZ8zstpZJ+mA2ERkXfpOqhxsJlQiLeVXD3Smsrs6oLw==", "dev": true, "requires": { "arrify": "^1.0.1", @@ -4814,7 +5287,8 @@ }, "uglify-js": { "version": "2.8.29", - "bundled": true, + "resolved": false, + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "dev": true, "optional": true, "requires": { @@ -4825,7 +5299,8 @@ "dependencies": { "yargs": { "version": "3.10.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "dev": true, "optional": true, "requires": { @@ -4839,18 +5314,21 @@ }, "uglify-to-browserify": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", "dev": true, "optional": true }, "uuid": { "version": "3.3.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", "dev": true }, "validate-npm-package-license": { "version": "3.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", "dev": true, "requires": { "spdx-correct": "^3.0.0", @@ -4859,7 +5337,8 @@ }, "which": { "version": "1.3.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -4867,23 +5346,27 @@ }, "which-module": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "window-size": { "version": "0.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", "dev": true, "optional": true }, "wordwrap": { "version": "0.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", "dev": true }, "wrap-ansi": { "version": "2.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { "string-width": "^1.0.1", @@ -4892,12 +5375,14 @@ "dependencies": { "ansi-regex": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { "number-is-nan": "^1.0.0" @@ -4905,7 +5390,8 @@ }, "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { "code-point-at": "^1.0.0", @@ -4915,7 +5401,8 @@ }, "strip-ansi": { "version": "3.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { "ansi-regex": "^2.0.0" @@ -4925,12 +5412,14 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "write-file-atomic": { "version": "2.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", "dev": true, "requires": { "graceful-fs": "^4.1.11", @@ -4940,17 +5429,20 @@ }, "y18n": { "version": "3.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", "dev": true }, "yallist": { "version": "2.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true }, "yargs": { "version": "11.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", "dev": true, "requires": { "cliui": "^4.0.0", @@ -4969,7 +5461,8 @@ "dependencies": { "cliui": { "version": "4.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { "string-width": "^2.1.1", @@ -4979,7 +5472,8 @@ }, "find-up": { "version": "2.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { "locate-path": "^2.0.0" @@ -4987,7 +5481,8 @@ }, "locate-path": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { "p-locate": "^2.0.0", @@ -4996,7 +5491,8 @@ }, "p-limit": { "version": "1.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { "p-try": "^1.0.0" @@ -5004,7 +5500,8 @@ }, "p-locate": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { "p-limit": "^1.1.0" @@ -5012,14 +5509,16 @@ }, "p-try": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true } } }, "yargs-parser": { "version": "9.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", "dev": true, "requires": { "camelcase": "^4.1.0" @@ -5027,91 +5526,14 @@ "dependencies": { "camelcase": { "version": "4.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", "dev": true } } } } }, - "oas-kit-common": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/oas-kit-common/-/oas-kit-common-1.0.3.tgz", - "integrity": "sha512-likga5DU40ahQBlLuPMoahlzckhsfbKAPaghgHRxmG0N98W7XQMlosMkNAkVAsze7D+xczcUETUhEpNgaOzJ0g==", - "dev": true - }, - "oas-linter": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/oas-linter/-/oas-linter-1.0.7.tgz", - "integrity": "sha512-tdtPl5d/EIrNvnvxcV7Bdky7AvMn9v3ZA6Y39vUMR8P3fkMUNkg8HXl7Zn4wHkFZW0Rzf6aNkNI1c3pjn5aSgQ==", - "dev": true, - "requires": { - "js-yaml": "^3.11.0", - "should": "^13.2.1" - } - }, - "oas-resolver": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/oas-resolver/-/oas-resolver-1.0.11.tgz", - "integrity": "sha512-qqd68y9Uowerfa5wTaWYN8/+k6UsMMoKzugCqolM/exytHcMYZ9NwHI9tFUeJFyGqA8A0DWPjUuZDIJDIlfKfw==", - "dev": true, - "requires": { - "js-yaml": "^3.11.0", - "node-fetch": "^2.1.1", - "oas-kit-common": "^1.0.3", - "reftools": "^1.0.2", - "yargs": "^11.0.0" - } - }, - "oas-schema-walker": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/oas-schema-walker/-/oas-schema-walker-1.1.0.tgz", - "integrity": "sha512-f1K+o/Ef1eNf3Iw4VP4WOnIajFc45A0goid8Dpb+Cgq2VbnYj6aaUxN5LL7XPPhleWgSMnU+DB8yMGVHJf8mBw==", - "dev": true - }, - "oas-validator": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/oas-validator/-/oas-validator-1.1.12.tgz", - "integrity": "sha512-eUkNjQ+8kvmMQJThmTve0l/bAgBUZlJJRAMtkyxFxZCYzFCyCM75HqXlVYJ2qGjk1oyJHmwdMUel1dEDOr9dqA==", - "dev": true, - "requires": { - "ajv": "^5.5.2", - "better-ajv-errors": "^0.5.2", - "js-yaml": "^3.11.0", - "oas-kit-common": "^1.0.3", - "oas-linter": "^1.0.7", - "oas-resolver": "^1.0.11", - "oas-schema-walker": "^1.1.0", - "reftools": "^1.0.2", - "should": "^13.2.1" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - } - } - }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -5290,6 +5712,20 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" }, + "passport": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.0.tgz", + "integrity": "sha1-xQlWkTR71a07XhgCOMORTRbwWBE=", + "requires": { + "passport-strategy": "1.x.x", + "pause": "0.0.1" + } + }, + "passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" + }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -5326,6 +5762,11 @@ "pify": "^3.0.0" } }, + "pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -5418,9 +5859,9 @@ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, "progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", - "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, "proxy-addr": { @@ -5585,12 +6026,6 @@ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.12.tgz", "integrity": "sha512-n+IyV+nGz3+0q3/Yf1ra12KpCyi001bi4XFxSjbiWWjfqb52iTTtpGXmCCAOWWIAn9KEuFZKGqBERHmrtScZ3A==" }, - "reftools": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.0.2.tgz", - "integrity": "sha512-J9oRulGxVKU1O+mx3HZ4ufBSD6lpDDfpVm8FISp35rRJCSQP/sysUBOk+mFLFRwm4c5LKfnnYClmwIB1CwtqfA==", - "dev": true - }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", @@ -5791,11 +6226,6 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "safe-json-parse": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz", - "integrity": "sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=" - }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -5892,9 +6322,9 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "shelljs": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.2.tgz", - "integrity": "sha512-pRXeNrCA2Wd9itwhvLp5LZQvPJ0wU6bcjaTMywHHGX5XWhVN2nzSu7WV0q+oUY7mGK3mgSkDDzP3MgjqdyIgbQ==", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz", + "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==", "dev": true, "requires": { "glob": "^7.0.0", @@ -5979,23 +6409,6 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, - "sinon": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-6.3.5.tgz", - "integrity": "sha512-xgoZ2gKjyVRcF08RrIQc+srnSyY1JDJtxu3Nsz07j1ffjgXoY6uPLf/qja6nDBZgzYYEovVkFryw2+KiZz11xQ==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.0.2", - "@sinonjs/formatio": "^3.0.0", - "@sinonjs/samsam": "^2.1.2", - "diff": "^3.5.0", - "lodash.get": "^4.4.2", - "lolex": "^2.7.5", - "nise": "^1.4.5", - "supports-color": "^5.5.0", - "type-detect": "^4.0.8" - } - }, "slash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", @@ -6113,11 +6526,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" }, - "string-template": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", - "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=" - }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -6186,9 +6594,9 @@ "dev": true }, "strong-docs": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/strong-docs/-/strong-docs-4.0.1.tgz", - "integrity": "sha512-q1r2swv8WFspG6VLyul0o4UB5RytrDuhGPn5ojMybp5/3mqQBrkQy0/ktodHwa3YAEmmMQB+Kev1xwQBPmCD5w==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/strong-docs/-/strong-docs-4.0.2.tgz", + "integrity": "sha512-AjAvo8w3PsIDcc41G0LrbnFhMVXxGRCuHGAbBIJQyYEVVA87Uh+/xl3UlNOKIjt9GXwyEna04zZ8iNH1zyBdSg==", "dev": true, "requires": { "debug": "^3.1.0", @@ -6428,9 +6836,9 @@ "dev": true }, "tslint": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.11.0.tgz", - "integrity": "sha1-mPMMAurjzecAYgHkwzywi0hYHu0=", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.12.1.tgz", + "integrity": "sha512-sfodBHOucFg6egff8d1BvuofoOQ/nOeYNfbp7LDlKBcLNrL3lmS5zoiDGyOMdT7YsEXAwWpTdAHwOGOc8eRZAw==", "dev": true, "requires": { "babel-code-frame": "^6.22.0", @@ -6447,6 +6855,17 @@ "tsutils": "^2.27.2" } }, + "tslint-consistent-codestyle": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/tslint-consistent-codestyle/-/tslint-consistent-codestyle-1.15.0.tgz", + "integrity": "sha512-6BNDBbZh2K0ibRXe70Mkl9gfVttxQ3t3hqV1BRDfpIcjrUoOgD946iH4SrXp+IggDgeMs3dJORjD5tqL5j4jXg==", + "dev": true, + "requires": { + "@fimbul/bifrost": "^0.17.0", + "tslib": "^1.7.1", + "tsutils": "^2.29.0" + } + }, "tsutils": { "version": "2.29.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", @@ -6530,9 +6949,9 @@ "dev": true }, "typescript": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.1.6.tgz", - "integrity": "sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz", + "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==", "dev": true }, "uc.micro": { @@ -6623,9 +7042,9 @@ } }, "validator": { - "version": "10.9.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-10.9.0.tgz", - "integrity": "sha512-hZJcZSWz9poXBlAkjjcsNAdrZ6JbjD3kWlNjq/+vE7RLLS/+8PAj3qVVwrwsOz/WL8jPmZ1hYkRvtlUeZAm4ug==" + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-10.10.0.tgz", + "integrity": "sha512-DyZyLJlMXM3CGdVaVHE/EDzCagMRoPI3mmGdxxNQbqkGqh56+M3d1i0ZAWd69En8U21DHbPTn12aOdhO+hfm5w==" }, "vary": { "version": "1.1.2", @@ -6719,7 +7138,8 @@ "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true }, "y18n": { "version": "3.2.1", @@ -6742,98 +7162,6 @@ "glob": "^7.0.5" } }, - "yargs": { - "version": "11.1.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", - "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - } - }, - "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } - } - }, "yargs-parser": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", diff --git a/package.json b/package.json index 891d340f2..460a4ebd9 100644 --- a/package.json +++ b/package.json @@ -51,17 +51,21 @@ "src" ], "dependencies": { - "@loopback/boot": "^1.0.3", - "@loopback/context": "^1.0.1", - "@loopback/core": "^1.0.1", - "@loopback/openapi-v3": "^1.1.0", - "@loopback/repository": "^1.0.3", - "@loopback/rest": "^1.2.0", - "@loopback/service-proxy": "^1.0.1", + "@loopback/authentication": "^1.0.9", + "@loopback/boot": "^1.0.9", + "@loopback/context": "^1.4.1", + "@loopback/core": "^1.1.4", + "@loopback/openapi-v3": "^1.1.6", + "@loopback/repository": "^1.1.2", + "@loopback/rest": "^1.5.2", + "@loopback/service-proxy": "^1.0.6", + "@types/jsonwebtoken": "^8.3.0", + "@types/passport": "^1.0.0", "bcryptjs": "^2.4.3", "debug": "^4.1.0", "express": "^4.16.4", "isemail": "^3.2.0", + "jsonwebtoken": "^8.4.0", "lodash": "^4.17.11", "loopback-connector-kv-redis": "^3.0.0", "loopback-connector-mongodb": "^3.9.2", @@ -71,20 +75,23 @@ "@commitlint/cli": "^7.2.1", "@commitlint/config-conventional": "^7.1.2", "@commitlint/travis-cli": "^7.2.1", - "@loopback/build": "^1.0.1", - "@loopback/testlab": "^1.0.1", + "@loopback/build": "^1.2.0", + "@loopback/testlab": "^1.0.4", + "@loopback/tslint-config": "^2.0.0", "@types/bcryptjs": "^2.4.2", "@types/debug": "0.0.31", "@types/express": "^4.16.0", "@types/lodash": "^4.14.118", "@types/mocha": "^5.0.0", - "@types/node": "^10.12.3", + "@types/node": "^10.12.12", "commitizen": "^3.0.4", "concurrently": "^4.0.1", "cz-conventional-changelog": "^2.1.0", "husky": "^1.1.3", "mocha": "^5.2.0", - "source-map-support": "^0.5.9" + "source-map-support": "^0.5.9", + "typescript": "3.2.2", + "tslint": "5.12.1" }, "copyright.owner": "IBM Corp.", "config": { diff --git a/src/application.ts b/src/application.ts index 21720978e..f683d4d85 100644 --- a/src/application.ts +++ b/src/application.ts @@ -10,6 +10,12 @@ import {RestApplication} from '@loopback/rest'; import {ServiceMixin} from '@loopback/service-proxy'; import {MySequence} from './sequence'; import * as path from 'path'; +import { + AuthenticationBindings, + AuthenticationComponent, +} from '@loopback/authentication'; +import {StrategyResolverProvider} from './providers/strategy.resolver.provider'; +import {AuthenticateActionProvider} from './providers/custom.authentication.provider'; /** * Information from package.json @@ -32,6 +38,14 @@ export class ShoppingApplication extends BootMixin( // Bind package.json to the application context this.bind(PackageKey).to(pkg); + this.component(AuthenticationComponent); + this.bind(AuthenticationBindings.AUTH_ACTION).toProvider( + AuthenticateActionProvider, + ); + this.bind(AuthenticationBindings.STRATEGY).toProvider( + StrategyResolverProvider, + ); + // Set up the custom sequence this.sequence(MySequence); diff --git a/src/authentication-strategies/JWT.strategy.ts b/src/authentication-strategies/JWT.strategy.ts new file mode 100644 index 000000000..80d269257 --- /dev/null +++ b/src/authentication-strategies/JWT.strategy.ts @@ -0,0 +1,34 @@ +const jwt = require('jsonwebtoken'); +import {promisify} from 'util'; +const verifyAsync = promisify(jwt.verify); +// Consider turn it to a binding +const SECRET = 'secretforjwt'; +import {Request, HttpErrors} from '@loopback/rest'; +import {UserProfile} from '@loopback/authentication'; +import * as _ from 'lodash'; +import {AuthenticationStrategy} from './authentication.strategy'; + +export class JWTStrategy implements AuthenticationStrategy { + async authenticate(request: Request): Promise { + let token = request.query.access_token || request.headers['authorization']; + if (!token) throw new HttpErrors.Unauthorized('No access token found!'); + + if (token.startsWith('Bearer ')) { + token = token.slice(7, token.length); + } + + try { + const decoded = await verifyAsync(token, SECRET); + let user = _.pick(decoded, ['id', 'email', 'firstName']); + (user as UserProfile).name = user.firstName; + delete user.firstName; + return user; + } catch (err) { + Object.assign(err, { + code: 'INVALID_ACCESS_TOKEN', + statusCode: 401, + }); + throw err; + } + } +} diff --git a/src/authentication-strategies/authentication.strategy.ts b/src/authentication-strategies/authentication.strategy.ts new file mode 100644 index 000000000..84934d518 --- /dev/null +++ b/src/authentication-strategies/authentication.strategy.ts @@ -0,0 +1,15 @@ +import {UserProfile} from '@loopback/authentication'; +import {Request} from '@loopback/rest'; + +/** + * An interface describes the common authentication strategy. + * + * An authentication strategy is usually a class with an + * authenticate method that verifies a user's identity and + * returns the corresponding user profile. + * + * Please note this file should be moved to @loopback/authentication + */ +export interface AuthenticationStrategy { + authenticate(request: Request): Promise; +} diff --git a/src/controllers/user.controller.ts b/src/controllers/user.controller.ts index f0c80518f..7989cc149 100644 --- a/src/controllers/user.controller.ts +++ b/src/controllers/user.controller.ts @@ -9,17 +9,40 @@ import {User, Product} from '../models'; import {UserRepository} from '../repositories'; import {hash} from 'bcryptjs'; import {promisify} from 'util'; -import * as isemail from 'isemail'; import {RecommenderService} from '../services/recommender.service'; -import {inject} from '@loopback/core'; +import {inject, Setter} from '@loopback/core'; +import { + authenticate, + UserProfile, + AuthenticationBindings, +} from '@loopback/authentication'; +import {Credentials} from '../repositories/user.repository'; +import { + validateCredentials, + getAccessTokenForUser, +} from '../utils/user.authentication'; +import * as isemail from 'isemail'; const hashAsync = promisify(hash); +// TODO(jannyHou): This should be moved to @loopback/authentication +const UserProfileSchema = { + type: 'object', + required: ['id'], + properties: { + id: {type: 'string'}, + email: {type: 'string'}, + name: {type: 'string'}, + }, +}; + export class UserController { constructor( @repository(UserRepository) public userRepository: UserRepository, @inject('services.RecommenderService') public recommender: RecommenderService, + @inject.setter(AuthenticationBindings.CURRENT_USER) + public setCurrentUser: Setter, ) {} @post('/users') @@ -65,6 +88,30 @@ export class UserController { }); } + @get('/users/me', { + responses: { + '200': { + description: 'The current user profile', + content: { + 'application/json': { + schema: UserProfileSchema, + }, + }, + }, + }, + }) + @authenticate('jwt') + async printCurrentUser( + @inject('authentication.currentUser') currentUser: UserProfile, + ): Promise { + return currentUser; + } + + // TODO(@jannyHou): missing logout function. + // as a stateless authentication method, JWT doesn't actually + // have a logout operation. See article for details: + // https://medium.com/devgorilla/how-to-log-out-when-using-jwt-a8c7823e8a6 + @get('/users/{userId}/recommend', { responses: { '200': { @@ -87,4 +134,31 @@ export class UserController { ): Promise { return this.recommender.getProductRecommendations(userId); } + + @post('/users/login', { + responses: { + '200': { + description: 'Token', + content: { + 'application/json': { + schema: { + type: 'object', + properties: { + token: { + type: 'string', + }, + }, + }, + }, + }, + }, + }, + }) + async login( + @requestBody() credentials: Credentials, + ): Promise<{token: string}> { + validateCredentials(credentials); + const token = await getAccessTokenForUser(this.userRepository, credentials); + return {token}; + } } diff --git a/src/providers/custom.authentication.provider.ts b/src/providers/custom.authentication.provider.ts new file mode 100644 index 000000000..52fc443d4 --- /dev/null +++ b/src/providers/custom.authentication.provider.ts @@ -0,0 +1,56 @@ +// Copyright IBM Corp. 2017,2018. All Rights Reserved. +// Node module: @loopback/authentication +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +import {Getter, Provider, Setter, inject} from '@loopback/context'; +import {Request} from '@loopback/rest'; +import {AuthenticationBindings} from '@loopback/authentication'; +import {AuthenticateFn, UserProfile} from '@loopback/authentication'; +import {AuthenticationStrategy} from '../authentication-strategies/authentication.strategy'; + +/** + * @description Provider of a function which authenticates + * @example `context.bind('authentication_key') + * .toProvider(AuthenticateActionProvider)` + */ +export class AuthenticateActionProvider implements Provider { + constructor( + // The provider is instantiated for Sequence constructor, + // at which time we don't have information about the current + // route yet. This information is needed to determine + // what auth strategy should be used. + // To solve this, we are injecting a getter function that will + // defer resolution of the strategy until authenticate() action + // is executed. + @inject.getter(AuthenticationBindings.STRATEGY) + readonly getStrategy: Getter, + @inject.setter(AuthenticationBindings.CURRENT_USER) + readonly setCurrentUser: Setter, + ) {} + + /** + * @returns authenticateFn + */ + value(): AuthenticateFn { + return request => this.action(request); + } + + /** + * The implementation of authenticate() sequence action. + * @param request The incoming request provided by the REST layer + */ + async action(request: Request): Promise { + const strategy = await this.getStrategy(); + if (!strategy) { + // The invoked operation does not require authentication. + return undefined; + } + if (!strategy.authenticate) { + throw new Error('invalid strategy parameter'); + } + const user = await strategy.authenticate(request); + if (user) this.setCurrentUser(user); + return user; + } +} diff --git a/src/providers/index.ts b/src/providers/index.ts new file mode 100644 index 000000000..c4eed6b7b --- /dev/null +++ b/src/providers/index.ts @@ -0,0 +1,2 @@ +export * from './strategy.resolver.provider'; +export * from './custom.authentication.provider'; diff --git a/src/providers/strategy.resolver.provider.ts b/src/providers/strategy.resolver.provider.ts new file mode 100644 index 000000000..4e3b9ad45 --- /dev/null +++ b/src/providers/strategy.resolver.provider.ts @@ -0,0 +1,27 @@ +import {Provider, ValueOrPromise} from '@loopback/core'; +import {inject} from '@loopback/context'; +import { + AuthenticationBindings, + AuthenticationMetadata, +} from '@loopback/authentication'; +import {JWTStrategy} from '../authentication-strategies/JWT.strategy'; +export class StrategyResolverProvider + implements Provider { + constructor( + @inject(AuthenticationBindings.METADATA) + private metadata: AuthenticationMetadata, + ) {} + value(): ValueOrPromise { + if (!this.metadata) { + return; + } + + const name = this.metadata.strategy; + // This should be extensible + if (name === 'jwt') { + return new JWTStrategy(); + } else { + throw new Error(`The strategy ${name} is not available.`); + } + } +} diff --git a/src/repositories/user.repository.ts b/src/repositories/user.repository.ts index 74580ce5b..7329f6227 100644 --- a/src/repositories/user.repository.ts +++ b/src/repositories/user.repository.ts @@ -12,6 +12,10 @@ import { import {User, Order} from '../models'; import {inject} from '@loopback/core'; import {OrderRepository} from './order.repository'; +export type Credentials = { + email: string; + password: string; +}; export class UserRepository extends DefaultCrudRepository< User, @@ -24,7 +28,7 @@ export class UserRepository extends DefaultCrudRepository< @repository(OrderRepository) protected orderRepository: OrderRepository, ) { super(User, datasource); - this.orders = this._createHasManyRepositoryFactoryFor( + this.orders = this.createHasManyRepositoryFactoryFor( 'orders', async () => orderRepository, ); diff --git a/src/sequence.ts b/src/sequence.ts index 605a6a77a..7d2118e85 100644 --- a/src/sequence.ts +++ b/src/sequence.ts @@ -14,6 +14,7 @@ import { Send, SequenceHandler, } from '@loopback/rest'; +import {AuthenticationBindings, AuthenticateFn} from '@loopback/authentication'; const SequenceActions = RestBindings.SequenceActions; @@ -24,12 +25,15 @@ export class MySequence implements SequenceHandler { @inject(SequenceActions.INVOKE_METHOD) protected invoke: InvokeMethod, @inject(SequenceActions.SEND) public send: Send, @inject(SequenceActions.REJECT) public reject: Reject, + @inject(AuthenticationBindings.AUTH_ACTION) + protected authenticateRequest: AuthenticateFn, ) {} async handle(context: RequestContext) { try { const {request, response} = context; const route = this.findRoute(request); + await this.authenticateRequest(request); const args = await this.parseParams(request, route); const result = await this.invoke(route, args); this.send(response, result); diff --git a/src/utils/user.authentication.ts b/src/utils/user.authentication.ts new file mode 100644 index 000000000..9b6d0f37b --- /dev/null +++ b/src/utils/user.authentication.ts @@ -0,0 +1,43 @@ +import * as _ from 'lodash'; +import {Credentials, UserRepository} from '../repositories/user.repository'; +import {toJSON} from '@loopback/testlab'; +import {promisify} from 'util'; +import * as isemail from 'isemail'; +import {HttpErrors} from '@loopback/rest'; +const jwt = require('jsonwebtoken'); +const signAsync = promisify(jwt.sign); + +export async function getAccessTokenForUser( + userRepository: UserRepository, + credentials: Credentials, +): Promise { + const foundUser = await userRepository.findOne({ + where: {email: credentials.email, password: credentials.password}, + }); + if (!foundUser) { + throw new HttpErrors.Unauthorized('Wrong credentials!'); + } + + const currentUser = _.pick(toJSON(foundUser), ['id', 'email', 'firstName']); + + // Generate user token using JWT + const token = await signAsync(currentUser, 'secretforjwt', { + expiresIn: 300, + }); + + return token; +} + +export function validateCredentials(credentials: Credentials) { + // Validate Email + if (!isemail.validate(credentials.email)) { + throw new HttpErrors.UnprocessableEntity('invalid email'); + } + + // Validate Password Length + if (credentials.password.length < 8) { + throw new HttpErrors.UnprocessableEntity( + 'password must be minimum 8 characters', + ); + } +} diff --git a/test/acceptance/user-order.controller.acceptance.ts b/test/acceptance/user-order.controller.acceptance.ts index c1548bb33..8a8bc199a 100644 --- a/test/acceptance/user-order.controller.acceptance.ts +++ b/test/acceptance/user-order.controller.acceptance.ts @@ -13,8 +13,9 @@ import {setupApplication} from './helper'; describe('UserOrderController acceptance tests', () => { let app: ShoppingApplication; let client: supertest.SuperTest; - const orderRepo = new OrderRepository(new MongoDataSource()); - const userRepo = new UserRepository(new MongoDataSource(), orderRepo); + const mongodbDS = new MongoDataSource(); + const orderRepo = new OrderRepository(mongodbDS); + const userRepo = new UserRepository(mongodbDS, orderRepo); before('setupApplication', async () => { ({app, client} = await setupApplication()); diff --git a/test/acceptance/user.controller.acceptance.ts b/test/acceptance/user.controller.acceptance.ts index 04846fc4a..1fe45a6df 100644 --- a/test/acceptance/user.controller.acceptance.ts +++ b/test/acceptance/user.controller.acceptance.ts @@ -3,20 +3,24 @@ // This file is licensed under the MIT License. // License text available at https://opensource.org/licenses/MIT -import {Client, expect} from '@loopback/testlab'; +import {Client, expect, toJSON} from '@loopback/testlab'; +import {Response} from 'superagent'; import {ShoppingApplication} from '../..'; import {UserRepository, OrderRepository} from '../../src/repositories'; import {MongoDataSource} from '../../src/datasources'; import {setupApplication} from './helper'; import {createRecommendationServer} from '../../recommender'; import {Server} from 'http'; +import * as _ from 'lodash'; +import {getAccessTokenForUser} from '../../src/utils/user.authentication'; const recommendations = require('../../recommender/recommendations.json'); describe('UserController', () => { let app: ShoppingApplication; let client: Client; - const orderRepo = new OrderRepository(new MongoDataSource()); - const userRepo = new UserRepository(new MongoDataSource(), orderRepo); + const mongodbDS = new MongoDataSource(); + const orderRepo = new OrderRepository(mongodbDS); + const userRepo = new UserRepository(mongodbDS, orderRepo); const user = { email: 'test@loopback.io', @@ -130,6 +134,59 @@ describe('UserController', () => { }); }); + describe('authentication functions', () => { + it('login returns a valid token', async () => { + const newUser = await userRepo.create(user); + await client + .post('/users/login') + .send({email: newUser.email, password: newUser.password}) + .expect(200) + .then(getToken); + + function getToken(res: Response) { + const token = res.body.token; + expect(token).to.not.be.empty(); + } + }); + + it('login returns an error when invalid credentials are used', async () => { + const newUser = await userRepo.create(user); + newUser.password = 'wrong password'; + await client + .post('/users/login') + .send({email: newUser.email, password: newUser.password}) + .expect(401); + }); + + it('/me returns the current user', async () => { + const newUser = await userRepo.create(user); + const token = await getAccessTokenForUser(userRepo, { + email: newUser.email, + password: newUser.password, + }); + + // MongoDB returns an id object we need to convert to string + // since the REST API returns a string for the id property. + newUser.id = newUser.id.toString(); + const me = _.pick(toJSON(newUser), ['id', 'email']); + + await client + .get('/users/me') + .set('Authorization', 'Bearer ' + token) + .expect(200, me); + }); + + it('/me returns 401 when the token is not provided', async () => { + const newUser = await userRepo.create(user); + await getAccessTokenForUser(userRepo, { + email: newUser.email, + password: newUser.password, + }); + + await client.get('/users/me').expect(401); + }); + }); + async function clearDatabase() { await userRepo.deleteAll(); }