diff --git a/.circleci/.env b/.circleci/.env new file mode 100644 index 0000000..45e5e71 --- /dev/null +++ b/.circleci/.env @@ -0,0 +1,7 @@ +FRONTEND_URL=https://test.com + +DATABASE_URL=mysql://user:password@localhost:3306/database +CONNECTION_STR=mongodb://user:password@localhost:27017/database + +SESSION_SECRET=test +EMAIL_SECRET=test \ No newline at end of file diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000..a6c70bd --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,60 @@ +version: 2.1 +jobs: + build: + docker: + - image: circleci/node:12 + - image: circleci/mysql:5.7 + environment: + MYSQL_ROOT_PASSWORD: password + MYSQL_DATABASE: database + MYSQL_USER: user + MYSQL_PASSWORD: password + - image: mongo:latest + environment: + MONGO_INITDB_ROOT_USERNAME: root + MONGO_INITDB_ROOT_PASSWORD: password + MONGO_INITDB_DATABASE: database + working_directory: ~/build + steps: + - checkout + - run: + name: Install MongoDB Shell + command: | + curl https://www.mongodb.org/static/pgp/server-4.2.asc | sudo apt-key add - + echo "deb http://repo.mongodb.org/apt/debian stretch/mongodb-org/4.2 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.2.list + sudo apt-get update + sudo apt-get install -y mongodb-org-shell + - run: + name: Configure MongoDB + command: mongo -u root -p password < ./mongo-init.js + - restore_cache: + keys: + - v1-dependencies-{{ checksum "package.json" }} + - v1-dependencies- + - run: + name: Install + command: npm install + - save_cache: + paths: + - node_modules + key: v1-dependencies-{{ checksum "package.json" }} + - run: + name: Test + command: npm run test #-circleci + deploy: + docker: + - image: circleci/node:12 + steps: + - run: sudo apt-get install sshpass -y + - run: sshpass -p ${PASSWORD} ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o PreferredAuthentications=password denis@35.225.244.173 './deploy.sh' +workflows: + version: 2 + build-and-deploy: + jobs: + - build + - deploy: + requires: + - build + filters: + branches: + only: feature/hw-12 # master, develop diff --git a/.gitignore b/.gitignore index 39e22bb..113cdaf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ node_modules -.env +/.env service-key.json -gcs-key.json \ No newline at end of file +gcs-key.json +deploy.sh \ No newline at end of file diff --git a/__mocks__/@google-cloud/storage.js b/__mocks__/@google-cloud/storage.js new file mode 100644 index 0000000..be1d31e --- /dev/null +++ b/__mocks__/@google-cloud/storage.js @@ -0,0 +1,11 @@ +/* eslint-disable */ + +class Storage { + constructor() { + this.bucket = jest.fn(() => {}) + } + bucket() { + jest.fn(() => {}) + } +} +module.exports = { Storage } diff --git a/__mocks__/ioredis.js b/__mocks__/ioredis.js new file mode 100644 index 0000000..8f153d7 --- /dev/null +++ b/__mocks__/ioredis.js @@ -0,0 +1,4 @@ +/* eslint-disable */ +const redis = require('redis-mock') + +module.exports = jest.fn(() => redis.createClient()) diff --git a/__mocks__/passport-facebook.js b/__mocks__/passport-facebook.js new file mode 100644 index 0000000..f512644 --- /dev/null +++ b/__mocks__/passport-facebook.js @@ -0,0 +1,31 @@ +const { Strategy } = require('passport') +const faker = require('faker') + +class MockStrategy extends Strategy { + constructor(options, verify) { + super() + this.user = { + id: faker.random.number(), + name: { + givenName: faker.name.firstName(), + familyName: faker.name.lastName() + }, + _json: { + email: faker.internet.email() + } + } + this.name = 'facebook' + this.options = options + this.verify = verify + } + + authenticate(req) { + if (req.query.code) return this.redirect('/') + this.verify(null, null, this.user, (err, user) => { + if (err) return this.fail(err) + return this.success(user) + }) + } +} + +module.exports = MockStrategy diff --git a/__mocks__/passport-google-oauth20.js b/__mocks__/passport-google-oauth20.js new file mode 100644 index 0000000..7cac013 --- /dev/null +++ b/__mocks__/passport-google-oauth20.js @@ -0,0 +1,29 @@ +const { Strategy } = require('passport') +const faker = require('faker') + +class MockStrategy extends Strategy { + constructor(options, verify) { + super() + this.user = { + id: faker.random.number(), + _json: { + given_name: faker.name.firstName(), + family_name: faker.name.lastName(), + email: faker.internet.email() + } + } + this.name = 'google' + this.options = options + this.verify = verify + } + + authenticate(req) { + if (req.query.code) return this.redirect('/') + this.verify(null, null, this.user, (err, user) => { + if (err) return this.fail(err) + return this.success(user) + }) + } +} + +module.exports = MockStrategy diff --git a/__mocks__/sharp.js b/__mocks__/sharp.js new file mode 100644 index 0000000..49e4b9c --- /dev/null +++ b/__mocks__/sharp.js @@ -0,0 +1,7 @@ +const { Transform } = require('stream') + +const resize = new Transform({ + transform: (chunk, enc, done) => done(null, chunk) +}) + +module.exports = () => ({ resize: () => resize }) diff --git a/__mocks__/stripe.js b/__mocks__/stripe.js new file mode 100644 index 0000000..d691086 --- /dev/null +++ b/__mocks__/stripe.js @@ -0,0 +1,6 @@ +/* eslint-disable */ +class Stripe {} +const stripe = jest.fn(() => new Stripe()) + +module.exports = stripe +module.exports.Stripe = Stripe diff --git a/__mocks__/winston.js b/__mocks__/winston.js new file mode 100644 index 0000000..2d73cef --- /dev/null +++ b/__mocks__/winston.js @@ -0,0 +1,21 @@ +/* eslint-disable */ +const winston = { + format: { + combine: jest.fn(), + splat: jest.fn(), + simple: jest.fn() + }, + transports: jest.fn(), + createLogger: jest.fn(() => { + return { + info: jest.fn(), + error: jest.fn(), + end: jest.fn() + } + }) +} + +winston.transports.Console = jest.fn() +winston.transports.MongoDB = jest.fn() + +module.exports = winston diff --git a/coverage/clover.xml b/coverage/clover.xml new file mode 100644 index 0000000..b7e8e86 --- /dev/null +++ b/coverage/clover.xml @@ -0,0 +1,770 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json new file mode 100644 index 0000000..7641316 --- /dev/null +++ b/coverage/coverage-final.json @@ -0,0 +1,37 @@ +{"/home/denis/Zazmic_Internship/hw5/index.js": {"path":"/home/denis/Zazmic_Internship/hw5/index.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":26}},"1":{"start":{"line":2,"column":13},"end":{"line":2,"column":28}},"2":{"start":{"line":3,"column":16},"end":{"line":3,"column":34}},"3":{"start":{"line":4,"column":16},"end":{"line":4,"column":42}},"4":{"start":{"line":5,"column":17},"end":{"line":5,"column":36}},"5":{"start":{"line":8,"column":24},"end":{"line":8,"column":52}},"6":{"start":{"line":11,"column":11},"end":{"line":11,"column":39}},"7":{"start":{"line":12,"column":0},"end":{"line":12,"column":36}},"8":{"start":{"line":14,"column":21},"end":{"line":14,"column":45}},"9":{"start":{"line":15,"column":22},"end":{"line":15,"column":43}},"10":{"start":{"line":16,"column":15},"end":{"line":16,"column":56}},"11":{"start":{"line":19,"column":12},"end":{"line":19,"column":21}},"12":{"start":{"line":21,"column":0},"end":{"line":21,"column":61}},"13":{"start":{"line":22,"column":0},"end":{"line":22,"column":23}},"14":{"start":{"line":25,"column":15},"end":{"line":25,"column":67}},"15":{"start":{"line":26,"column":0},"end":{"line":34,"column":1}},"16":{"start":{"line":35,"column":0},"end":{"line":35,"column":30}},"17":{"start":{"line":36,"column":0},"end":{"line":36,"column":27}},"18":{"start":{"line":38,"column":0},"end":{"line":38,"column":25}},"19":{"start":{"line":40,"column":45},"end":{"line":40,"column":91}},"20":{"start":{"line":41,"column":0},"end":{"line":41,"column":32}},"21":{"start":{"line":42,"column":0},"end":{"line":42,"column":33}},"22":{"start":{"line":43,"column":0},"end":{"line":43,"column":35}},"23":{"start":{"line":44,"column":0},"end":{"line":44,"column":38}},"24":{"start":{"line":47,"column":0},"end":{"line":47,"column":37}},"25":{"start":{"line":50,"column":15},"end":{"line":50,"column":34}},"26":{"start":{"line":51,"column":0},"end":{"line":51,"column":15}},"27":{"start":{"line":54,"column":0},"end":{"line":58,"column":2}},"28":{"start":{"line":55,"column":15},"end":{"line":55,"column":37}},"29":{"start":{"line":56,"column":1},"end":{"line":56,"column":19}},"30":{"start":{"line":57,"column":1},"end":{"line":57,"column":12}},"31":{"start":{"line":59,"column":0},"end":{"line":62,"column":2}},"32":{"start":{"line":60,"column":1},"end":{"line":60,"column":32}},"33":{"start":{"line":61,"column":1},"end":{"line":61,"column":26}},"34":{"start":{"line":64,"column":15},"end":{"line":64,"column":37}},"35":{"start":{"line":66,"column":11},"end":{"line":66,"column":73}},"36":{"start":{"line":67,"column":0},"end":{"line":67,"column":23}},"37":{"start":{"line":70,"column":0},"end":{"line":77,"column":90}},"38":{"start":{"line":72,"column":2},"end":{"line":75,"column":4}},"39":{"start":{"line":73,"column":3},"end":{"line":73,"column":84}},"40":{"start":{"line":73,"column":12},"end":{"line":73,"column":84}},"41":{"start":{"line":74,"column":3},"end":{"line":74,"column":44}},"42":{"start":{"line":77,"column":15},"end":{"line":77,"column":89}},"43":{"start":{"line":79,"column":0},"end":{"line":79,"column":20}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":54,"column":8},"end":{"line":54,"column":9}},"loc":{"start":{"line":54,"column":28},"end":{"line":58,"column":1}},"line":54},"1":{"name":"(anonymous_1)","decl":{"start":{"line":59,"column":8},"end":{"line":59,"column":9}},"loc":{"start":{"line":59,"column":35},"end":{"line":62,"column":1}},"line":59},"2":{"name":"(anonymous_2)","decl":{"start":{"line":71,"column":7},"end":{"line":71,"column":8}},"loc":{"start":{"line":71,"column":13},"end":{"line":76,"column":2}},"line":71},"3":{"name":"(anonymous_3)","decl":{"start":{"line":72,"column":34},"end":{"line":72,"column":35}},"loc":{"start":{"line":72,"column":41},"end":{"line":75,"column":3}},"line":72},"4":{"name":"(anonymous_4)","decl":{"start":{"line":77,"column":8},"end":{"line":77,"column":9}},"loc":{"start":{"line":77,"column":15},"end":{"line":77,"column":89}},"line":77}},"branchMap":{"0":{"loc":{"start":{"line":60,"column":12},"end":{"line":60,"column":31}},"type":"binary-expr","locations":[{"start":{"line":60,"column":12},"end":{"line":60,"column":24}},{"start":{"line":60,"column":28},"end":{"line":60,"column":31}}],"line":60},"1":{"loc":{"start":{"line":73,"column":3},"end":{"line":73,"column":84}},"type":"if","locations":[{"start":{"line":73,"column":3},"end":{"line":73,"column":84}},{"start":{"line":73,"column":3},"end":{"line":73,"column":84}}],"line":73}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":0,"29":0,"30":0,"31":1,"32":0,"33":0,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":0,"41":1,"42":0,"43":1},"f":{"0":0,"1":0,"2":1,"3":1,"4":0},"b":{"0":[0,0],"1":[0,1]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"2af4d039199d816c5d66a8e1fbfe0617c07e7492"} +,"/home/denis/Zazmic_Internship/hw5/db/constant.js": {"path":"/home/denis/Zazmic_Internship/hw5/db/constant.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":5,"column":1}}},"fnMap":{},"branchMap":{},"s":{"0":1},"f":{},"b":{},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"703d04588295e0ef0bcd527c13c626d4f7f6005f"} +,"/home/denis/Zazmic_Internship/hw5/db/dbConnection.js": {"path":"/home/denis/Zazmic_Internship/hw5/db/dbConnection.js","statementMap":{"0":{"start":{"line":1,"column":18},"end":{"line":1,"column":38}},"1":{"start":{"line":3,"column":0},"end":{"line":13,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1},"f":{},"b":{},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"8d66b75cdc2afb38c5e9efd27550ffd5ef546703"} +,"/home/denis/Zazmic_Internship/hw5/db/models/Articles.js": {"path":"/home/denis/Zazmic_Internship/hw5/db/models/Articles.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":49}},"1":{"start":{"line":2,"column":18},"end":{"line":2,"column":44}},"2":{"start":{"line":6,"column":0},"end":{"line":54,"column":1}},"3":{"start":{"line":56,"column":0},"end":{"line":59,"column":1}},"4":{"start":{"line":57,"column":1},"end":{"line":57,"column":75}},"5":{"start":{"line":58,"column":1},"end":{"line":58,"column":79}},"6":{"start":{"line":61,"column":0},"end":{"line":61,"column":25}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":56,"column":21},"end":{"line":56,"column":22}},"loc":{"start":{"line":56,"column":31},"end":{"line":59,"column":1}},"line":56}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1},"f":{"0":1},"b":{},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"53763d3b281b361ca68ab61fef1eadade8d18646"} +,"/home/denis/Zazmic_Internship/hw5/db/models/Comments.js": {"path":"/home/denis/Zazmic_Internship/hw5/db/models/Comments.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":49}},"1":{"start":{"line":2,"column":18},"end":{"line":2,"column":44}},"2":{"start":{"line":6,"column":0},"end":{"line":40,"column":1}},"3":{"start":{"line":42,"column":0},"end":{"line":45,"column":1}},"4":{"start":{"line":43,"column":1},"end":{"line":43,"column":75}},"5":{"start":{"line":44,"column":1},"end":{"line":44,"column":80}},"6":{"start":{"line":47,"column":0},"end":{"line":47,"column":25}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":42,"column":21},"end":{"line":42,"column":22}},"loc":{"start":{"line":42,"column":31},"end":{"line":45,"column":1}},"line":42}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1},"f":{"0":1},"b":{},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"07447a4ff26a1120a0e8dc1848605732bfdc1d75"} +,"/home/denis/Zazmic_Internship/hw5/db/models/Providers.js": {"path":"/home/denis/Zazmic_Internship/hw5/db/models/Providers.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":49}},"1":{"start":{"line":2,"column":18},"end":{"line":2,"column":44}},"2":{"start":{"line":6,"column":0},"end":{"line":35,"column":1}},"3":{"start":{"line":37,"column":0},"end":{"line":42,"column":1}},"4":{"start":{"line":38,"column":1},"end":{"line":41,"column":3}},"5":{"start":{"line":44,"column":0},"end":{"line":44,"column":26}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":37,"column":22},"end":{"line":37,"column":23}},"loc":{"start":{"line":37,"column":32},"end":{"line":42,"column":1}},"line":37}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1},"f":{"0":1},"b":{},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"93c7bbee4819890a4964be6ace532ab9759eb282"} +,"/home/denis/Zazmic_Internship/hw5/db/models/Users.js": {"path":"/home/denis/Zazmic_Internship/hw5/db/models/Users.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":49}},"1":{"start":{"line":2,"column":18},"end":{"line":2,"column":44}},"2":{"start":{"line":3,"column":25},"end":{"line":3,"column":58}},"3":{"start":{"line":7,"column":0},"end":{"line":87,"column":1}},"4":{"start":{"line":89,"column":0},"end":{"line":93,"column":1}},"5":{"start":{"line":90,"column":1},"end":{"line":90,"column":75}},"6":{"start":{"line":91,"column":1},"end":{"line":91,"column":80}},"7":{"start":{"line":92,"column":1},"end":{"line":92,"column":75}},"8":{"start":{"line":95,"column":0},"end":{"line":95,"column":22}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":89,"column":18},"end":{"line":89,"column":19}},"loc":{"start":{"line":89,"column":28},"end":{"line":93,"column":1}},"line":89}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1},"f":{"0":1},"b":{},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"961bbb413915188160c6a8e2ccc7b94f9686835d"} +,"/home/denis/Zazmic_Internship/hw5/db/models/index.js": {"path":"/home/denis/Zazmic_Internship/hw5/db/models/index.js","statementMap":{"0":{"start":{"line":1,"column":15},"end":{"line":6,"column":1}},"1":{"start":{"line":8,"column":19},"end":{"line":8,"column":38}},"2":{"start":{"line":10,"column":0},"end":{"line":14,"column":2}},"3":{"start":{"line":11,"column":1},"end":{"line":13,"column":2}},"4":{"start":{"line":12,"column":2},"end":{"line":12,"column":37}},"5":{"start":{"line":16,"column":0},"end":{"line":16,"column":23}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":10,"column":19},"end":{"line":10,"column":20}},"loc":{"start":{"line":10,"column":32},"end":{"line":14,"column":1}},"line":10}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":1},"end":{"line":13,"column":2}},"type":"if","locations":[{"start":{"line":11,"column":1},"end":{"line":13,"column":2}},{"start":{"line":11,"column":1},"end":{"line":13,"column":2}}],"line":11}},"s":{"0":1,"1":1,"2":1,"3":4,"4":4,"5":1},"f":{"0":4},"b":{"0":[4,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"d9bed98b60d38c7a537e082138bfb11f8032b069"} +,"/home/denis/Zazmic_Internship/hw5/mongodb/mongoConnection.js": {"path":"/home/denis/Zazmic_Internship/hw5/mongodb/mongoConnection.js","statementMap":{"0":{"start":{"line":1,"column":17},"end":{"line":1,"column":36}},"1":{"start":{"line":5,"column":2},"end":{"line":12,"column":3}},"2":{"start":{"line":6,"column":3},"end":{"line":9,"column":5}},"3":{"start":{"line":11,"column":3},"end":{"line":11,"column":10}},"4":{"start":{"line":15,"column":0},"end":{"line":15,"column":19}},"5":{"start":{"line":17,"column":0},"end":{"line":17,"column":26}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":1},"end":{"line":4,"column":2}},"loc":{"start":{"line":4,"column":24},"end":{"line":13,"column":2}},"line":4}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":0,"4":1,"5":1},"f":{"0":1},"b":{},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"bef40774ca1fd1e0eba82d08e42e314dbc2847ac"} +,"/home/denis/Zazmic_Internship/hw5/mongodb/queries.js": {"path":"/home/denis/Zazmic_Internship/hw5/mongodb/queries.js","statementMap":{"0":{"start":{"line":1,"column":22},"end":{"line":1,"column":55}},"1":{"start":{"line":2,"column":56},"end":{"line":2,"column":87}},"2":{"start":{"line":4,"column":0},"end":{"line":6,"column":87}},"3":{"start":{"line":5,"column":13},"end":{"line":5,"column":67}},"4":{"start":{"line":6,"column":13},"end":{"line":6,"column":86}},"5":{"start":{"line":8,"column":19},"end":{"line":16,"column":1}},"6":{"start":{"line":9,"column":1},"end":{"line":15,"column":2}},"7":{"start":{"line":10,"column":2},"end":{"line":10,"column":34}},"8":{"start":{"line":11,"column":2},"end":{"line":11,"column":89}},"9":{"start":{"line":13,"column":2},"end":{"line":13,"column":77}},"10":{"start":{"line":14,"column":2},"end":{"line":14,"column":13}},"11":{"start":{"line":18,"column":19},"end":{"line":26,"column":1}},"12":{"start":{"line":19,"column":1},"end":{"line":25,"column":2}},"13":{"start":{"line":20,"column":2},"end":{"line":20,"column":64}},"14":{"start":{"line":21,"column":2},"end":{"line":21,"column":83}},"15":{"start":{"line":23,"column":2},"end":{"line":23,"column":77}},"16":{"start":{"line":24,"column":2},"end":{"line":24,"column":13}},"17":{"start":{"line":28,"column":16},"end":{"line":39,"column":1}},"18":{"start":{"line":29,"column":1},"end":{"line":38,"column":2}},"19":{"start":{"line":30,"column":22},"end":{"line":30,"column":108}},"20":{"start":{"line":31,"column":16},"end":{"line":31,"column":42}},"21":{"start":{"line":32,"column":2},"end":{"line":32,"column":83}},"22":{"start":{"line":33,"column":2},"end":{"line":33,"column":82}},"23":{"start":{"line":34,"column":2},"end":{"line":34,"column":14}},"24":{"start":{"line":36,"column":2},"end":{"line":36,"column":77}},"25":{"start":{"line":37,"column":2},"end":{"line":37,"column":13}},"26":{"start":{"line":41,"column":17},"end":{"line":48,"column":1}},"27":{"start":{"line":42,"column":1},"end":{"line":47,"column":2}},"28":{"start":{"line":43,"column":2},"end":{"line":43,"column":35}},"29":{"start":{"line":45,"column":2},"end":{"line":45,"column":77}},"30":{"start":{"line":46,"column":2},"end":{"line":46,"column":13}},"31":{"start":{"line":50,"column":0},"end":{"line":50,"column":62}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":7},"end":{"line":5,"column":8}},"loc":{"start":{"line":5,"column":13},"end":{"line":5,"column":67}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":6,"column":8},"end":{"line":6,"column":9}},"loc":{"start":{"line":6,"column":13},"end":{"line":6,"column":86}},"line":6},"2":{"name":"(anonymous_2)","decl":{"start":{"line":8,"column":19},"end":{"line":8,"column":20}},"loc":{"start":{"line":8,"column":33},"end":{"line":16,"column":1}},"line":8},"3":{"name":"(anonymous_3)","decl":{"start":{"line":18,"column":19},"end":{"line":18,"column":20}},"loc":{"start":{"line":18,"column":38},"end":{"line":26,"column":1}},"line":18},"4":{"name":"(anonymous_4)","decl":{"start":{"line":28,"column":16},"end":{"line":28,"column":17}},"loc":{"start":{"line":28,"column":35},"end":{"line":39,"column":1}},"line":28},"5":{"name":"(anonymous_5)","decl":{"start":{"line":41,"column":17},"end":{"line":41,"column":18}},"loc":{"start":{"line":41,"column":29},"end":{"line":48,"column":1}},"line":41}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":0,"5":1,"6":0,"7":0,"8":0,"9":0,"10":0,"11":1,"12":0,"13":0,"14":0,"15":0,"16":0,"17":1,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":1,"27":0,"28":0,"29":0,"30":0,"31":1},"f":{"0":1,"1":0,"2":0,"3":0,"4":0,"5":0},"b":{},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"b5984df6b089a59691ca0a8ed7252c4c645d3afa"} +,"/home/denis/Zazmic_Internship/hw5/mongodb/models/ArticlesViews.js": {"path":"/home/denis/Zazmic_Internship/hw5/mongodb/models/ArticlesViews.js","statementMap":{"0":{"start":{"line":1,"column":17},"end":{"line":1,"column":36}},"1":{"start":{"line":2,"column":19},"end":{"line":2,"column":27}},"2":{"start":{"line":4,"column":27},"end":{"line":4,"column":59}},"3":{"start":{"line":6,"column":22},"end":{"line":12,"column":2}},"4":{"start":{"line":14,"column":0},"end":{"line":17,"column":2}},"5":{"start":{"line":15,"column":1},"end":{"line":15,"column":36}},"6":{"start":{"line":16,"column":1},"end":{"line":16,"column":7}},"7":{"start":{"line":19,"column":0},"end":{"line":22,"column":2}},"8":{"start":{"line":20,"column":1},"end":{"line":20,"column":36}},"9":{"start":{"line":21,"column":1},"end":{"line":21,"column":7}},"10":{"start":{"line":25,"column":0},"end":{"line":28,"column":2}},"11":{"start":{"line":26,"column":13},"end":{"line":26,"column":43}},"12":{"start":{"line":26,"column":29},"end":{"line":26,"column":42}},"13":{"start":{"line":27,"column":1},"end":{"line":27,"column":68}},"14":{"start":{"line":30,"column":0},"end":{"line":32,"column":2}},"15":{"start":{"line":31,"column":1},"end":{"line":31,"column":72}},"16":{"start":{"line":33,"column":0},"end":{"line":35,"column":2}},"17":{"start":{"line":34,"column":1},"end":{"line":34,"column":72}},"18":{"start":{"line":37,"column":0},"end":{"line":39,"column":2}},"19":{"start":{"line":38,"column":1},"end":{"line":38,"column":72}},"20":{"start":{"line":41,"column":0},"end":{"line":41,"column":63}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":14,"column":31},"end":{"line":14,"column":32}},"loc":{"start":{"line":14,"column":46},"end":{"line":17,"column":1}},"line":14},"1":{"name":"(anonymous_1)","decl":{"start":{"line":19,"column":26},"end":{"line":19,"column":27}},"loc":{"start":{"line":19,"column":41},"end":{"line":22,"column":1}},"line":19},"2":{"name":"(anonymous_2)","decl":{"start":{"line":25,"column":27},"end":{"line":25,"column":28}},"loc":{"start":{"line":25,"column":42},"end":{"line":28,"column":1}},"line":25},"3":{"name":"(anonymous_3)","decl":{"start":{"line":26,"column":22},"end":{"line":26,"column":23}},"loc":{"start":{"line":26,"column":29},"end":{"line":26,"column":42}},"line":26},"4":{"name":"(anonymous_4)","decl":{"start":{"line":30,"column":39},"end":{"line":30,"column":40}},"loc":{"start":{"line":30,"column":53},"end":{"line":32,"column":1}},"line":30},"5":{"name":"(anonymous_5)","decl":{"start":{"line":33,"column":39},"end":{"line":33,"column":40}},"loc":{"start":{"line":33,"column":53},"end":{"line":35,"column":1}},"line":33},"6":{"name":"(anonymous_6)","decl":{"start":{"line":37,"column":27},"end":{"line":37,"column":28}},"loc":{"start":{"line":37,"column":41},"end":{"line":39,"column":1}},"line":37}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":0,"6":0,"7":1,"8":0,"9":0,"10":1,"11":0,"12":0,"13":0,"14":1,"15":0,"16":1,"17":0,"18":1,"19":0,"20":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0},"b":{},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"303c9e3bcedda07f9ecac61167b5f241da7746e4"} +,"/home/denis/Zazmic_Internship/hw5/routes/auth.js": {"path":"/home/denis/Zazmic_Internship/hw5/routes/auth.js","statementMap":{"0":{"start":{"line":8,"column":16},"end":{"line":8,"column":34}},"1":{"start":{"line":9,"column":15},"end":{"line":9,"column":31}},"2":{"start":{"line":10,"column":21},"end":{"line":10,"column":53}},"3":{"start":{"line":11,"column":17},"end":{"line":11,"column":36}},"4":{"start":{"line":12,"column":12},"end":{"line":12,"column":35}},"5":{"start":{"line":14,"column":18},"end":{"line":14,"column":50}},"6":{"start":{"line":15,"column":0},"end":{"line":15,"column":48}},"7":{"start":{"line":16,"column":36},"end":{"line":16,"column":66}},"8":{"start":{"line":17,"column":52},"end":{"line":17,"column":92}},"9":{"start":{"line":18,"column":28},"end":{"line":18,"column":63}},"10":{"start":{"line":19,"column":23},"end":{"line":19,"column":48}},"11":{"start":{"line":21,"column":0},"end":{"line":49,"column":1}},"12":{"start":{"line":25,"column":19},"end":{"line":25,"column":76}},"13":{"start":{"line":26,"column":2},"end":{"line":47,"column":3}},"14":{"start":{"line":27,"column":3},"end":{"line":27,"column":18}},"15":{"start":{"line":28,"column":3},"end":{"line":28,"column":67}},"16":{"start":{"line":30,"column":20},"end":{"line":35,"column":4}},"17":{"start":{"line":36,"column":19},"end":{"line":36,"column":47}},"18":{"start":{"line":37,"column":23},"end":{"line":37,"column":51}},"19":{"start":{"line":38,"column":3},"end":{"line":46,"column":5}},"20":{"start":{"line":39,"column":4},"end":{"line":39,"column":56}},"21":{"start":{"line":39,"column":13},"end":{"line":39,"column":56}},"22":{"start":{"line":40,"column":23},"end":{"line":40,"column":70}},"23":{"start":{"line":41,"column":4},"end":{"line":44,"column":6}},"24":{"start":{"line":45,"column":4},"end":{"line":45,"column":31}},"25":{"start":{"line":51,"column":0},"end":{"line":64,"column":2}},"26":{"start":{"line":52,"column":1},"end":{"line":63,"column":2}},"27":{"start":{"line":53,"column":18},"end":{"line":53,"column":63}},"28":{"start":{"line":54,"column":19},"end":{"line":54,"column":44}},"29":{"start":{"line":55,"column":2},"end":{"line":55,"column":45}},"30":{"start":{"line":56,"column":13},"end":{"line":56,"column":42}},"31":{"start":{"line":57,"column":2},"end":{"line":60,"column":4}},"32":{"start":{"line":58,"column":3},"end":{"line":58,"column":48}},"33":{"start":{"line":58,"column":12},"end":{"line":58,"column":48}},"34":{"start":{"line":59,"column":3},"end":{"line":59,"column":27}},"35":{"start":{"line":62,"column":2},"end":{"line":62,"column":77}},"36":{"start":{"line":66,"column":0},"end":{"line":73,"column":1}},"37":{"start":{"line":72,"column":15},"end":{"line":72,"column":43}},"38":{"start":{"line":75,"column":0},"end":{"line":75,"column":54}},"39":{"start":{"line":75,"column":37},"end":{"line":75,"column":53}},"40":{"start":{"line":80,"column":0},"end":{"line":84,"column":2}},"41":{"start":{"line":81,"column":1},"end":{"line":83,"column":3}},"42":{"start":{"line":82,"column":2},"end":{"line":82,"column":86}},"43":{"start":{"line":86,"column":0},"end":{"line":92,"column":2}},"44":{"start":{"line":87,"column":14},"end":{"line":87,"column":68}},"45":{"start":{"line":88,"column":1},"end":{"line":88,"column":24}},"46":{"start":{"line":89,"column":1},"end":{"line":91,"column":3}},"47":{"start":{"line":90,"column":2},"end":{"line":90,"column":49}},"48":{"start":{"line":96,"column":22},"end":{"line":96,"column":50}},"49":{"start":{"line":97,"column":1},"end":{"line":106,"column":2}},"50":{"start":{"line":99,"column":17},"end":{"line":99,"column":40}},"51":{"start":{"line":100,"column":22},"end":{"line":100,"column":31}},"52":{"start":{"line":101,"column":2},"end":{"line":101,"column":25}},"53":{"start":{"line":102,"column":2},"end":{"line":102,"column":8}},"54":{"start":{"line":105,"column":2},"end":{"line":105,"column":21}},"55":{"start":{"line":109,"column":0},"end":{"line":109,"column":23}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":24,"column":14},"end":{"line":24,"column":15}},"loc":{"start":{"line":24,"column":34},"end":{"line":48,"column":2}},"line":24},"1":{"name":"(anonymous_1)","decl":{"start":{"line":38,"column":71},"end":{"line":38,"column":72}},"loc":{"start":{"line":38,"column":93},"end":{"line":46,"column":4}},"line":38},"2":{"name":"(anonymous_2)","decl":{"start":{"line":51,"column":36},"end":{"line":51,"column":37}},"loc":{"start":{"line":51,"column":56},"end":{"line":64,"column":1}},"line":51},"3":{"name":"(anonymous_3)","decl":{"start":{"line":57,"column":24},"end":{"line":57,"column":25}},"loc":{"start":{"line":57,"column":31},"end":{"line":60,"column":3}},"line":57},"4":{"name":"(anonymous_4)","decl":{"start":{"line":72,"column":1},"end":{"line":72,"column":2}},"loc":{"start":{"line":72,"column":15},"end":{"line":72,"column":43}},"line":72},"5":{"name":"(anonymous_5)","decl":{"start":{"line":75,"column":23},"end":{"line":75,"column":24}},"loc":{"start":{"line":75,"column":37},"end":{"line":75,"column":53}},"line":75},"6":{"name":"(anonymous_6)","decl":{"start":{"line":80,"column":48},"end":{"line":80,"column":49}},"loc":{"start":{"line":80,"column":62},"end":{"line":84,"column":1}},"line":80},"7":{"name":"(anonymous_7)","decl":{"start":{"line":81,"column":36},"end":{"line":81,"column":37}},"loc":{"start":{"line":81,"column":55},"end":{"line":83,"column":2}},"line":81},"8":{"name":"(anonymous_8)","decl":{"start":{"line":86,"column":26},"end":{"line":86,"column":27}},"loc":{"start":{"line":86,"column":40},"end":{"line":92,"column":1}},"line":86},"9":{"name":"(anonymous_9)","decl":{"start":{"line":89,"column":79},"end":{"line":89,"column":80}},"loc":{"start":{"line":89,"column":95},"end":{"line":91,"column":2}},"line":89},"10":{"name":"verifyToken","decl":{"start":{"line":94,"column":9},"end":{"line":94,"column":20}},"loc":{"start":{"line":94,"column":37},"end":{"line":107,"column":1}},"line":94}},"branchMap":{"0":{"loc":{"start":{"line":26,"column":2},"end":{"line":47,"column":3}},"type":"if","locations":[{"start":{"line":26,"column":2},"end":{"line":47,"column":3}},{"start":{"line":26,"column":2},"end":{"line":47,"column":3}}],"line":26},"1":{"loc":{"start":{"line":39,"column":4},"end":{"line":39,"column":56}},"type":"if","locations":[{"start":{"line":39,"column":4},"end":{"line":39,"column":56}},{"start":{"line":39,"column":4},"end":{"line":39,"column":56}}],"line":39},"2":{"loc":{"start":{"line":58,"column":3},"end":{"line":58,"column":48}},"type":"if","locations":[{"start":{"line":58,"column":3},"end":{"line":58,"column":48}},{"start":{"line":58,"column":3},"end":{"line":58,"column":48}}],"line":58},"3":{"loc":{"start":{"line":82,"column":2},"end":{"line":82,"column":86}},"type":"cond-expr","locations":[{"start":{"line":82,"column":8},"end":{"line":82,"column":27}},{"start":{"line":82,"column":30},"end":{"line":82,"column":86}}],"line":82},"4":{"loc":{"start":{"line":90,"column":2},"end":{"line":90,"column":49}},"type":"cond-expr","locations":[{"start":{"line":90,"column":8},"end":{"line":90,"column":27}},{"start":{"line":90,"column":30},"end":{"line":90,"column":49}}],"line":90},"5":{"loc":{"start":{"line":97,"column":1},"end":{"line":106,"column":2}},"type":"if","locations":[{"start":{"line":97,"column":1},"end":{"line":106,"column":2}},{"start":{"line":97,"column":1},"end":{"line":106,"column":2}}],"line":97}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":0,"15":0,"16":1,"17":1,"18":1,"19":1,"20":1,"21":0,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":0,"34":1,"35":0,"36":1,"37":0,"38":1,"39":1,"40":1,"41":0,"42":0,"43":1,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":1},"f":{"0":1,"1":1,"2":1,"3":1,"4":0,"5":1,"6":0,"7":0,"8":0,"9":0,"10":0},"b":{"0":[0,1],"1":[0,1],"2":[0,1],"3":[0,0],"4":[0,0],"5":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"1ffaddb912d89ba7e2a761741576496069bf6375"} +,"/home/denis/Zazmic_Internship/hw5/routes/blogs.js": {"path":"/home/denis/Zazmic_Internship/hw5/routes/blogs.js","statementMap":{"0":{"start":{"line":12,"column":16},"end":{"line":12,"column":34}},"1":{"start":{"line":13,"column":15},"end":{"line":13,"column":31}},"2":{"start":{"line":14,"column":21},"end":{"line":14,"column":53}},"3":{"start":{"line":16,"column":38},"end":{"line":16,"column":70}},"4":{"start":{"line":17,"column":74},"end":{"line":17,"column":103}},"5":{"start":{"line":18,"column":34},"end":{"line":18,"column":64}},"6":{"start":{"line":19,"column":18},"end":{"line":19,"column":62}},"7":{"start":{"line":20,"column":27},"end":{"line":20,"column":56}},"8":{"start":{"line":21,"column":33},"end":{"line":21,"column":72}},"9":{"start":{"line":22,"column":37},"end":{"line":22,"column":78}},"10":{"start":{"line":23,"column":49},"end":{"line":23,"column":89}},"11":{"start":{"line":25,"column":0},"end":{"line":33,"column":1}},"12":{"start":{"line":28,"column":19},"end":{"line":28,"column":59}},"13":{"start":{"line":29,"column":16},"end":{"line":29,"column":32}},"14":{"start":{"line":30,"column":2},"end":{"line":30,"column":40}},"15":{"start":{"line":31,"column":2},"end":{"line":31,"column":30}},"16":{"start":{"line":35,"column":0},"end":{"line":47,"column":1}},"17":{"start":{"line":39,"column":19},"end":{"line":39,"column":23}},"18":{"start":{"line":40,"column":2},"end":{"line":40,"column":33}},"19":{"start":{"line":41,"column":2},"end":{"line":41,"column":48}},"20":{"start":{"line":41,"column":16},"end":{"line":41,"column":48}},"21":{"start":{"line":42,"column":2},"end":{"line":42,"column":53}},"22":{"start":{"line":43,"column":2},"end":{"line":43,"column":89}},"23":{"start":{"line":44,"column":2},"end":{"line":44,"column":21}},"24":{"start":{"line":45,"column":2},"end":{"line":45,"column":32}},"25":{"start":{"line":48,"column":0},"end":{"line":64,"column":1}},"26":{"start":{"line":52,"column":15},"end":{"line":52,"column":94}},"27":{"start":{"line":53,"column":22},"end":{"line":53,"column":47}},"28":{"start":{"line":54,"column":2},"end":{"line":62,"column":3}},"29":{"start":{"line":55,"column":24},"end":{"line":55,"column":28}},"30":{"start":{"line":56,"column":3},"end":{"line":56,"column":49}},"31":{"start":{"line":56,"column":17},"end":{"line":56,"column":49}},"32":{"start":{"line":57,"column":3},"end":{"line":57,"column":82}},"33":{"start":{"line":57,"column":28},"end":{"line":57,"column":82}},"34":{"start":{"line":58,"column":3},"end":{"line":58,"column":92}},"35":{"start":{"line":59,"column":3},"end":{"line":59,"column":77}},"36":{"start":{"line":61,"column":3},"end":{"line":61,"column":22}},"37":{"start":{"line":66,"column":0},"end":{"line":77,"column":1}},"38":{"start":{"line":69,"column":18},"end":{"line":72,"column":4}},"39":{"start":{"line":73,"column":16},"end":{"line":73,"column":45}},"40":{"start":{"line":74,"column":2},"end":{"line":74,"column":34}},"41":{"start":{"line":75,"column":2},"end":{"line":75,"column":29}},"42":{"start":{"line":79,"column":0},"end":{"line":93,"column":1}},"43":{"start":{"line":82,"column":15},"end":{"line":82,"column":94}},"44":{"start":{"line":83,"column":22},"end":{"line":83,"column":47}},"45":{"start":{"line":84,"column":2},"end":{"line":91,"column":3}},"46":{"start":{"line":85,"column":28},"end":{"line":85,"column":84}},"47":{"start":{"line":86,"column":3},"end":{"line":86,"column":42}},"48":{"start":{"line":87,"column":3},"end":{"line":87,"column":82}},"49":{"start":{"line":87,"column":28},"end":{"line":87,"column":82}},"50":{"start":{"line":88,"column":3},"end":{"line":88,"column":79}},"51":{"start":{"line":90,"column":3},"end":{"line":90,"column":22}},"52":{"start":{"line":96,"column":0},"end":{"line":102,"column":1}},"53":{"start":{"line":99,"column":19},"end":{"line":99,"column":69}},"54":{"start":{"line":100,"column":2},"end":{"line":100,"column":30}},"55":{"start":{"line":104,"column":0},"end":{"line":119,"column":1}},"56":{"start":{"line":109,"column":2},"end":{"line":109,"column":33}},"57":{"start":{"line":110,"column":2},"end":{"line":110,"column":37}},"58":{"start":{"line":111,"column":21},"end":{"line":111,"column":52}},"59":{"start":{"line":112,"column":18},"end":{"line":112,"column":49}},"60":{"start":{"line":113,"column":2},"end":{"line":113,"column":27}},"61":{"start":{"line":115,"column":13},"end":{"line":115,"column":36}},"62":{"start":{"line":116,"column":2},"end":{"line":116,"column":89}},"63":{"start":{"line":117,"column":2},"end":{"line":117,"column":29}},"64":{"start":{"line":121,"column":0},"end":{"line":135,"column":1}},"65":{"start":{"line":125,"column":2},"end":{"line":125,"column":29}},"66":{"start":{"line":126,"column":18},"end":{"line":126,"column":56}},"67":{"start":{"line":127,"column":2},"end":{"line":132,"column":3}},"68":{"start":{"line":128,"column":3},"end":{"line":128,"column":26}},"69":{"start":{"line":129,"column":14},"end":{"line":129,"column":37}},"70":{"start":{"line":130,"column":3},"end":{"line":130,"column":98}},"71":{"start":{"line":131,"column":3},"end":{"line":131,"column":29}},"72":{"start":{"line":133,"column":2},"end":{"line":133,"column":21}},"73":{"start":{"line":137,"column":0},"end":{"line":137,"column":23}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":27,"column":14},"end":{"line":27,"column":15}},"loc":{"start":{"line":27,"column":34},"end":{"line":32,"column":2}},"line":27},"1":{"name":"(anonymous_1)","decl":{"start":{"line":38,"column":14},"end":{"line":38,"column":15}},"loc":{"start":{"line":38,"column":34},"end":{"line":46,"column":2}},"line":38},"2":{"name":"(anonymous_2)","decl":{"start":{"line":51,"column":14},"end":{"line":51,"column":15}},"loc":{"start":{"line":51,"column":34},"end":{"line":63,"column":2}},"line":51},"3":{"name":"(anonymous_3)","decl":{"start":{"line":68,"column":14},"end":{"line":68,"column":15}},"loc":{"start":{"line":68,"column":34},"end":{"line":76,"column":2}},"line":68},"4":{"name":"(anonymous_4)","decl":{"start":{"line":81,"column":14},"end":{"line":81,"column":15}},"loc":{"start":{"line":81,"column":34},"end":{"line":92,"column":2}},"line":81},"5":{"name":"(anonymous_5)","decl":{"start":{"line":98,"column":14},"end":{"line":98,"column":15}},"loc":{"start":{"line":98,"column":34},"end":{"line":101,"column":2}},"line":98},"6":{"name":"(anonymous_6)","decl":{"start":{"line":108,"column":14},"end":{"line":108,"column":15}},"loc":{"start":{"line":108,"column":34},"end":{"line":118,"column":2}},"line":108},"7":{"name":"(anonymous_7)","decl":{"start":{"line":124,"column":14},"end":{"line":124,"column":15}},"loc":{"start":{"line":124,"column":34},"end":{"line":134,"column":2}},"line":124}},"branchMap":{"0":{"loc":{"start":{"line":41,"column":2},"end":{"line":41,"column":48}},"type":"if","locations":[{"start":{"line":41,"column":2},"end":{"line":41,"column":48}},{"start":{"line":41,"column":2},"end":{"line":41,"column":48}}],"line":41},"1":{"loc":{"start":{"line":54,"column":2},"end":{"line":62,"column":3}},"type":"if","locations":[{"start":{"line":54,"column":2},"end":{"line":62,"column":3}},{"start":{"line":54,"column":2},"end":{"line":62,"column":3}}],"line":54},"2":{"loc":{"start":{"line":56,"column":3},"end":{"line":56,"column":49}},"type":"if","locations":[{"start":{"line":56,"column":3},"end":{"line":56,"column":49}},{"start":{"line":56,"column":3},"end":{"line":56,"column":49}}],"line":56},"3":{"loc":{"start":{"line":57,"column":3},"end":{"line":57,"column":82}},"type":"if","locations":[{"start":{"line":57,"column":3},"end":{"line":57,"column":82}},{"start":{"line":57,"column":3},"end":{"line":57,"column":82}}],"line":57},"4":{"loc":{"start":{"line":59,"column":10},"end":{"line":59,"column":77}},"type":"cond-expr","locations":[{"start":{"line":59,"column":31},"end":{"line":59,"column":55}},{"start":{"line":59,"column":58},"end":{"line":59,"column":77}}],"line":59},"5":{"loc":{"start":{"line":84,"column":2},"end":{"line":91,"column":3}},"type":"if","locations":[{"start":{"line":84,"column":2},"end":{"line":91,"column":3}},{"start":{"line":84,"column":2},"end":{"line":91,"column":3}}],"line":84},"6":{"loc":{"start":{"line":87,"column":3},"end":{"line":87,"column":82}},"type":"if","locations":[{"start":{"line":87,"column":3},"end":{"line":87,"column":82}},{"start":{"line":87,"column":3},"end":{"line":87,"column":82}}],"line":87},"7":{"loc":{"start":{"line":88,"column":3},"end":{"line":88,"column":79}},"type":"cond-expr","locations":[{"start":{"line":88,"column":26},"end":{"line":88,"column":57}},{"start":{"line":88,"column":60},"end":{"line":88,"column":79}}],"line":88},"8":{"loc":{"start":{"line":127,"column":2},"end":{"line":132,"column":3}},"type":"if","locations":[{"start":{"line":127,"column":2},"end":{"line":132,"column":3}},{"start":{"line":127,"column":2},"end":{"line":132,"column":3}}],"line":127}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":0,"13":0,"14":0,"15":0,"16":1,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":1,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":1,"38":0,"39":0,"40":0,"41":0,"42":1,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":1,"53":0,"54":0,"55":1,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":1,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"2b32ada5d49ad9087abadd66088a72c7fca483e6"} +,"/home/denis/Zazmic_Internship/hw5/routes/fees.js": {"path":"/home/denis/Zazmic_Internship/hw5/routes/fees.js","statementMap":{"0":{"start":{"line":6,"column":16},"end":{"line":6,"column":34}},"1":{"start":{"line":7,"column":15},"end":{"line":7,"column":31}},"2":{"start":{"line":8,"column":21},"end":{"line":8,"column":53}},"3":{"start":{"line":10,"column":18},"end":{"line":10,"column":62}},"4":{"start":{"line":11,"column":43},"end":{"line":11,"column":79}},"5":{"start":{"line":12,"column":19},"end":{"line":12,"column":54}},"6":{"start":{"line":13,"column":23},"end":{"line":13,"column":48}},"7":{"start":{"line":14,"column":18},"end":{"line":14,"column":21}},"8":{"start":{"line":15,"column":14},"end":{"line":15,"column":17}},"9":{"start":{"line":17,"column":0},"end":{"line":27,"column":1}},"10":{"start":{"line":21,"column":15},"end":{"line":21,"column":44}},"11":{"start":{"line":22,"column":2},"end":{"line":22,"column":59}},"12":{"start":{"line":22,"column":19},"end":{"line":22,"column":59}},"13":{"start":{"line":23,"column":2},"end":{"line":23,"column":74}},"14":{"start":{"line":23,"column":32},"end":{"line":23,"column":74}},"15":{"start":{"line":24,"column":16},"end":{"line":24,"column":63}},"16":{"start":{"line":25,"column":2},"end":{"line":25,"column":51}},"17":{"start":{"line":29,"column":0},"end":{"line":57,"column":1}},"18":{"start":{"line":33,"column":15},"end":{"line":33,"column":44}},"19":{"start":{"line":34,"column":23},"end":{"line":34,"column":124}},"20":{"start":{"line":35,"column":16},"end":{"line":35,"column":63}},"21":{"start":{"line":36,"column":2},"end":{"line":45,"column":4}},"22":{"start":{"line":47,"column":2},"end":{"line":54,"column":3}},"23":{"start":{"line":48,"column":3},"end":{"line":48,"column":42}},"24":{"start":{"line":49,"column":3},"end":{"line":53,"column":5}},"25":{"start":{"line":55,"column":2},"end":{"line":55,"column":63}},"26":{"start":{"line":59,"column":0},"end":{"line":59,"column":23}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":20,"column":14},"end":{"line":20,"column":15}},"loc":{"start":{"line":20,"column":34},"end":{"line":26,"column":2}},"line":20},"1":{"name":"(anonymous_1)","decl":{"start":{"line":32,"column":14},"end":{"line":32,"column":15}},"loc":{"start":{"line":32,"column":34},"end":{"line":56,"column":2}},"line":32}},"branchMap":{"0":{"loc":{"start":{"line":22,"column":2},"end":{"line":22,"column":59}},"type":"if","locations":[{"start":{"line":22,"column":2},"end":{"line":22,"column":59}},{"start":{"line":22,"column":2},"end":{"line":22,"column":59}}],"line":22},"1":{"loc":{"start":{"line":23,"column":2},"end":{"line":23,"column":74}},"type":"if","locations":[{"start":{"line":23,"column":2},"end":{"line":23,"column":74}},{"start":{"line":23,"column":2},"end":{"line":23,"column":74}}],"line":23},"2":{"loc":{"start":{"line":43,"column":10},"end":{"line":43,"column":51}},"type":"cond-expr","locations":[{"start":{"line":43,"column":30},"end":{"line":43,"column":47}},{"start":{"line":43,"column":50},"end":{"line":43,"column":51}}],"line":43},"3":{"loc":{"start":{"line":47,"column":2},"end":{"line":54,"column":3}},"type":"if","locations":[{"start":{"line":47,"column":2},"end":{"line":54,"column":3}},{"start":{"line":47,"column":2},"end":{"line":54,"column":3}}],"line":47},"4":{"loc":{"start":{"line":47,"column":6},"end":{"line":47,"column":40}},"type":"binary-expr","locations":[{"start":{"line":47,"column":6},"end":{"line":47,"column":18}},{"start":{"line":47,"column":22},"end":{"line":47,"column":40}}],"line":47}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":1,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":1},"f":{"0":0,"1":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"dd89d8c5d0cec8e719e74a38e4fc187686ba3f21"} +,"/home/denis/Zazmic_Internship/hw5/routes/index.js": {"path":"/home/denis/Zazmic_Internship/hw5/routes/index.js","statementMap":{"0":{"start":{"line":1,"column":14},"end":{"line":1,"column":30}},"1":{"start":{"line":2,"column":15},"end":{"line":2,"column":42}},"2":{"start":{"line":4,"column":13},"end":{"line":4,"column":30}},"3":{"start":{"line":5,"column":14},"end":{"line":5,"column":32}},"4":{"start":{"line":6,"column":13},"end":{"line":6,"column":31}},"5":{"start":{"line":7,"column":13},"end":{"line":7,"column":31}},"6":{"start":{"line":8,"column":16},"end":{"line":8,"column":36}},"7":{"start":{"line":9,"column":13},"end":{"line":9,"column":30}},"8":{"start":{"line":11,"column":27},"end":{"line":11,"column":56}},"9":{"start":{"line":13,"column":0},"end":{"line":13,"column":34}},"10":{"start":{"line":14,"column":0},"end":{"line":14,"column":27}},"11":{"start":{"line":15,"column":0},"end":{"line":15,"column":38}},"12":{"start":{"line":16,"column":0},"end":{"line":16,"column":33}},"13":{"start":{"line":17,"column":0},"end":{"line":17,"column":32}},"14":{"start":{"line":18,"column":0},"end":{"line":18,"column":32}},"15":{"start":{"line":20,"column":0},"end":{"line":24,"column":2}},"16":{"start":{"line":21,"column":1},"end":{"line":21,"column":68}},"17":{"start":{"line":21,"column":49},"end":{"line":21,"column":67}},"18":{"start":{"line":22,"column":14},"end":{"line":22,"column":24}},"19":{"start":{"line":23,"column":1},"end":{"line":23,"column":70}},"20":{"start":{"line":26,"column":0},"end":{"line":26,"column":23}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":20,"column":16},"end":{"line":20,"column":17}},"loc":{"start":{"line":20,"column":30},"end":{"line":24,"column":1}},"line":20},"1":{"name":"(anonymous_1)","decl":{"start":{"line":21,"column":37},"end":{"line":21,"column":38}},"loc":{"start":{"line":21,"column":49},"end":{"line":21,"column":67}},"line":21}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":0,"17":0,"18":0,"19":0,"20":1},"f":{"0":0,"1":0},"b":{},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"3e16867d0f6b67fc71d64c54561dfe444152ca69"} +,"/home/denis/Zazmic_Internship/hw5/routes/oauth.js": {"path":"/home/denis/Zazmic_Internship/hw5/routes/oauth.js","statementMap":{"0":{"start":{"line":7,"column":16},"end":{"line":7,"column":34}},"1":{"start":{"line":8,"column":15},"end":{"line":8,"column":31}},"2":{"start":{"line":9,"column":17},"end":{"line":9,"column":36}},"3":{"start":{"line":11,"column":0},"end":{"line":11,"column":87}},"4":{"start":{"line":13,"column":0},"end":{"line":13,"column":80}},"5":{"start":{"line":15,"column":0},"end":{"line":17,"column":2}},"6":{"start":{"line":16,"column":1},"end":{"line":16,"column":29}},"7":{"start":{"line":19,"column":0},"end":{"line":21,"column":2}},"8":{"start":{"line":20,"column":1},"end":{"line":20,"column":29}},"9":{"start":{"line":23,"column":0},"end":{"line":23,"column":23}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":15,"column":65},"end":{"line":15,"column":66}},"loc":{"start":{"line":15,"column":79},"end":{"line":17,"column":1}},"line":15},"1":{"name":"(anonymous_1)","decl":{"start":{"line":19,"column":69},"end":{"line":19,"column":70}},"loc":{"start":{"line":19,"column":83},"end":{"line":21,"column":1}},"line":19}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":0,"7":1,"8":0,"9":1},"f":{"0":0,"1":0},"b":{},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"09021805b1b3e6092c37885c5fdfa20438f39722"} +,"/home/denis/Zazmic_Internship/hw5/routes/profile.js": {"path":"/home/denis/Zazmic_Internship/hw5/routes/profile.js","statementMap":{"0":{"start":{"line":7,"column":16},"end":{"line":7,"column":34}},"1":{"start":{"line":8,"column":15},"end":{"line":8,"column":31}},"2":{"start":{"line":9,"column":21},"end":{"line":9,"column":53}},"3":{"start":{"line":11,"column":28},"end":{"line":11,"column":60}},"4":{"start":{"line":12,"column":18},"end":{"line":12,"column":62}},"5":{"start":{"line":13,"column":19},"end":{"line":13,"column":49}},"6":{"start":{"line":14,"column":25},"end":{"line":14,"column":54}},"7":{"start":{"line":15,"column":29},"end":{"line":15,"column":68}},"8":{"start":{"line":16,"column":31},"end":{"line":16,"column":71}},"9":{"start":{"line":17,"column":27},"end":{"line":17,"column":63}},"10":{"start":{"line":19,"column":0},"end":{"line":27,"column":1}},"11":{"start":{"line":24,"column":2},"end":{"line":24,"column":87}},"12":{"start":{"line":25,"column":2},"end":{"line":25,"column":30}},"13":{"start":{"line":29,"column":0},"end":{"line":40,"column":1}},"14":{"start":{"line":33,"column":15},"end":{"line":33,"column":111}},"15":{"start":{"line":34,"column":2},"end":{"line":34,"column":64}},"16":{"start":{"line":34,"column":24},"end":{"line":34,"column":64}},"17":{"start":{"line":35,"column":2},"end":{"line":35,"column":54}},"18":{"start":{"line":35,"column":19},"end":{"line":35,"column":54}},"19":{"start":{"line":36,"column":24},"end":{"line":36,"column":75}},"20":{"start":{"line":37,"column":2},"end":{"line":37,"column":48}},"21":{"start":{"line":37,"column":25},"end":{"line":37,"column":48}},"22":{"start":{"line":38,"column":2},"end":{"line":38,"column":21}},"23":{"start":{"line":42,"column":0},"end":{"line":51,"column":1}},"24":{"start":{"line":47,"column":2},"end":{"line":47,"column":65}},"25":{"start":{"line":47,"column":17},"end":{"line":47,"column":65}},"26":{"start":{"line":48,"column":2},"end":{"line":48,"column":51}},"27":{"start":{"line":49,"column":2},"end":{"line":49,"column":48}},"28":{"start":{"line":53,"column":0},"end":{"line":61,"column":1}},"29":{"start":{"line":57,"column":15},"end":{"line":57,"column":44}},"30":{"start":{"line":58,"column":22},"end":{"line":58,"column":64}},"31":{"start":{"line":59,"column":2},"end":{"line":59,"column":49}},"32":{"start":{"line":63,"column":0},"end":{"line":63,"column":23}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":23,"column":14},"end":{"line":23,"column":15}},"loc":{"start":{"line":23,"column":34},"end":{"line":26,"column":2}},"line":23},"1":{"name":"(anonymous_1)","decl":{"start":{"line":32,"column":14},"end":{"line":32,"column":15}},"loc":{"start":{"line":32,"column":34},"end":{"line":39,"column":2}},"line":32},"2":{"name":"(anonymous_2)","decl":{"start":{"line":46,"column":14},"end":{"line":46,"column":15}},"loc":{"start":{"line":46,"column":34},"end":{"line":50,"column":2}},"line":46},"3":{"name":"(anonymous_3)","decl":{"start":{"line":56,"column":14},"end":{"line":56,"column":15}},"loc":{"start":{"line":56,"column":34},"end":{"line":60,"column":2}},"line":56}},"branchMap":{"0":{"loc":{"start":{"line":34,"column":2},"end":{"line":34,"column":64}},"type":"if","locations":[{"start":{"line":34,"column":2},"end":{"line":34,"column":64}},{"start":{"line":34,"column":2},"end":{"line":34,"column":64}}],"line":34},"1":{"loc":{"start":{"line":35,"column":2},"end":{"line":35,"column":54}},"type":"if","locations":[{"start":{"line":35,"column":2},"end":{"line":35,"column":54}},{"start":{"line":35,"column":2},"end":{"line":35,"column":54}}],"line":35},"2":{"loc":{"start":{"line":37,"column":2},"end":{"line":37,"column":48}},"type":"if","locations":[{"start":{"line":37,"column":2},"end":{"line":37,"column":48}},{"start":{"line":37,"column":2},"end":{"line":37,"column":48}}],"line":37},"3":{"loc":{"start":{"line":47,"column":2},"end":{"line":47,"column":65}},"type":"if","locations":[{"start":{"line":47,"column":2},"end":{"line":47,"column":65}},{"start":{"line":47,"column":2},"end":{"line":47,"column":65}}],"line":47}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":0,"12":0,"13":1,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":1,"24":0,"25":0,"26":0,"27":0,"28":1,"29":0,"30":0,"31":0,"32":1},"f":{"0":0,"1":0,"2":0,"3":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"f16e59877408485faa7e8471eaf82729eb54f0a7"} +,"/home/denis/Zazmic_Internship/hw5/routes/users.js": {"path":"/home/denis/Zazmic_Internship/hw5/routes/users.js","statementMap":{"0":{"start":{"line":9,"column":16},"end":{"line":9,"column":34}},"1":{"start":{"line":10,"column":15},"end":{"line":10,"column":31}},"2":{"start":{"line":11,"column":21},"end":{"line":11,"column":53}},"3":{"start":{"line":13,"column":18},"end":{"line":13,"column":50}},"4":{"start":{"line":14,"column":11},"end":{"line":14,"column":40}},"5":{"start":{"line":16,"column":21},"end":{"line":16,"column":50}},"6":{"start":{"line":17,"column":34},"end":{"line":17,"column":64}},"7":{"start":{"line":18,"column":18},"end":{"line":18,"column":62}},"8":{"start":{"line":19,"column":24},"end":{"line":19,"column":65}},"9":{"start":{"line":21,"column":0},"end":{"line":50,"column":1}},"10":{"start":{"line":25,"column":16},"end":{"line":39,"column":3}},"11":{"start":{"line":40,"column":16},"end":{"line":40,"column":32}},"12":{"start":{"line":41,"column":2},"end":{"line":47,"column":4}},"13":{"start":{"line":42,"column":20},"end":{"line":42,"column":21}},"14":{"start":{"line":43,"column":3},"end":{"line":45,"column":5}},"15":{"start":{"line":44,"column":4},"end":{"line":44,"column":59}},"16":{"start":{"line":44,"column":35},"end":{"line":44,"column":59}},"17":{"start":{"line":46,"column":3},"end":{"line":46,"column":31}},"18":{"start":{"line":48,"column":2},"end":{"line":48,"column":27}},"19":{"start":{"line":52,"column":0},"end":{"line":58,"column":1}},"20":{"start":{"line":55,"column":15},"end":{"line":55,"column":50}},"21":{"start":{"line":56,"column":2},"end":{"line":56,"column":26}},"22":{"start":{"line":60,"column":0},"end":{"line":68,"column":1}},"23":{"start":{"line":63,"column":19},"end":{"line":63,"column":68}},"24":{"start":{"line":64,"column":16},"end":{"line":64,"column":45}},"25":{"start":{"line":65,"column":2},"end":{"line":65,"column":40}},"26":{"start":{"line":66,"column":2},"end":{"line":66,"column":30}},"27":{"start":{"line":70,"column":0},"end":{"line":70,"column":23}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":24,"column":14},"end":{"line":24,"column":15}},"loc":{"start":{"line":24,"column":34},"end":{"line":49,"column":2}},"line":24},"1":{"name":"(anonymous_1)","decl":{"start":{"line":41,"column":16},"end":{"line":41,"column":17}},"loc":{"start":{"line":41,"column":24},"end":{"line":47,"column":3}},"line":41},"2":{"name":"(anonymous_2)","decl":{"start":{"line":43,"column":17},"end":{"line":43,"column":18}},"loc":{"start":{"line":43,"column":25},"end":{"line":45,"column":4}},"line":43},"3":{"name":"(anonymous_3)","decl":{"start":{"line":54,"column":14},"end":{"line":54,"column":15}},"loc":{"start":{"line":54,"column":34},"end":{"line":57,"column":2}},"line":54},"4":{"name":"(anonymous_4)","decl":{"start":{"line":62,"column":14},"end":{"line":62,"column":15}},"loc":{"start":{"line":62,"column":34},"end":{"line":67,"column":2}},"line":62}},"branchMap":{"0":{"loc":{"start":{"line":44,"column":4},"end":{"line":44,"column":59}},"type":"if","locations":[{"start":{"line":44,"column":4},"end":{"line":44,"column":59}},{"start":{"line":44,"column":4},"end":{"line":44,"column":59}}],"line":44}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":1,"20":0,"21":0,"22":1,"23":0,"24":0,"25":0,"26":0,"27":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0},"b":{"0":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"3a82dcb0052af4f2f4652b20839e3681c9973a73"} +,"/home/denis/Zazmic_Internship/hw5/services/AuthService.js": {"path":"/home/denis/Zazmic_Internship/hw5/services/AuthService.js","statementMap":{"0":{"start":{"line":1,"column":24},"end":{"line":1,"column":43}},"1":{"start":{"line":2,"column":29},"end":{"line":2,"column":61}},"2":{"start":{"line":6,"column":2},"end":{"line":22,"column":3}},"3":{"start":{"line":7,"column":20},"end":{"line":7,"column":61}},"4":{"start":{"line":8,"column":3},"end":{"line":19,"column":4}},"5":{"start":{"line":9,"column":4},"end":{"line":9,"column":47}},"6":{"start":{"line":10,"column":17},"end":{"line":10,"column":46}},"7":{"start":{"line":11,"column":23},"end":{"line":11,"column":77}},"8":{"start":{"line":12,"column":4},"end":{"line":12,"column":85}},"9":{"start":{"line":12,"column":21},"end":{"line":12,"column":85}},"10":{"start":{"line":13,"column":4},"end":{"line":13,"column":15}},"11":{"start":{"line":15,"column":20},"end":{"line":15,"column":69}},"12":{"start":{"line":16,"column":4},"end":{"line":16,"column":46}},"13":{"start":{"line":17,"column":4},"end":{"line":17,"column":82}},"14":{"start":{"line":18,"column":4},"end":{"line":18,"column":39}},"15":{"start":{"line":21,"column":3},"end":{"line":21,"column":68}},"16":{"start":{"line":26,"column":2},"end":{"line":26,"column":62}},"17":{"start":{"line":30,"column":2},"end":{"line":30,"column":79}},"18":{"start":{"line":34,"column":0},"end":{"line":34,"column":32}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":1},"end":{"line":5,"column":2}},"loc":{"start":{"line":5,"column":98},"end":{"line":23,"column":2}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":25,"column":1},"end":{"line":25,"column":2}},"loc":{"start":{"line":25,"column":67},"end":{"line":27,"column":2}},"line":25},"2":{"name":"(anonymous_2)","decl":{"start":{"line":29,"column":1},"end":{"line":29,"column":2}},"loc":{"start":{"line":29,"column":53},"end":{"line":31,"column":2}},"line":29}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":3},"end":{"line":19,"column":4}},"type":"if","locations":[{"start":{"line":8,"column":3},"end":{"line":19,"column":4}},{"start":{"line":8,"column":3},"end":{"line":19,"column":4}}],"line":8},"1":{"loc":{"start":{"line":12,"column":4},"end":{"line":12,"column":85}},"type":"if","locations":[{"start":{"line":12,"column":4},"end":{"line":12,"column":85}},{"start":{"line":12,"column":4},"end":{"line":12,"column":85}}],"line":12}},"s":{"0":1,"1":1,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":1},"f":{"0":0,"1":0,"2":0},"b":{"0":[0,0],"1":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"23a53f10e09e6594cfba4e9d6fc74cda2f483ed9"} +,"/home/denis/Zazmic_Internship/hw5/services/emailService.js": {"path":"/home/denis/Zazmic_Internship/hw5/services/emailService.js","statementMap":{"0":{"start":{"line":1,"column":15},"end":{"line":1,"column":40}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":46}},"2":{"start":{"line":6,"column":2},"end":{"line":11,"column":4}},"3":{"start":{"line":15,"column":0},"end":{"line":15,"column":44}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":1},"end":{"line":5,"column":2}},"loc":{"start":{"line":5,"column":69},"end":{"line":12,"column":2}},"line":5}},"branchMap":{"0":{"loc":{"start":{"line":5,"column":34},"end":{"line":5,"column":49}},"type":"default-arg","locations":[{"start":{"line":5,"column":47},"end":{"line":5,"column":49}}],"line":5},"1":{"loc":{"start":{"line":5,"column":51},"end":{"line":5,"column":67}},"type":"default-arg","locations":[{"start":{"line":5,"column":65},"end":{"line":5,"column":67}}],"line":5}},"s":{"0":1,"1":1,"2":0,"3":1},"f":{"0":0},"b":{"0":[0],"1":[0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"c7e335c2c03c8313e68f15cddb3b68e1b66ff3bb"} +,"/home/denis/Zazmic_Internship/hw5/services/gcRemovalService.js": {"path":"/home/denis/Zazmic_Internship/hw5/services/gcRemovalService.js","statementMap":{"0":{"start":{"line":1,"column":43},"end":{"line":1,"column":72}},"1":{"start":{"line":2,"column":24},"end":{"line":2,"column":43}},"2":{"start":{"line":6,"column":2},"end":{"line":6,"column":26}},"3":{"start":{"line":7,"column":2},"end":{"line":7,"column":25}},"4":{"start":{"line":10,"column":2},"end":{"line":10,"column":68}},"5":{"start":{"line":14,"column":2},"end":{"line":14,"column":65}},"6":{"start":{"line":14,"column":36},"end":{"line":14,"column":63}},"7":{"start":{"line":18,"column":19},"end":{"line":18,"column":40}},"8":{"start":{"line":19,"column":19},"end":{"line":19,"column":83}},"9":{"start":{"line":20,"column":17},"end":{"line":20,"column":55}},"10":{"start":{"line":21,"column":2},"end":{"line":21,"column":109}},"11":{"start":{"line":21,"column":35},"end":{"line":21,"column":108}},"12":{"start":{"line":25,"column":25},"end":{"line":25,"column":92}},"13":{"start":{"line":26,"column":29},"end":{"line":26,"column":100}},"14":{"start":{"line":28,"column":0},"end":{"line":28,"column":59}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":1},"end":{"line":5,"column":2}},"loc":{"start":{"line":5,"column":30},"end":{"line":8,"column":2}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":9,"column":1},"end":{"line":9,"column":2}},"loc":{"start":{"line":9,"column":14},"end":{"line":11,"column":2}},"line":9},"2":{"name":"(anonymous_2)","decl":{"start":{"line":13,"column":1},"end":{"line":13,"column":2}},"loc":{"start":{"line":13,"column":24},"end":{"line":15,"column":2}},"line":13},"3":{"name":"(anonymous_3)","decl":{"start":{"line":14,"column":29},"end":{"line":14,"column":30}},"loc":{"start":{"line":14,"column":36},"end":{"line":14,"column":63}},"line":14},"4":{"name":"(anonymous_4)","decl":{"start":{"line":17,"column":1},"end":{"line":17,"column":2}},"loc":{"start":{"line":17,"column":22},"end":{"line":22,"column":2}},"line":17},"5":{"name":"(anonymous_5)","decl":{"start":{"line":21,"column":30},"end":{"line":21,"column":31}},"loc":{"start":{"line":21,"column":35},"end":{"line":21,"column":108}},"line":21}},"branchMap":{"0":{"loc":{"start":{"line":10,"column":2},"end":{"line":10,"column":68}},"type":"cond-expr","locations":[{"start":{"line":10,"column":24},"end":{"line":10,"column":45}},{"start":{"line":10,"column":48},"end":{"line":10,"column":68}}],"line":10}},"s":{"0":1,"1":1,"2":2,"3":2,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":1,"13":1,"14":1},"f":{"0":2,"1":0,"2":0,"3":0,"4":0,"5":0},"b":{"0":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"42215053b228af6782cbfab845d9dcad510e4a4b"} +,"/home/denis/Zazmic_Internship/hw5/services/gcStorageService.js": {"path":"/home/denis/Zazmic_Internship/hw5/services/gcStorageService.js","statementMap":{"0":{"start":{"line":1,"column":20},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":13},"end":{"line":2,"column":28}},"2":{"start":{"line":3,"column":14},"end":{"line":3,"column":30}},"3":{"start":{"line":4,"column":24},"end":{"line":4,"column":43}},"4":{"start":{"line":8,"column":2},"end":{"line":8,"column":80}},"5":{"start":{"line":8,"column":20},"end":{"line":8,"column":80}},"6":{"start":{"line":9,"column":2},"end":{"line":9,"column":99}},"7":{"start":{"line":9,"column":25},"end":{"line":9,"column":99}},"8":{"start":{"line":10,"column":2},"end":{"line":10,"column":63}},"9":{"start":{"line":11,"column":2},"end":{"line":11,"column":54}},"10":{"start":{"line":12,"column":2},"end":{"line":12,"column":65}},"11":{"start":{"line":13,"column":2},"end":{"line":13,"column":53}},"12":{"start":{"line":14,"column":2},"end":{"line":14,"column":21}},"13":{"start":{"line":18,"column":2},"end":{"line":18,"column":92}},"14":{"start":{"line":22,"column":17},"end":{"line":22,"column":27}},"15":{"start":{"line":23,"column":2},"end":{"line":23,"column":44}},"16":{"start":{"line":27,"column":2},"end":{"line":49,"column":4}},"17":{"start":{"line":28,"column":3},"end":{"line":28,"column":26}},"18":{"start":{"line":28,"column":12},"end":{"line":28,"column":26}},"19":{"start":{"line":29,"column":3},"end":{"line":48,"column":5}},"20":{"start":{"line":30,"column":4},"end":{"line":30,"column":27}},"21":{"start":{"line":30,"column":13},"end":{"line":30,"column":27}},"22":{"start":{"line":31,"column":22},"end":{"line":31,"column":54}},"23":{"start":{"line":32,"column":17},"end":{"line":32,"column":47}},"24":{"start":{"line":33,"column":23},"end":{"line":33,"column":74}},"25":{"start":{"line":34,"column":25},"end":{"line":34,"column":90}},"26":{"start":{"line":35,"column":4},"end":{"line":47,"column":7}},"27":{"start":{"line":39,"column":6},"end":{"line":39,"column":72}},"28":{"start":{"line":40,"column":6},"end":{"line":40,"column":13}},"29":{"start":{"line":43,"column":6},"end":{"line":46,"column":8}},"30":{"start":{"line":53,"column":2},"end":{"line":53,"column":45}},"31":{"start":{"line":57,"column":22},"end":{"line":62,"column":2}},"32":{"start":{"line":64,"column":24},"end":{"line":69,"column":2}},"33":{"start":{"line":71,"column":0},"end":{"line":71,"column":51}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":7,"column":1},"end":{"line":7,"column":2}},"loc":{"start":{"line":7,"column":19},"end":{"line":15,"column":2}},"line":7},"1":{"name":"(anonymous_1)","decl":{"start":{"line":17,"column":1},"end":{"line":17,"column":2}},"loc":{"start":{"line":17,"column":31},"end":{"line":19,"column":2}},"line":17},"2":{"name":"(anonymous_2)","decl":{"start":{"line":21,"column":1},"end":{"line":21,"column":2}},"loc":{"start":{"line":21,"column":28},"end":{"line":24,"column":2}},"line":21},"3":{"name":"(anonymous_3)","decl":{"start":{"line":26,"column":1},"end":{"line":26,"column":2}},"loc":{"start":{"line":26,"column":28},"end":{"line":50,"column":2}},"line":26},"4":{"name":"(anonymous_4)","decl":{"start":{"line":27,"column":33},"end":{"line":27,"column":34}},"loc":{"start":{"line":27,"column":55},"end":{"line":49,"column":3}},"line":27},"5":{"name":"(anonymous_5)","decl":{"start":{"line":29,"column":31},"end":{"line":29,"column":32}},"loc":{"start":{"line":29,"column":56},"end":{"line":48,"column":4}},"line":29},"6":{"name":"(anonymous_6)","decl":{"start":{"line":38,"column":18},"end":{"line":38,"column":19}},"loc":{"start":{"line":38,"column":25},"end":{"line":41,"column":6}},"line":38},"7":{"name":"(anonymous_7)","decl":{"start":{"line":42,"column":19},"end":{"line":42,"column":20}},"loc":{"start":{"line":42,"column":25},"end":{"line":47,"column":6}},"line":42},"8":{"name":"(anonymous_8)","decl":{"start":{"line":52,"column":1},"end":{"line":52,"column":2}},"loc":{"start":{"line":52,"column":28},"end":{"line":54,"column":2}},"line":52}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":2},"end":{"line":8,"column":80}},"type":"if","locations":[{"start":{"line":8,"column":2},"end":{"line":8,"column":80}},{"start":{"line":8,"column":2},"end":{"line":8,"column":80}}],"line":8},"1":{"loc":{"start":{"line":9,"column":2},"end":{"line":9,"column":99}},"type":"if","locations":[{"start":{"line":9,"column":2},"end":{"line":9,"column":99}},{"start":{"line":9,"column":2},"end":{"line":9,"column":99}}],"line":9},"2":{"loc":{"start":{"line":10,"column":24},"end":{"line":10,"column":63}},"type":"binary-expr","locations":[{"start":{"line":10,"column":24},"end":{"line":10,"column":40}},{"start":{"line":10,"column":44},"end":{"line":10,"column":63}}],"line":10},"3":{"loc":{"start":{"line":11,"column":21},"end":{"line":11,"column":54}},"type":"binary-expr","locations":[{"start":{"line":11,"column":21},"end":{"line":11,"column":34}},{"start":{"line":11,"column":38},"end":{"line":11,"column":54}}],"line":11},"4":{"loc":{"start":{"line":28,"column":3},"end":{"line":28,"column":26}},"type":"if","locations":[{"start":{"line":28,"column":3},"end":{"line":28,"column":26}},{"start":{"line":28,"column":3},"end":{"line":28,"column":26}}],"line":28},"5":{"loc":{"start":{"line":30,"column":4},"end":{"line":30,"column":27}},"type":"if","locations":[{"start":{"line":30,"column":4},"end":{"line":30,"column":27}},{"start":{"line":30,"column":4},"end":{"line":30,"column":27}}],"line":30},"6":{"loc":{"start":{"line":33,"column":40},"end":{"line":33,"column":72}},"type":"binary-expr","locations":[{"start":{"line":33,"column":40},"end":{"line":33,"column":56}},{"start":{"line":33,"column":60},"end":{"line":33,"column":72}}],"line":33}},"s":{"0":1,"1":1,"2":1,"3":1,"4":2,"5":0,"6":2,"7":0,"8":2,"9":2,"10":2,"11":2,"12":2,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":1,"32":1,"33":1},"f":{"0":2,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0},"b":{"0":[0,2],"1":[0,2],"2":[2,2],"3":[2,2],"4":[0,0],"5":[0,0],"6":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"75aeca3c3beace292294e922e9183393e6490dab"} +,"/home/denis/Zazmic_Internship/hw5/services/hashPsw.js": {"path":"/home/denis/Zazmic_Internship/hw5/services/hashPsw.js","statementMap":{"0":{"start":{"line":1,"column":15},"end":{"line":1,"column":32}},"1":{"start":{"line":2,"column":24},"end":{"line":2,"column":43}},"2":{"start":{"line":3,"column":18},"end":{"line":3,"column":20}},"3":{"start":{"line":5,"column":21},"end":{"line":13,"column":1}},"4":{"start":{"line":6,"column":1},"end":{"line":12,"column":2}},"5":{"start":{"line":7,"column":2},"end":{"line":9,"column":3}},"6":{"start":{"line":8,"column":3},"end":{"line":8,"column":62}},"7":{"start":{"line":11,"column":2},"end":{"line":11,"column":77}},"8":{"start":{"line":15,"column":17},"end":{"line":15,"column":57}},"9":{"start":{"line":15,"column":32},"end":{"line":15,"column":57}},"10":{"start":{"line":17,"column":0},"end":{"line":17,"column":43}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":21},"end":{"line":5,"column":22}},"loc":{"start":{"line":5,"column":35},"end":{"line":13,"column":1}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":15,"column":17},"end":{"line":15,"column":18}},"loc":{"start":{"line":15,"column":32},"end":{"line":15,"column":57}},"line":15}},"branchMap":{"0":{"loc":{"start":{"line":7,"column":2},"end":{"line":9,"column":3}},"type":"if","locations":[{"start":{"line":7,"column":2},"end":{"line":9,"column":3}},{"start":{"line":7,"column":2},"end":{"line":9,"column":3}}],"line":7}},"s":{"0":1,"1":1,"2":1,"3":1,"4":2,"5":2,"6":1,"7":0,"8":1,"9":0,"10":1},"f":{"0":2,"1":0},"b":{"0":[1,1]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"4fba305e51456a27d019709fa766696cfcdebda8"} +,"/home/denis/Zazmic_Internship/hw5/services/helpers.js": {"path":"/home/denis/Zazmic_Internship/hw5/services/helpers.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":26}},"1":{"start":{"line":3,"column":30},"end":{"line":9,"column":1}},"2":{"start":{"line":4,"column":1},"end":{"line":8,"column":3}},"3":{"start":{"line":5,"column":2},"end":{"line":7,"column":4}},"4":{"start":{"line":6,"column":3},"end":{"line":6,"column":80}},"5":{"start":{"line":6,"column":46},"end":{"line":6,"column":80}},"6":{"start":{"line":11,"column":15},"end":{"line":15,"column":1}},"7":{"start":{"line":12,"column":1},"end":{"line":12,"column":13}},"8":{"start":{"line":13,"column":1},"end":{"line":13,"column":22}},"9":{"start":{"line":14,"column":1},"end":{"line":14,"column":13}},"10":{"start":{"line":17,"column":24},"end":{"line":17,"column":92}},"11":{"start":{"line":17,"column":31},"end":{"line":17,"column":92}},"12":{"start":{"line":19,"column":0},"end":{"line":19,"column":67}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":30},"end":{"line":3,"column":31}},"loc":{"start":{"line":3,"column":51},"end":{"line":9,"column":1}},"line":3},"1":{"name":"(anonymous_1)","decl":{"start":{"line":4,"column":18},"end":{"line":4,"column":19}},"loc":{"start":{"line":4,"column":26},"end":{"line":8,"column":2}},"line":4},"2":{"name":"(anonymous_2)","decl":{"start":{"line":5,"column":16},"end":{"line":5,"column":17}},"loc":{"start":{"line":5,"column":24},"end":{"line":7,"column":3}},"line":5},"3":{"name":"(anonymous_3)","decl":{"start":{"line":11,"column":15},"end":{"line":11,"column":16}},"loc":{"start":{"line":11,"column":29},"end":{"line":15,"column":1}},"line":11},"4":{"name":"(anonymous_4)","decl":{"start":{"line":17,"column":24},"end":{"line":17,"column":25}},"loc":{"start":{"line":17,"column":31},"end":{"line":17,"column":92}},"line":17}},"branchMap":{"0":{"loc":{"start":{"line":6,"column":3},"end":{"line":6,"column":80}},"type":"if","locations":[{"start":{"line":6,"column":3},"end":{"line":6,"column":80}},{"start":{"line":6,"column":3},"end":{"line":6,"column":80}}],"line":6}},"s":{"0":1,"1":1,"2":0,"3":0,"4":0,"5":0,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1},"f":{"0":0,"1":0,"2":0,"3":1,"4":1},"b":{"0":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"da9e9ae3a912e86cde558b4b715ce8db3ef21d49"} +,"/home/denis/Zazmic_Internship/hw5/services/logger.js": {"path":"/home/denis/Zazmic_Internship/hw5/services/logger.js","statementMap":{"0":{"start":{"line":1,"column":16},"end":{"line":1,"column":34}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":26}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":37}},"3":{"start":{"line":5,"column":45},"end":{"line":5,"column":52}},"4":{"start":{"line":7,"column":23},"end":{"line":24,"column":2}},"5":{"start":{"line":26,"column":20},"end":{"line":44,"column":2}},"6":{"start":{"line":46,"column":23},"end":{"line":64,"column":2}},"7":{"start":{"line":66,"column":24},"end":{"line":69,"column":1}},"8":{"start":{"line":67,"column":1},"end":{"line":67,"column":61}},"9":{"start":{"line":68,"column":1},"end":{"line":68,"column":39}},"10":{"start":{"line":68,"column":23},"end":{"line":68,"column":38}},"11":{"start":{"line":71,"column":0},"end":{"line":71,"column":48}},"12":{"start":{"line":72,"column":0},"end":{"line":72,"column":49}},"13":{"start":{"line":74,"column":0},"end":{"line":78,"column":1}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":66,"column":24},"end":{"line":66,"column":25}},"loc":{"start":{"line":66,"column":33},"end":{"line":69,"column":1}},"line":66},"1":{"name":"(anonymous_1)","decl":{"start":{"line":68,"column":17},"end":{"line":68,"column":18}},"loc":{"start":{"line":68,"column":23},"end":{"line":68,"column":38}},"line":68}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":0,"9":0,"10":0,"11":1,"12":1,"13":1},"f":{"0":0,"1":0},"b":{},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"b954a0172387f7be8517682f687c7e2189e050bf"} +,"/home/denis/Zazmic_Internship/hw5/services/multer.js": {"path":"/home/denis/Zazmic_Internship/hw5/services/multer.js","statementMap":{"0":{"start":{"line":1,"column":15},"end":{"line":1,"column":32}},"1":{"start":{"line":3,"column":43},"end":{"line":3,"column":72}},"2":{"start":{"line":5,"column":21},"end":{"line":10,"column":2}},"3":{"start":{"line":12,"column":23},"end":{"line":17,"column":2}},"4":{"start":{"line":19,"column":0},"end":{"line":19,"column":49}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1},"f":{},"b":{},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"ce37a63705b31f9094c8b3f1d12e6fcf2ea0bc83"} +,"/home/denis/Zazmic_Internship/hw5/services/passportService.js": {"path":"/home/denis/Zazmic_Internship/hw5/services/passportService.js","statementMap":{"0":{"start":{"line":1,"column":22},"end":{"line":1,"column":56}},"1":{"start":{"line":2,"column":23},"end":{"line":2,"column":57}},"2":{"start":{"line":3,"column":25},"end":{"line":3,"column":62}},"3":{"start":{"line":5,"column":24},"end":{"line":5,"column":43}},"4":{"start":{"line":6,"column":21},"end":{"line":6,"column":41}},"5":{"start":{"line":7,"column":18},"end":{"line":7,"column":50}},"6":{"start":{"line":8,"column":24},"end":{"line":8,"column":48}},"7":{"start":{"line":10,"column":0},"end":{"line":88,"column":1}},"8":{"start":{"line":11,"column":1},"end":{"line":11,"column":60}},"9":{"start":{"line":11,"column":40},"end":{"line":11,"column":59}},"10":{"start":{"line":13,"column":1},"end":{"line":21,"column":3}},"11":{"start":{"line":14,"column":2},"end":{"line":20,"column":3}},"12":{"start":{"line":15,"column":16},"end":{"line":15,"column":40}},"13":{"start":{"line":16,"column":3},"end":{"line":16,"column":26}},"14":{"start":{"line":18,"column":3},"end":{"line":18,"column":12}},"15":{"start":{"line":19,"column":3},"end":{"line":19,"column":68}},"16":{"start":{"line":23,"column":1},"end":{"line":37,"column":2}},"17":{"start":{"line":25,"column":3},"end":{"line":35,"column":4}},"18":{"start":{"line":26,"column":21},"end":{"line":26,"column":80}},"19":{"start":{"line":27,"column":17},"end":{"line":27,"column":46}},"20":{"start":{"line":28,"column":4},"end":{"line":28,"column":94}},"21":{"start":{"line":28,"column":26},"end":{"line":28,"column":94}},"22":{"start":{"line":29,"column":18},"end":{"line":29,"column":57}},"23":{"start":{"line":30,"column":4},"end":{"line":30,"column":38}},"24":{"start":{"line":30,"column":15},"end":{"line":30,"column":38}},"25":{"start":{"line":31,"column":4},"end":{"line":31,"column":25}},"26":{"start":{"line":33,"column":4},"end":{"line":33,"column":13}},"27":{"start":{"line":34,"column":4},"end":{"line":34,"column":69}},"28":{"start":{"line":39,"column":1},"end":{"line":61,"column":2}},"29":{"start":{"line":47,"column":4},"end":{"line":58,"column":5}},"30":{"start":{"line":48,"column":18},"end":{"line":54,"column":7}},"31":{"start":{"line":55,"column":5},"end":{"line":55,"column":21}},"32":{"start":{"line":57,"column":5},"end":{"line":57,"column":12}},"33":{"start":{"line":63,"column":1},"end":{"line":87,"column":2}},"34":{"start":{"line":73,"column":4},"end":{"line":84,"column":5}},"35":{"start":{"line":74,"column":18},"end":{"line":80,"column":7}},"36":{"start":{"line":81,"column":5},"end":{"line":81,"column":21}},"37":{"start":{"line":83,"column":5},"end":{"line":83,"column":16}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":10,"column":17},"end":{"line":10,"column":18}},"loc":{"start":{"line":10,"column":29},"end":{"line":88,"column":1}},"line":10},"1":{"name":"(anonymous_1)","decl":{"start":{"line":11,"column":24},"end":{"line":11,"column":25}},"loc":{"start":{"line":11,"column":40},"end":{"line":11,"column":59}},"line":11},"2":{"name":"(anonymous_2)","decl":{"start":{"line":13,"column":26},"end":{"line":13,"column":27}},"loc":{"start":{"line":13,"column":46},"end":{"line":21,"column":2}},"line":13},"3":{"name":"(anonymous_3)","decl":{"start":{"line":24,"column":75},"end":{"line":24,"column":76}},"loc":{"start":{"line":24,"column":108},"end":{"line":36,"column":3}},"line":24},"4":{"name":"(anonymous_4)","decl":{"start":{"line":46,"column":3},"end":{"line":46,"column":4}},"loc":{"start":{"line":46,"column":55},"end":{"line":59,"column":4}},"line":46},"5":{"name":"(anonymous_5)","decl":{"start":{"line":72,"column":3},"end":{"line":72,"column":4}},"loc":{"start":{"line":72,"column":55},"end":{"line":85,"column":4}},"line":72}},"branchMap":{"0":{"loc":{"start":{"line":28,"column":4},"end":{"line":28,"column":94}},"type":"if","locations":[{"start":{"line":28,"column":4},"end":{"line":28,"column":94}},{"start":{"line":28,"column":4},"end":{"line":28,"column":94}}],"line":28},"1":{"loc":{"start":{"line":30,"column":4},"end":{"line":30,"column":38}},"type":"if","locations":[{"start":{"line":30,"column":4},"end":{"line":30,"column":38}},{"start":{"line":30,"column":4},"end":{"line":30,"column":38}}],"line":30}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":0,"15":0,"16":1,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":1,"29":0,"30":0,"31":0,"32":0,"33":1,"34":0,"35":0,"36":0,"37":0},"f":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0},"b":{"0":[0,0],"1":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"75bf855ce67969158e80663c898f5d9b220a32b7"} +,"/home/denis/Zazmic_Internship/hw5/services/queryHelperService.js": {"path":"/home/denis/Zazmic_Internship/hw5/services/queryHelperService.js","statementMap":{"0":{"start":{"line":1,"column":11},"end":{"line":1,"column":34}},"1":{"start":{"line":2,"column":38},"end":{"line":2,"column":67}},"2":{"start":{"line":4,"column":20},"end":{"line":17,"column":1}},"3":{"start":{"line":5,"column":16},"end":{"line":5,"column":18}},"4":{"start":{"line":6,"column":1},"end":{"line":9,"column":2}},"5":{"start":{"line":7,"column":26},"end":{"line":7,"column":42}},"6":{"start":{"line":8,"column":2},"end":{"line":8,"column":75}},"7":{"start":{"line":10,"column":1},"end":{"line":10,"column":43}},"8":{"start":{"line":10,"column":15},"end":{"line":10,"column":43}},"9":{"start":{"line":11,"column":1},"end":{"line":16,"column":3}},"10":{"start":{"line":19,"column":20},"end":{"line":27,"column":1}},"11":{"start":{"line":20,"column":16},"end":{"line":20,"column":92}},"12":{"start":{"line":21,"column":1},"end":{"line":26,"column":3}},"13":{"start":{"line":29,"column":0},"end":{"line":29,"column":45}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":20},"end":{"line":4,"column":21}},"loc":{"start":{"line":4,"column":47},"end":{"line":17,"column":1}},"line":4},"1":{"name":"(anonymous_1)","decl":{"start":{"line":19,"column":20},"end":{"line":19,"column":21}},"loc":{"start":{"line":19,"column":55},"end":{"line":27,"column":1}},"line":19}},"branchMap":{"0":{"loc":{"start":{"line":6,"column":1},"end":{"line":9,"column":2}},"type":"if","locations":[{"start":{"line":6,"column":1},"end":{"line":9,"column":2}},{"start":{"line":6,"column":1},"end":{"line":9,"column":2}}],"line":6},"1":{"loc":{"start":{"line":10,"column":1},"end":{"line":10,"column":43}},"type":"if","locations":[{"start":{"line":10,"column":1},"end":{"line":10,"column":43}},{"start":{"line":10,"column":1},"end":{"line":10,"column":43}}],"line":10},"2":{"loc":{"start":{"line":20,"column":16},"end":{"line":20,"column":92}},"type":"cond-expr","locations":[{"start":{"line":20,"column":32},"end":{"line":20,"column":45}},{"start":{"line":20,"column":48},"end":{"line":20,"column":92}}],"line":20}},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":1,"11":0,"12":0,"13":1},"f":{"0":0,"1":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"f3dae97792637a222329b6856891e0aaeaf2d301"} +,"/home/denis/Zazmic_Internship/hw5/services/rateLimitService.js": {"path":"/home/denis/Zazmic_Internship/hw5/services/rateLimitService.js","statementMap":{"0":{"start":{"line":1,"column":18},"end":{"line":1,"column":47}},"1":{"start":{"line":2,"column":20},"end":{"line":2,"column":47}},"2":{"start":{"line":3,"column":29},"end":{"line":3,"column":61}},"3":{"start":{"line":5,"column":0},"end":{"line":33,"column":1}},"4":{"start":{"line":6,"column":17},"end":{"line":13,"column":3}},"5":{"start":{"line":15,"column":22},"end":{"line":23,"column":3}},"6":{"start":{"line":25,"column":19},"end":{"line":30,"column":3}},"7":{"start":{"line":32,"column":1},"end":{"line":32,"column":44}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":17},"end":{"line":5,"column":18}},"loc":{"start":{"line":5,"column":27},"end":{"line":33,"column":1}},"line":5}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1},"f":{"0":1},"b":{},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"c9dcba3e89082818906335383353098399a9b727"} +,"/home/denis/Zazmic_Internship/hw5/services/redisConnectService.js": {"path":"/home/denis/Zazmic_Internship/hw5/services/redisConnectService.js","statementMap":{"0":{"start":{"line":1,"column":10},"end":{"line":1,"column":28}},"1":{"start":{"line":2,"column":15},"end":{"line":2,"column":43}},"2":{"start":{"line":3,"column":24},"end":{"line":3,"column":43}},"3":{"start":{"line":5,"column":0},"end":{"line":7,"column":2}},"4":{"start":{"line":6,"column":1},"end":{"line":6,"column":58}},"5":{"start":{"line":9,"column":0},"end":{"line":9,"column":23}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":19},"end":{"line":5,"column":20}},"loc":{"start":{"line":5,"column":26},"end":{"line":7,"column":1}},"line":5}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":0,"5":1},"f":{"0":0},"b":{},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"821831e44397782ecec8c8f7438128d33fce7f24"} +,"/home/denis/Zazmic_Internship/hw5/services/socketService.js": {"path":"/home/denis/Zazmic_Internship/hw5/services/socketService.js","statementMap":{"0":{"start":{"line":1,"column":17},"end":{"line":1,"column":37}},"1":{"start":{"line":2,"column":25},"end":{"line":2,"column":53}},"2":{"start":{"line":3,"column":16},"end":{"line":3,"column":42}},"3":{"start":{"line":5,"column":24},"end":{"line":5,"column":43}},"4":{"start":{"line":7,"column":0},"end":{"line":39,"column":1}},"5":{"start":{"line":8,"column":12},"end":{"line":8,"column":28}},"6":{"start":{"line":9,"column":1},"end":{"line":9,"column":43}},"7":{"start":{"line":10,"column":1},"end":{"line":16,"column":2}},"8":{"start":{"line":14,"column":43},"end":{"line":14,"column":51}},"9":{"start":{"line":18,"column":1},"end":{"line":37,"column":3}},"10":{"start":{"line":19,"column":2},"end":{"line":21,"column":4}},"11":{"start":{"line":20,"column":3},"end":{"line":20,"column":87}},"12":{"start":{"line":20,"column":12},"end":{"line":20,"column":87}},"13":{"start":{"line":22,"column":13},"end":{"line":22,"column":52}},"14":{"start":{"line":23,"column":2},"end":{"line":28,"column":4}},"15":{"start":{"line":24,"column":3},"end":{"line":27,"column":58}},"16":{"start":{"line":26,"column":21},"end":{"line":26,"column":27}},"17":{"start":{"line":27,"column":22},"end":{"line":27,"column":57}},"18":{"start":{"line":29,"column":2},"end":{"line":36,"column":3}},"19":{"start":{"line":30,"column":3},"end":{"line":30,"column":77}},"20":{"start":{"line":30,"column":44},"end":{"line":30,"column":76}},"21":{"start":{"line":31,"column":3},"end":{"line":31,"column":80}},"22":{"start":{"line":31,"column":46},"end":{"line":31,"column":79}},"23":{"start":{"line":33,"column":3},"end":{"line":35,"column":5}},"24":{"start":{"line":34,"column":4},"end":{"line":34,"column":79}},"25":{"start":{"line":38,"column":1},"end":{"line":38,"column":10}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":7,"column":17},"end":{"line":7,"column":18}},"loc":{"start":{"line":7,"column":48},"end":{"line":39,"column":1}},"line":7},"1":{"name":"(anonymous_1)","decl":{"start":{"line":14,"column":9},"end":{"line":14,"column":10}},"loc":{"start":{"line":14,"column":43},"end":{"line":14,"column":51}},"line":14},"2":{"name":"(anonymous_2)","decl":{"start":{"line":18,"column":21},"end":{"line":18,"column":22}},"loc":{"start":{"line":18,"column":38},"end":{"line":37,"column":2}},"line":18},"3":{"name":"(anonymous_3)","decl":{"start":{"line":19,"column":29},"end":{"line":19,"column":30}},"loc":{"start":{"line":19,"column":47},"end":{"line":21,"column":3}},"line":19},"4":{"name":"(anonymous_4)","decl":{"start":{"line":23,"column":13},"end":{"line":23,"column":14}},"loc":{"start":{"line":23,"column":31},"end":{"line":28,"column":3}},"line":23},"5":{"name":"(anonymous_5)","decl":{"start":{"line":26,"column":10},"end":{"line":26,"column":11}},"loc":{"start":{"line":26,"column":21},"end":{"line":26,"column":27}},"line":26},"6":{"name":"(anonymous_6)","decl":{"start":{"line":27,"column":11},"end":{"line":27,"column":12}},"loc":{"start":{"line":27,"column":22},"end":{"line":27,"column":57}},"line":27},"7":{"name":"(anonymous_7)","decl":{"start":{"line":30,"column":31},"end":{"line":30,"column":32}},"loc":{"start":{"line":30,"column":44},"end":{"line":30,"column":76}},"line":30},"8":{"name":"(anonymous_8)","decl":{"start":{"line":31,"column":33},"end":{"line":31,"column":34}},"loc":{"start":{"line":31,"column":46},"end":{"line":31,"column":79}},"line":31},"9":{"name":"(anonymous_9)","decl":{"start":{"line":33,"column":31},"end":{"line":33,"column":32}},"loc":{"start":{"line":33,"column":44},"end":{"line":35,"column":4}},"line":33}},"branchMap":{"0":{"loc":{"start":{"line":20,"column":3},"end":{"line":20,"column":87}},"type":"if","locations":[{"start":{"line":20,"column":3},"end":{"line":20,"column":87}},{"start":{"line":20,"column":3},"end":{"line":20,"column":87}}],"line":20},"1":{"loc":{"start":{"line":29,"column":2},"end":{"line":36,"column":3}},"type":"if","locations":[{"start":{"line":29,"column":2},"end":{"line":36,"column":3}},{"start":{"line":29,"column":2},"end":{"line":36,"column":3}}],"line":29}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":0,"9":1,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":1},"f":{"0":1,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0},"b":{"0":[0,0],"1":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"74419e1df21ef0e52cddf14450c4db6638a40dab"} +,"/home/denis/Zazmic_Internship/hw5/services/stripeService.js": {"path":"/home/denis/Zazmic_Internship/hw5/services/stripeService.js","statementMap":{"0":{"start":{"line":1,"column":15},"end":{"line":1,"column":55}},"1":{"start":{"line":2,"column":21},"end":{"line":2,"column":53}},"2":{"start":{"line":3,"column":18},"end":{"line":3,"column":47}},"3":{"start":{"line":5,"column":23},"end":{"line":12,"column":2}},"4":{"start":{"line":6,"column":18},"end":{"line":6,"column":85}},"5":{"start":{"line":7,"column":17},"end":{"line":10,"column":2}},"6":{"start":{"line":11,"column":1},"end":{"line":11,"column":101}},"7":{"start":{"line":14,"column":21},"end":{"line":23,"column":2}},"8":{"start":{"line":15,"column":16},"end":{"line":21,"column":3}},"9":{"start":{"line":22,"column":1},"end":{"line":22,"column":42}},"10":{"start":{"line":25,"column":25},"end":{"line":32,"column":2}},"11":{"start":{"line":26,"column":17},"end":{"line":26,"column":68}},"12":{"start":{"line":27,"column":11},"end":{"line":27,"column":12}},"13":{"start":{"line":28,"column":1},"end":{"line":30,"column":3}},"14":{"start":{"line":29,"column":2},"end":{"line":29,"column":20}},"15":{"start":{"line":31,"column":1},"end":{"line":31,"column":17}},"16":{"start":{"line":34,"column":0},"end":{"line":34,"column":67}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":36},"end":{"line":5,"column":37}},"loc":{"start":{"line":5,"column":59},"end":{"line":12,"column":1}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":14,"column":34},"end":{"line":14,"column":35}},"loc":{"start":{"line":14,"column":79},"end":{"line":23,"column":1}},"line":14},"2":{"name":"(anonymous_2)","decl":{"start":{"line":25,"column":38},"end":{"line":25,"column":39}},"loc":{"start":{"line":25,"column":58},"end":{"line":32,"column":1}},"line":25},"3":{"name":"(anonymous_3)","decl":{"start":{"line":28,"column":22},"end":{"line":28,"column":23}},"loc":{"start":{"line":28,"column":30},"end":{"line":30,"column":2}},"line":28}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":8},"end":{"line":11,"column":101}},"type":"cond-expr","locations":[{"start":{"line":11,"column":18},"end":{"line":11,"column":94}},{"start":{"line":11,"column":97},"end":{"line":11,"column":101}}],"line":11},"1":{"loc":{"start":{"line":22,"column":8},"end":{"line":22,"column":42}},"type":"cond-expr","locations":[{"start":{"line":22,"column":17},"end":{"line":22,"column":35}},{"start":{"line":22,"column":38},"end":{"line":22,"column":42}}],"line":22}},"s":{"0":1,"1":1,"2":1,"3":1,"4":0,"5":0,"6":0,"7":1,"8":0,"9":0,"10":1,"11":0,"12":0,"13":0,"14":0,"15":0,"16":1},"f":{"0":0,"1":0,"2":0,"3":0},"b":{"0":[0,0],"1":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"a0a642d6369c9117dbcf87f8e72f9cbf3ba2735a"} +,"/home/denis/Zazmic_Internship/hw5/services/validationService.js": {"path":"/home/denis/Zazmic_Internship/hw5/services/validationService.js","statementMap":{"0":{"start":{"line":1,"column":17},"end":{"line":1,"column":45}},"1":{"start":{"line":3,"column":23},"end":{"line":3,"column":68}},"2":{"start":{"line":5,"column":15},"end":{"line":12,"column":1}},"3":{"start":{"line":6,"column":17},"end":{"line":6,"column":27}},"4":{"start":{"line":7,"column":17},"end":{"line":7,"column":24}},"5":{"start":{"line":8,"column":1},"end":{"line":8,"column":35}},"6":{"start":{"line":8,"column":23},"end":{"line":8,"column":35}},"7":{"start":{"line":9,"column":1},"end":{"line":9,"column":39}},"8":{"start":{"line":9,"column":27},"end":{"line":9,"column":39}},"9":{"start":{"line":10,"column":1},"end":{"line":10,"column":39}},"10":{"start":{"line":10,"column":27},"end":{"line":10,"column":39}},"11":{"start":{"line":11,"column":1},"end":{"line":11,"column":12}},"12":{"start":{"line":14,"column":27},"end":{"line":14,"column":53}},"13":{"start":{"line":14,"column":36},"end":{"line":14,"column":53}},"14":{"start":{"line":16,"column":31},"end":{"line":33,"column":2}},"15":{"start":{"line":35,"column":24},"end":{"line":46,"column":2}},"16":{"start":{"line":48,"column":20},"end":{"line":52,"column":1}},"17":{"start":{"line":49,"column":14},"end":{"line":49,"column":29}},"18":{"start":{"line":50,"column":1},"end":{"line":50,"column":30}},"19":{"start":{"line":50,"column":19},"end":{"line":50,"column":30}},"20":{"start":{"line":51,"column":1},"end":{"line":51,"column":13}},"21":{"start":{"line":54,"column":26},"end":{"line":66,"column":2}},"22":{"start":{"line":68,"column":27},"end":{"line":75,"column":2}},"23":{"start":{"line":77,"column":26},"end":{"line":83,"column":2}},"24":{"start":{"line":85,"column":0},"end":{"line":85,"column":118}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":15},"end":{"line":5,"column":16}},"loc":{"start":{"line":5,"column":24},"end":{"line":12,"column":1}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":14,"column":27},"end":{"line":14,"column":28}},"loc":{"start":{"line":14,"column":36},"end":{"line":14,"column":53}},"line":14},"2":{"name":"(anonymous_2)","decl":{"start":{"line":48,"column":20},"end":{"line":48,"column":21}},"loc":{"start":{"line":48,"column":29},"end":{"line":52,"column":1}},"line":48}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":1},"end":{"line":8,"column":35}},"type":"if","locations":[{"start":{"line":8,"column":1},"end":{"line":8,"column":35}},{"start":{"line":8,"column":1},"end":{"line":8,"column":35}}],"line":8},"1":{"loc":{"start":{"line":9,"column":1},"end":{"line":9,"column":39}},"type":"if","locations":[{"start":{"line":9,"column":1},"end":{"line":9,"column":39}},{"start":{"line":9,"column":1},"end":{"line":9,"column":39}}],"line":9},"2":{"loc":{"start":{"line":10,"column":1},"end":{"line":10,"column":39}},"type":"if","locations":[{"start":{"line":10,"column":1},"end":{"line":10,"column":39}},{"start":{"line":10,"column":1},"end":{"line":10,"column":39}}],"line":10},"3":{"loc":{"start":{"line":50,"column":1},"end":{"line":50,"column":30}},"type":"if","locations":[{"start":{"line":50,"column":1},"end":{"line":50,"column":30}},{"start":{"line":50,"column":1},"end":{"line":50,"column":30}}],"line":50}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":0,"7":1,"8":0,"9":1,"10":0,"11":1,"12":1,"13":0,"14":1,"15":1,"16":1,"17":0,"18":0,"19":0,"20":0,"21":1,"22":1,"23":1,"24":1},"f":{"0":1,"1":0,"2":0},"b":{"0":[0,1],"1":[0,1],"2":[0,1],"3":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"e239f4c62f3446e899fb6feb0c63777486531dff"} +,"/home/denis/Zazmic_Internship/hw5/services/middlewares/authCheck.js": {"path":"/home/denis/Zazmic_Internship/hw5/services/middlewares/authCheck.js","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":5,"column":1}},"1":{"start":{"line":3,"column":1},"end":{"line":3,"column":41}},"2":{"start":{"line":3,"column":28},"end":{"line":3,"column":41}},"3":{"start":{"line":4,"column":1},"end":{"line":4,"column":54}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":17},"end":{"line":2,"column":18}},"loc":{"start":{"line":2,"column":37},"end":{"line":5,"column":1}},"line":2}},"branchMap":{"0":{"loc":{"start":{"line":3,"column":1},"end":{"line":3,"column":41}},"type":"if","locations":[{"start":{"line":3,"column":1},"end":{"line":3,"column":41}},{"start":{"line":3,"column":1},"end":{"line":3,"column":41}}],"line":3}},"s":{"0":1,"1":0,"2":0,"3":0},"f":{"0":0},"b":{"0":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"b9c2c02e5423ca7c1b8892858085319f1895ee08"} +,"/home/denis/Zazmic_Internship/hw5/services/middlewares/validation.js": {"path":"/home/denis/Zazmic_Internship/hw5/services/middlewares/validation.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":57}},"1":{"start":{"line":3,"column":19},"end":{"line":13,"column":1}},"2":{"start":{"line":4,"column":21},"end":{"line":11,"column":2}},"3":{"start":{"line":7,"column":18},"end":{"line":7,"column":39}},"4":{"start":{"line":8,"column":3},"end":{"line":8,"column":81}},"5":{"start":{"line":8,"column":26},"end":{"line":8,"column":81}},"6":{"start":{"line":9,"column":3},"end":{"line":9,"column":9}},"7":{"start":{"line":12,"column":1},"end":{"line":12,"column":19}},"8":{"start":{"line":15,"column":0},"end":{"line":15,"column":31}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":19},"end":{"line":3,"column":20}},"loc":{"start":{"line":3,"column":28},"end":{"line":13,"column":1}},"line":3},"1":{"name":"(anonymous_1)","decl":{"start":{"line":6,"column":2},"end":{"line":6,"column":3}},"loc":{"start":{"line":6,"column":22},"end":{"line":10,"column":3}},"line":6}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":3},"end":{"line":8,"column":81}},"type":"if","locations":[{"start":{"line":8,"column":3},"end":{"line":8,"column":81}},{"start":{"line":8,"column":3},"end":{"line":8,"column":81}}],"line":8}},"s":{"0":1,"1":1,"2":5,"3":1,"4":1,"5":0,"6":1,"7":5,"8":1},"f":{"0":5,"1":1},"b":{"0":[0,1]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"379fa192f1cc03574715685d6e3aaa9db9006901"} +,"/home/denis/Zazmic_Internship/hw5/tests/helpers.js": {"path":"/home/denis/Zazmic_Internship/hw5/tests/helpers.js","statementMap":{"0":{"start":{"line":2,"column":14},"end":{"line":2,"column":30}},"1":{"start":{"line":3,"column":18},"end":{"line":3,"column":38}},"2":{"start":{"line":4,"column":12},"end":{"line":4,"column":31}},"3":{"start":{"line":5,"column":28},"end":{"line":5,"column":63}},"4":{"start":{"line":6,"column":16},"end":{"line":6,"column":30}},"5":{"start":{"line":8,"column":0},"end":{"line":27,"column":1}},"6":{"start":{"line":10,"column":20},"end":{"line":10,"column":42}},"7":{"start":{"line":11,"column":19},"end":{"line":11,"column":40}},"8":{"start":{"line":12,"column":16},"end":{"line":12,"column":38}},"9":{"start":{"line":13,"column":19},"end":{"line":13,"column":44}},"10":{"start":{"line":14,"column":23},"end":{"line":14,"column":84}},"11":{"start":{"line":16,"column":2},"end":{"line":16,"column":91}},"12":{"start":{"line":17,"column":25},"end":{"line":17,"column":54}},"13":{"start":{"line":18,"column":16},"end":{"line":18,"column":48}},"14":{"start":{"line":19,"column":19},"end":{"line":19,"column":84}},"15":{"start":{"line":21,"column":2},"end":{"line":21,"column":26}},"16":{"start":{"line":22,"column":15},"end":{"line":22,"column":33}},"17":{"start":{"line":23,"column":2},"end":{"line":23,"column":72}},"18":{"start":{"line":25,"column":2},"end":{"line":25,"column":13}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":9,"column":15},"end":{"line":9,"column":16}},"loc":{"start":{"line":9,"column":27},"end":{"line":26,"column":2}},"line":9}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1},"f":{"0":1},"b":{},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"1454659821cf0611c68224bf96b942fb5d06c79b"} +} diff --git a/coverage/lcov-report/base.css b/coverage/lcov-report/base.css new file mode 100644 index 0000000..f418035 --- /dev/null +++ b/coverage/lcov-report/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/coverage/lcov-report/block-navigation.js b/coverage/lcov-report/block-navigation.js new file mode 100644 index 0000000..c7ff5a5 --- /dev/null +++ b/coverage/lcov-report/block-navigation.js @@ -0,0 +1,79 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selecter that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/coverage/lcov-report/hw5/db/constant.js.html b/coverage/lcov-report/hw5/db/constant.js.html new file mode 100644 index 0000000..10c80f9 --- /dev/null +++ b/coverage/lcov-report/hw5/db/constant.js.html @@ -0,0 +1,84 @@ + + + + Code coverage report for hw5/db/constant.js + + + + + + + +
+
+

+ All files / hw5/db constant.js +

+
+
+ 100% + Statements + 1/1 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 0/0 +
+
+ 100% + Lines + 1/1 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +61x +  +  +  +  + 
module.exports = {
+	paymentTemplate: 'd-66a2ce523e89461eb90b499d7cffe10a',
+	accountVerificationTemplate: 'd-e4b6aa6a05744c0689953f70995abf11',
+	proAccountTemplate: 'd-d39047ffe8324992ad23c3b539f7b43d'
+}
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/db/dbConnection.js.html b/coverage/lcov-report/hw5/db/dbConnection.js.html new file mode 100644 index 0000000..db8ff7f --- /dev/null +++ b/coverage/lcov-report/hw5/db/dbConnection.js.html @@ -0,0 +1,108 @@ + + + + Code coverage report for hw5/db/dbConnection.js + + + + + + + +
+
+

+ All files / hw5/db dbConnection.js +

+
+
+ 100% + Statements + 2/2 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 0/0 +
+
+ 100% + Lines + 2/2 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +141x +  +1x +  +  +  +  +  +  +  +  +  +  + 
const Sequelize = require('sequelize')
+ 
+module.exports = new Sequelize(process.env.DATABASE_URL, {
+	dialect: 'mysql',
+	logging: console.log,
+	benchmark: true,
+	pool: {
+		max: 5,
+		min: 0,
+		acquire: 30000,
+		idle: 10000
+	}
+})
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/db/index.html b/coverage/lcov-report/hw5/db/index.html new file mode 100644 index 0000000..4c6991b --- /dev/null +++ b/coverage/lcov-report/hw5/db/index.html @@ -0,0 +1,110 @@ + + + + Code coverage report for hw5/db + + + + + + + +
+
+

+ All files hw5/db +

+
+
+ 100% + Statements + 3/3 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 0/0 +
+
+ 100% + Lines + 3/3 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
constant.js
100%1/1100%0/0100%0/0100%1/1
dbConnection.js
100%2/2100%0/0100%0/0100%2/2
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/db/models/Articles.js.html b/coverage/lcov-report/hw5/db/models/Articles.js.html new file mode 100644 index 0000000..bcc6eab --- /dev/null +++ b/coverage/lcov-report/hw5/db/models/Articles.js.html @@ -0,0 +1,252 @@ + + + + Code coverage report for hw5/db/models/Articles.js + + + + + + + +
+
+

+ All files / hw5/db/models Articles.js +

+
+
+ 100% + Statements + 7/7 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 1/1 +
+
+ 100% + Lines + 7/7 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +621x +1x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +1x + 
const { Model, DataTypes } = require('sequelize')
+const sequelize = require('../dbConnection')
+ 
+class Articles extends Model {}
+ 
+Articles.init(
+	{
+		id: {
+			type: DataTypes.INTEGER,
+			unique: true,
+			allowNull: false,
+			primaryKey: true,
+			autoIncrement: true
+		},
+		title: {
+			type: DataTypes.STRING,
+			allowNull: false
+		},
+		content: {
+			type: DataTypes.STRING,
+			allowNull: false
+		},
+		picture: {
+			type: DataTypes.STRING,
+			allowNull: true
+		},
+		createdAt: {
+			type: DataTypes.DATE,
+			defaultValue: DataTypes.NOW,
+			allowNull: false,
+			field: 'created_at'
+		},
+		updatedAt: {
+			type: DataTypes.DATE,
+			defaultValue: DataTypes.NOW,
+			allowNull: false,
+			field: 'updated_at'
+		},
+		publishedAt: {
+			type: DataTypes.DATE,
+			defaultValue: DataTypes.NOW,
+			allowNull: false,
+			field: 'published_at'
+		},
+		authorId: {
+			type: DataTypes.INTEGER,
+			field: 'author_id'
+		}
+	},
+	{
+		sequelize,
+		modelName: 'articles'
+	}
+)
+ 
+Articles.associate = models => {
+	Articles.belongsTo(models.Users, { as: 'author', foreignKey: 'authorId' })
+	Articles.hasMany(models.Comments, { as: 'comments', foreignKey: 'articleId' })
+}
+ 
+module.exports = Articles
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/db/models/Comments.js.html b/coverage/lcov-report/hw5/db/models/Comments.js.html new file mode 100644 index 0000000..c0ef547 --- /dev/null +++ b/coverage/lcov-report/hw5/db/models/Comments.js.html @@ -0,0 +1,210 @@ + + + + Code coverage report for hw5/db/models/Comments.js + + + + + + + +
+
+

+ All files / hw5/db/models Comments.js +

+
+
+ 100% + Statements + 7/7 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 1/1 +
+
+ 100% + Lines + 7/7 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +481x +1x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +1x + 
const { Model, DataTypes } = require('sequelize')
+const sequelize = require('../dbConnection')
+ 
+class Comments extends Model {}
+ 
+Comments.init(
+	{
+		id: {
+			type: DataTypes.INTEGER,
+			unique: true,
+			allowNull: false,
+			primaryKey: true,
+			autoIncrement: true
+		},
+		content: {
+			type: DataTypes.STRING,
+			allowNull: false
+		},
+		authorId: {
+			type: DataTypes.INTEGER,
+			field: 'author_id'
+		},
+		articleId: {
+			type: DataTypes.INTEGER,
+			allowNull: false,
+			field: 'article_id'
+		},
+		createdAt: {
+			type: DataTypes.DATE,
+			defaultValue: DataTypes.NOW,
+			allowNull: false,
+			field: 'created_at'
+		}
+	},
+	{
+		sequelize,
+		timestamps: false,
+		modelName: 'comments'
+	}
+)
+ 
+Comments.associate = models => {
+	Comments.belongsTo(models.Users, { as: 'author', foreignKey: 'authorId' })
+	Comments.belongsTo(models.Articles, { as: 'article', foreignKey: 'articleId' })
+}
+ 
+module.exports = Comments
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/db/models/Providers.js.html b/coverage/lcov-report/hw5/db/models/Providers.js.html new file mode 100644 index 0000000..c1fc816 --- /dev/null +++ b/coverage/lcov-report/hw5/db/models/Providers.js.html @@ -0,0 +1,201 @@ + + + + Code coverage report for hw5/db/models/Providers.js + + + + + + + +
+
+

+ All files / hw5/db/models Providers.js +

+
+
+ 100% + Statements + 6/6 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 1/1 +
+
+ 100% + Lines + 6/6 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +451x +1x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +1x + 
const { Model, DataTypes } = require('sequelize')
+const sequelize = require('../dbConnection')
+ 
+class Providers extends Model {}
+ 
+Providers.init(
+	{
+		id: {
+			type: DataTypes.INTEGER,
+			unique: true,
+			allowNull: false,
+			primaryKey: true,
+			autoIncrement: true
+		},
+		userId: {
+			type: DataTypes.INTEGER,
+			allowNull: false,
+			field: 'user_id'
+		},
+		provider: {
+			type: DataTypes.STRING,
+			allowNull: false
+		},
+		providerUserId: {
+			type: DataTypes.INTEGER,
+			allowNull: false,
+			field: 'provider_user_id'
+		}
+	},
+	{
+		sequelize,
+		timestamps: false,
+		modelName: 'oauth_accounts'
+	}
+)
+ 
+Providers.associate = models => {
+	Providers.belongsTo(models.Users, {
+		as: 'user',
+		foreignKey: 'userId'
+	})
+}
+ 
+module.exports = Providers
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/db/models/Users.js.html b/coverage/lcov-report/hw5/db/models/Users.js.html new file mode 100644 index 0000000..a0c0029 --- /dev/null +++ b/coverage/lcov-report/hw5/db/models/Users.js.html @@ -0,0 +1,354 @@ + + + + Code coverage report for hw5/db/models/Users.js + + + + + + + +
+
+

+ All files / hw5/db/models Users.js +

+
+
+ 100% + Statements + 9/9 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 1/1 +
+
+ 100% + Lines + 9/9 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +961x +1x +1x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +  +  +1x + 
const { Model, DataTypes } = require('sequelize')
+const sequelize = require('../dbConnection')
+const { hashPassword } = require('../../services/hashPsw')
+ 
+class Users extends Model {}
+ 
+Users.init(
+	{
+		id: {
+			type: DataTypes.INTEGER,
+			unique: true,
+			allowNull: false,
+			primaryKey: true,
+			autoIncrement: true
+		},
+		firstName: {
+			type: DataTypes.STRING,
+			allowNull: false,
+			field: 'first_name'
+		},
+		lastName: {
+			type: DataTypes.STRING,
+			allowNull: false,
+			field: 'last_name'
+		},
+		email: {
+			type: DataTypes.STRING,
+			allowNull: false,
+			field: 'email'
+		},
+		password: {
+			type: DataTypes.STRING,
+			allowNull: false,
+			field: 'password'
+		},
+		picture: {
+			type: DataTypes.STRING
+		},
+		createdAt: {
+			type: DataTypes.DATE,
+			defaultValue: DataTypes.NOW,
+			allowNull: false,
+			field: 'created_at'
+		},
+		updatedAt: {
+			type: DataTypes.DATE,
+			defaultValue: DataTypes.NOW,
+			allowNull: false,
+			field: 'updated_at'
+		},
+		isVerified: {
+			type: DataTypes.BOOLEAN,
+			defaultValue: 0,
+			allowNull: false,
+			field: 'is_verified'
+		},
+		is_pro: {
+			type: DataTypes.BOOLEAN,
+			defaultValue: 0,
+			allowNull: false,
+			field: 'is_pro'
+		},
+		stripe_customer_id: {
+			type: DataTypes.BOOLEAN,
+			defaultValue: null,
+			allowNull: true,
+			field: 'stripe_customer_id'
+		},
+		stripe_card_id: {
+			type: DataTypes.BOOLEAN,
+			defaultValue: null,
+			allowNull: true,
+			field: 'stripe_card_id'
+		}
+	},
+	{
+		sequelize,
+		modelName: 'users',
+		defaultScope: {
+			attributes: { exclude: ['password'] }
+		},
+		hooks: {
+			beforeCreate: hashPassword,
+			beforeUpdate: hashPassword
+		}
+	}
+)
+ 
+Users.associate = models => {
+	Users.hasMany(models.Articles, { as: 'articles', foreignKey: 'authorId' })
+	Users.hasMany(models.Providers, { as: 'oauth_accounts', foreignKey: 'userId' })
+	Users.hasMany(models.Comments, { as: 'comments', foreignKey: 'authorId' })
+}
+ 
+module.exports = Users
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/db/models/index.html b/coverage/lcov-report/hw5/db/models/index.html new file mode 100644 index 0000000..f14f913 --- /dev/null +++ b/coverage/lcov-report/hw5/db/models/index.html @@ -0,0 +1,149 @@ + + + + Code coverage report for hw5/db/models + + + + + + + +
+
+

+ All files hw5/db/models +

+
+
+ 100% + Statements + 35/35 +
+
+ 50% + Branches + 1/2 +
+
+ 100% + Functions + 5/5 +
+
+ 100% + Lines + 35/35 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
Articles.js
100%7/7100%0/0100%1/1100%7/7
Comments.js
100%7/7100%0/0100%1/1100%7/7
Providers.js
100%6/6100%0/0100%1/1100%6/6
Users.js
100%9/9100%0/0100%1/1100%9/9
index.js
100%6/650%1/2100%1/1100%6/6
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/db/models/index.js.html b/coverage/lcov-report/hw5/db/models/index.js.html new file mode 100644 index 0000000..71874ac --- /dev/null +++ b/coverage/lcov-report/hw5/db/models/index.js.html @@ -0,0 +1,117 @@ + + + + Code coverage report for hw5/db/models/index.js + + + + + + + +
+
+

+ All files / hw5/db/models index.js +

+
+
+ 100% + Statements + 6/6 +
+
+ 50% + Branches + 1/2 +
+
+ 100% + Functions + 1/1 +
+
+ 100% + Lines + 6/6 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +171x +  +  +  +  +  +  +1x +  +1x +4x +4x +  +  +  +1x + 
const models = {
+	Users: require('./Users'),
+	Articles: require('./Articles'),
+	Providers: require('./Providers'),
+	Comments: require('./Comments')
+}
+ 
+const modelNames = Object.keys(models)
+ 
+modelNames.forEach(modelName => {
+	Eif (models[modelName].associate) {
+		models[modelName].associate(models)
+	}
+})
+ 
+module.exports = models
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/index.html b/coverage/lcov-report/hw5/index.html new file mode 100644 index 0000000..1d6bbda --- /dev/null +++ b/coverage/lcov-report/hw5/index.html @@ -0,0 +1,97 @@ + + + + Code coverage report for hw5 + + + + + + + +
+
+

+ All files hw5 +

+
+
+ 84.09% + Statements + 37/44 +
+
+ 25% + Branches + 1/4 +
+
+ 40% + Functions + 2/5 +
+
+ 86.05% + Lines + 37/43 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
index.js
84.09%37/4425%1/440%2/586.05%37/43
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/index.js.html b/coverage/lcov-report/hw5/index.js.html new file mode 100644 index 0000000..a061f9e --- /dev/null +++ b/coverage/lcov-report/hw5/index.js.html @@ -0,0 +1,306 @@ + + + + Code coverage report for hw5/index.js + + + + + + + +
+
+

+ All files / hw5 index.js +

+
+
+ 84.09% + Statements + 37/44 +
+
+ 25% + Branches + 1/4 +
+
+ 40% + Functions + 2/5 +
+
+ 86.05% + Lines + 37/43 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +801x +1x +1x +1x +1x +  +  +1x +  +  +1x +1x +  +1x +1x +1x +  +  +1x +  +1x +1x +  +  +1x +1x +  +  +  +  +  +  +  +  +1x +1x +  +1x +  +1x +1x +1x +1x +1x +  +  +1x +  +  +1x +1x +  +  +1x +  +  +  +  +1x +  +  +  +  +1x +  +1x +1x +  +  +1x +  +1x +1x +1x +  +  +  +  +1x + 
require('dotenv').config()
+const http = require('http')
+const express = require('express')
+const session = require('express-session')
+const passport = require('passport')
+ 
+// logger
+const { errorLogger } = require('./services/logger')
+ 
+// Databases
+const db = require('./db/dbConnection')
+require('./mongodb/mongoConnection')
+ 
+const connectRedis = require('connect-redis')
+const RSessionStore = connectRedis(session)
+const client = require('./services/redisConnectService')
+ 
+// app
+const app = express()
+ 
+app.use(express.urlencoded({ extended: true, limit: '1mb' }))
+app.use(express.json())
+ 
+// authentication
+const rStore = new RSessionStore({ client, prefix: 'denis:sess:' })
+app.use(
+	session({
+		store: rStore,
+		secret: process.env.SESSION_SECRET,
+		saveUninitialized: false,
+		rolling: false,
+		resave: false
+	})
+)
+app.use(passport.initialize())
+app.use(passport.session())
+ 
+app.set('trust proxy', 1)
+// apply Limiters
+const { limiter, loginLimiter, wsLimiter } = require('./services/rateLimitService')(client)
+app.use('/api/v1/blog', limiter)
+app.use('/api/v1/users', limiter)
+app.use('/api/v1/profile', limiter)
+app.use('/api/v1/login', loginLimiter)
+ 
+// docs
+require('./docs/swagger-config')(app)
+ 
+// routes
+const routes = require('./routes')
+app.use(routes)
+ 
+// error handlers
+app.use((req, res, next) => {
+	const error = new Error('Not found')
+	error.status = 404
+	next(error)
+})
+app.use((error, req, res, next) => {
+	res.status(error.status || 500)
+	res.json({ data: error })
+})
+ 
+const server = http.createServer(app)
+// WS
+const io = require('./services/socketService')(server, rStore, wsLimiter)
+app.set('socketio', io)
+ 
+// Connect to DB and run the server
+db.authenticate()
+	.then(() => {
+		server.listen(process.env.PORT, err => {
+			Iif (err) errorLogger.error(`Some problem with server running`, { metadata: err })
+			console.log('server listening port 8803')
+		})
+	})
+	.catch(err => errorLogger.error(`Some problem with MySQL connection`, { metadata: err }))
+ 
+module.exports = app
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/mongodb/index.html b/coverage/lcov-report/hw5/mongodb/index.html new file mode 100644 index 0000000..b9ab5d5 --- /dev/null +++ b/coverage/lcov-report/hw5/mongodb/index.html @@ -0,0 +1,110 @@ + + + + Code coverage report for hw5/mongodb + + + + + + + +
+
+

+ All files hw5/mongodb +

+
+
+ 36.84% + Statements + 14/38 +
+
+ 100% + Branches + 0/0 +
+
+ 28.57% + Functions + 2/7 +
+
+ 36.84% + Lines + 14/38 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
mongoConnection.js
83.33%5/6100%0/0100%1/183.33%5/6
queries.js
28.13%9/32100%0/016.67%1/628.13%9/32
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/mongodb/models/ArticlesViews.js.html b/coverage/lcov-report/hw5/mongodb/models/ArticlesViews.js.html new file mode 100644 index 0000000..3ef98d7 --- /dev/null +++ b/coverage/lcov-report/hw5/mongodb/models/ArticlesViews.js.html @@ -0,0 +1,192 @@ + + + + Code coverage report for hw5/mongodb/models/ArticlesViews.js + + + + + + + +
+
+

+ All files / hw5/mongodb/models ArticlesViews.js +

+
+
+ 52.38% + Statements + 11/21 +
+
+ 100% + Branches + 0/0 +
+
+ 0% + Functions + 0/7 +
+
+ 55% + Lines + 11/20 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +421x +1x +  +1x +  +1x +  +  +  +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +1x +  +  +1x +  +  +  +1x +  +  +  +1x + 
const mongoose = require('mongoose')
+const { Schema } = mongoose
+ 
+const { mongooseLogger } = require('../../services/logger')
+ 
+const articlesViews = new Schema({
+	articleId: Number,
+	authorId: Number,
+	views: Number,
+	updatedAt: Date,
+	createdAt: Date
+})
+ 
+articlesViews.pre('updateOne', function(next) {
+	this.set({ updatedAt: new Date() })
+	next()
+})
+ 
+articlesViews.pre('save', function(next) {
+	this.set({ createdAt: new Date() })
+	next()
+})
+ 
+// logging changes in mongoDB
+articlesViews.post('find', function(docs) {
+	const ids = docs.map(doc => doc.articleId)
+	mongooseLogger.info(`The articles were requested with ids: ${ids}`)
+})
+ 
+articlesViews.post('findOneAndUpdate', function(doc) {
+	mongooseLogger.info(`An article was updated with id: ${doc.articleId}`)
+})
+articlesViews.post('findOneAndDelete', function(doc) {
+	mongooseLogger.info(`An article was deleted with id: ${doc.articleId}`)
+})
+ 
+articlesViews.post('save', function(doc) {
+	mongooseLogger.info(`An article was created with id: ${doc.articleId}`)
+})
+ 
+module.exports = mongoose.model('articles_view', articlesViews)
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/mongodb/models/index.html b/coverage/lcov-report/hw5/mongodb/models/index.html new file mode 100644 index 0000000..bfcdfe9 --- /dev/null +++ b/coverage/lcov-report/hw5/mongodb/models/index.html @@ -0,0 +1,97 @@ + + + + Code coverage report for hw5/mongodb/models + + + + + + + +
+
+

+ All files hw5/mongodb/models +

+
+
+ 52.38% + Statements + 11/21 +
+
+ 100% + Branches + 0/0 +
+
+ 0% + Functions + 0/7 +
+
+ 55% + Lines + 11/20 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
ArticlesViews.js
52.38%11/21100%0/00%0/755%11/20
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/mongodb/mongoConnection.js.html b/coverage/lcov-report/hw5/mongodb/mongoConnection.js.html new file mode 100644 index 0000000..6bf9c2d --- /dev/null +++ b/coverage/lcov-report/hw5/mongodb/mongoConnection.js.html @@ -0,0 +1,120 @@ + + + + Code coverage report for hw5/mongodb/mongoConnection.js + + + + + + + +
+
+

+ All files / hw5/mongodb mongoConnection.js +

+
+
+ 83.33% + Statements + 5/6 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 1/1 +
+
+ 83.33% + Lines + 5/6 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +181x +  +  +  +1x +1x +  +  +  +  +  +  +  +  +1x +  +1x + 
const mongoose = require('mongoose')
+ 
+class MDatabase {
+	static async connect() {
+		try {
+			return mongoose.connect(process.env.CONNECTION_STR, {
+				useNewUrlParser: true,
+				useUnifiedTopology: true
+			})
+		} catch (e) {
+			throw e
+		}
+	}
+}
+MDatabase.connect()
+ 
+module.exports = MDatabase
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/mongodb/queries.js.html b/coverage/lcov-report/hw5/mongodb/queries.js.html new file mode 100644 index 0000000..d6007cf --- /dev/null +++ b/coverage/lcov-report/hw5/mongodb/queries.js.html @@ -0,0 +1,219 @@ + + + + Code coverage report for hw5/mongodb/queries.js + + + + + + + +
+
+

+ All files / hw5/mongodb queries.js +

+
+
+ 28.13% + Statements + 9/32 +
+
+ 100% + Branches + 0/0 +
+
+ 16.67% + Functions + 1/6 +
+
+ 28.13% + Lines + 9/32 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +511x +1x +  +1x +1x +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +1x + 
const ArticlesViews = require('./models/ArticlesViews')
+const { articlesLogger, errorLogger, mongooseLogger } = require('./../services/logger')
+ 
+ArticlesViews.createCollection()
+	.then(() => mongooseLogger.info(`The collection is ready to use.`))
+	.catch(e => errorLogger.error(`An error on CreateCollection method`, { metadata: e }))
+ 
+const insertView = async data => {
+	try {
+		await ArticlesViews(data).save()
+		mongooseLogger.info(`Added a new article`, { metadata: { articleId: data.articleId } })
+	} catch (error) {
+		errorLogger.error(`An error on MongoDB's transaction`, { metadata: error })
+		throw error
+	}
+}
+ 
+const removeView = async articleId => {
+	try {
+		await ArticlesViews.findOneAndDelete({ articleId: articleId })
+		mongooseLogger.info(`Removed an article`, { metadata: { articleId: articleId } })
+	} catch (error) {
+		errorLogger.error(`An error on MongoDB's transaction`, { metadata: error })
+		throw error
+	}
+}
+ 
+const getView = async articleId => {
+	try {
+		const viewsResult = await ArticlesViews.findOneAndUpdate({ articleId: articleId }, { $inc: { views: 1 } })
+		const views = viewsResult._doc.views + 1
+		mongooseLogger.info(`Updated an article`, { metadata: { articleId: articleId } })
+		articlesLogger.info(`Viewed an article`, { metadata: { articleId: articleId } })
+		return views
+	} catch (error) {
+		errorLogger.error(`An error on MongoDB's transaction`, { metadata: error })
+		throw error
+	}
+}
+ 
+const getViews = async () => {
+	try {
+		return await ArticlesViews.find()
+	} catch (error) {
+		errorLogger.error(`An error on MongoDB's transaction`, { metadata: error })
+		throw error
+	}
+}
+ 
+module.exports = { insertView, removeView, getView, getViews }
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/routes/auth.js.html b/coverage/lcov-report/hw5/routes/auth.js.html new file mode 100644 index 0000000..f7ff2fb --- /dev/null +++ b/coverage/lcov-report/hw5/routes/auth.js.html @@ -0,0 +1,396 @@ + + + + Code coverage report for hw5/routes/auth.js + + + + + + + +
+
+

+ All files / hw5/routes auth.js +

+
+
+ 66.07% + Statements + 37/56 +
+
+ 25% + Branches + 3/12 +
+
+ 45.45% + Functions + 5/11 +
+
+ 67.92% + Lines + 36/53 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110  +  +  +  +  +  +  +1x +1x +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +  +1x +  +  +  +1x +1x +  +  +  +1x +  +  +  +  +  +1x +1x +1x +1x +1x +1x +  +  +  +1x +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
/*
+	POST /api/v1/registration
+	POST /api/v1/registration/verify
+	POST /api/v1/login
+	POST /api/v1/logout
+*/
+ 
+const express = require('express')
+const router = express.Router()
+const asyncHandler = require('express-async-handler')
+const passport = require('passport')
+const jwt = require('jsonwebtoken')
+ 
+const { Users } = require('../db/models/index.js')
+require('../services/passportService')(passport)
+const { logOut, getFormattedUrl } = require('../services/helpers')
+const { userCreationValidation, loginValidation } = require('../services/validationService')
+const { SendgridService } = require('../services/emailService')
+const emailTemplates = require('../db/constant')
+ 
+router.post(
+	'/registration',
+	userCreationValidation,
+	asyncHandler(async (req, res) => {
+		const userData = await Users.findOne({ where: { email: req.body.email } })
+		Iif (userData) {
+			res.status(500)
+			res.send('{ error: "User with this email already exist"}').end()
+		} else {
+			const userItem = {
+				firstName: req.body.firstName,
+				lastName: req.body.lastName,
+				email: req.body.email,
+				password: req.body.password
+			}
+			const newUser = await Users.create(userItem)
+			const createdUser = newUser.get({ plain: true })
+			jwt.sign({ uid: createdUser.id }, 'secretkey', { expiresIn: '1h' }, async (err, token) => {
+				Iif (err) return res.status(403).send({ error: err })
+				const verifyLink = `${getFormattedUrl(req)}/verify?token=${token}`
+				await SendgridService.sendEmail(createdUser.email, 'internship@zazmic.com', emailTemplates.accountVerificationTemplate, {
+					verifyLink: verifyLink,
+					name: createdUser.firstName
+				})
+				res.send({ data: newUser })
+			})
+		}
+	})
+)
+ 
+router.post('/registration/verify', async (req, res) => {
+	try {
+		const { uid } = await jwt.verify(req.body.token, 'secretkey')
+		const userData = await Users.findByPk(uid)
+		await userData.update({ isVerified: true })
+		let user = userData.get({ plain: true })
+		await req.logIn(user, err => {
+			Iif (err) res.status(500).send({ error: err })
+			res.send({ data: user })
+		})
+	} catch (e) {
+		return res.status(403).json({ errors: [{ msg: 'Try to register again' }] })
+	}
+})
+ 
+router.post(
+	'/login',
+	loginValidation,
+	passport.authenticate('local', {
+		failureRedirect: '/login'
+	}),
+	(req, res) => res.send({ data: req.user })
+)
+ 
+router.post('/logout', (req, res) => logOut(req, res))
+ 
+// JWT test
+// FORMAT OF TOKEN
+// Authorization: Bearer <access_token>
+router.post('/jwt/protected-info', verifyToken, (req, res) => {
+	jwt.verify(req.token, 'secretkey', (err, authData) => {
+		err ? res.sendStatus(403) : res.json({ message: 'Info have been got...', authData })
+	})
+})
+ 
+router.post('/jwt/login', (req, res) => {
+	const user = { id: 1, userName: 'David', email: 'david@gmail.com' }
+	req.query = { ...user }
+	jwt.sign({ userName: req.query.userName }, 'secretkey', { expiresIn: '60s' }, (err, token) => {
+		err ? res.sendStatus(403) : res.json({ token })
+	})
+})
+ 
+function verifyToken(req, res, next) {
+	// Get auth header value
+	const bearerHeader = req.headers['authorization']
+	if (typeof bearerHeader !== 'undefined') {
+		// Split at the space and get token from array
+		const bearer = bearerHeader.split(' ')
+		const bearerToken = bearer[1]
+		req.token = bearerToken
+		next()
+	} else {
+		// Forbidden
+		res.sendStatus(403)
+	}
+}
+ 
+module.exports = router
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/routes/blogs.js.html b/coverage/lcov-report/hw5/routes/blogs.js.html new file mode 100644 index 0000000..783dfa1 --- /dev/null +++ b/coverage/lcov-report/hw5/routes/blogs.js.html @@ -0,0 +1,480 @@ + + + + Code coverage report for hw5/routes/blogs.js + + + + + + + +
+
+

+ All files / hw5/routes blogs.js +

+
+
+ 27.03% + Statements + 20/74 +
+
+ 0% + Branches + 0/18 +
+
+ 0% + Functions + 0/8 +
+
+ 28.57% + Lines + 20/70 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
/*
+	GET /api/v1/blog - get all blogs
+	POST /api/v1/blog - add a new blog
+	GET /api/v1/blog/:id - get the blog by id
+	PUT /api/v1/blog/:id - update the blog by id
+	DELETE /api/v1/blog/:id - delete the blog by id
+	GET /blog/:articleId/comments - get all comments
+	POST /blog/:articleId/comments - add a new comment
+	DELETE /blog/:articleId/comments/:id - delete the comments
+*/
+ 
+const express = require('express')
+const router = express.Router()
+const asyncHandler = require('express-async-handler')
+ 
+const { Articles, Users, Comments } = require('../db/models/index.js')
+const { insertView, removeView: removeArticlesView, getView, getViews } = require('../mongodb/queries')
+const { combineArticles2Views } = require('../services/helpers')
+const authCheck = require('../services/middlewares/authCheck')
+const { articlesMulter } = require('../services/multer')
+const { gcArticlesIMGRemover } = require('../services/gcRemovalService')
+const { getArticles, getComments } = require('../services/queryHelperService')
+const { articleValidation, commentValidation } = require('../services/validationService')
+ 
+router.get(
+	'/',
+	asyncHandler(async (req, res) => {
+		const articles = await getArticles(req.query.after, null)
+		const views = await getViews()
+		combineArticles2Views(articles, views)
+		res.send({ data: articles })
+	})
+)
+ 
+router.post(
+	'/',
+	[authCheck, articlesMulter.single('picture'), articleValidation],
+	asyncHandler(async (req, res) => {
+		let newArticle = null
+		req.body.authorId = req.user.id
+		if (req.file) req.body.picture = req.file.path
+		newArticle = await Articles.create({ ...req.body })
+		await insertView({ articleId: newArticle.id, authorId: newArticle.authorId, views: 0 })
+		newArticle.view = 0
+		res.send({ data: newArticle })
+	})
+)
+router.put(
+	'/:id',
+	[authCheck, articlesMulter.single('picture'), articleValidation],
+	asyncHandler(async (req, res) => {
+		const data = await Articles.findByPk(req.params.id, { attributes: ['authorId', 'picture'] })
+		const articleData = data.get({ plain: true })
+		if (articleData.authorId === req.user.id) {
+			let updatedArticle = null
+			if (req.file) req.body.picture = req.file.path
+			if (articleData.picture) await gcArticlesIMGRemover.remove(articleData.picture)
+			updatedArticle = await Articles.update({ ...req.body }, { where: { id: req.params.id } })
+			return updatedArticle > 0 ? res.status(200).send({}) : res.sendStatus(500)
+		} else {
+			res.sendStatus(403)
+		}
+	})
+)
+ 
+router.get(
+	'/:id',
+	asyncHandler(async (req, res) => {
+		const article = await Articles.findByPk(req.params.id, {
+			order: [['createdAt', 'DESC']],
+			include: [{ model: Users, as: 'author' }]
+		})
+		const views = await getView(+req.params.id)
+		article.dataValues.views = views
+		res.send({ data: article })
+	})
+)
+ 
+router.delete(
+	'/:id',
+	asyncHandler(async (req, res) => {
+		const data = await Articles.findByPk(req.params.id, { attributes: ['authorId', 'picture'] })
+		const articleData = data.get({ plain: true })
+		if (articleData.authorId === req.user.id) {
+			const destroyedArticle = await Articles.destroy({ where: { id: req.params.id } })
+			await removeArticlesView(req.params.id)
+			if (articleData.picture) await gcArticlesIMGRemover.remove(articleData.picture)
+			destroyedArticle > 0 ? res.send({ data: articleData }) : res.sendStatus(500)
+		} else {
+			res.sendStatus(403)
+		}
+	})
+)
+ 
+// Comments
+router.get(
+	'/:id/comments',
+	asyncHandler(async (req, res) => {
+		const comments = await getComments(req.params.id, +req.query.after)
+		res.send({ data: comments })
+	})
+)
+ 
+router.post(
+	'/:id/comments',
+	authCheck,
+	commentValidation,
+	asyncHandler(async (req, res) => {
+		req.body.authorId = req.user.id
+		req.body.articleId = +req.params.id
+		const newComment = await Comments.create(req.body)
+		const comment = newComment.get({ plain: true })
+		comment.author = req.user
+		// sockets
+		const io = req.app.get('socketio')
+		io.to(`room-${req.params.id}`).emit('comment', { action: 'create', data: { comment } })
+		res.send({ data: comment })
+	})
+)
+ 
+router.delete(
+	'/:articleId/comments/:id',
+	authCheck,
+	asyncHandler(async (req, res) => {
+		req.body.id = req.params.id
+		const comment = await Comments.findByPk(req.params.id)
+		if (comment) {
+			await comment.destroy()
+			const io = req.app.get('socketio')
+			io.to(`room-${req.params.articleId}`).emit('comment', { action: 'destroy', data: { comment } })
+			return res.sendStatus(200)
+		}
+		res.sendStatus(404)
+	})
+)
+ 
+module.exports = router
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/routes/fees.js.html b/coverage/lcov-report/hw5/routes/fees.js.html new file mode 100644 index 0000000..a65d701 --- /dev/null +++ b/coverage/lcov-report/hw5/routes/fees.js.html @@ -0,0 +1,246 @@ + + + + Code coverage report for hw5/routes/fees.js + + + + + + + +
+
+

+ All files / hw5/routes fees.js +

+
+
+ 44.44% + Statements + 12/27 +
+
+ 0% + Branches + 0/10 +
+
+ 0% + Functions + 0/2 +
+
+ 48% + Lines + 12/25 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60  +  +  +  +  +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
/*
+	GET /api/v1/fees - user fees
+	PUT /api/v1/fees - make a payment to reach a pro-account
+*/
+ 
+const express = require('express')
+const router = express.Router()
+const asyncHandler = require('express-async-handler')
+ 
+const authCheck = require('../services/middlewares/authCheck')
+const { createCharge, getChargesAmount } = require('../services/stripeService')
+const { sgMail } = require('../services/emailService')
+const emailTemplates = require('../db/constant')
+const totalBill = 100 // the sum needs to become a pro
+const cents = 100
+ 
+router.get(
+	'/',
+	authCheck,
+	asyncHandler(async (req, res) => {
+		const user = req.user.get({ plain: true })
+		if (user.is_pro) return res.send({ data: { amount: 0 } })
+		if (!user.stripe_customer_id) return res.send({ data: { amount: 100 } })
+		const total = await getChargesAmount(user.stripe_customer_id)
+		res.send({ data: { amount: totalBill - total } })
+	})
+)
+ 
+router.put(
+	'/',
+	authCheck,
+	asyncHandler(async (req, res) => {
+		const user = req.user.get({ plain: true })
+		const chargeReport = await createCharge(user.stripe_customer_id, user.stripe_card_id, req.body.amount * cents, user.email)
+		const total = await getChargesAmount(user.stripe_customer_id)
+		sgMail.send({
+			to: user.email,
+			from: 'internship@zazmic.com',
+			template_id: emailTemplates.paymentTemplate,
+			dynamic_template_data: {
+				chargeReport: chargeReport,
+				sum: req.body.amount,
+				rest: total < totalBill ? totalBill - total : 0
+			}
+		})
+		// if user reach a pro
+		if (!user.is_pro && total >= totalBill) {
+			await req.user.update({ is_pro: true })
+			sgMail.send({
+				to: user.email,
+				from: 'internship@zazmic.com',
+				template_id: emailTemplates.proAccountTemplate
+			})
+		}
+		res.send({ data: { amount: totalBill - total, user: user } })
+	})
+)
+ 
+module.exports = router
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/routes/index.html b/coverage/lcov-report/hw5/routes/index.html new file mode 100644 index 0000000..4ca77d6 --- /dev/null +++ b/coverage/lcov-report/hw5/routes/index.html @@ -0,0 +1,175 @@ + + + + Code coverage report for hw5/routes + + + + + + + +
+
+

+ All files hw5/routes +

+
+
+ 49% + Statements + 122/249 +
+
+ 6% + Branches + 3/50 +
+
+ 14.71% + Functions + 5/34 +
+
+ 51.71% + Lines + 121/234 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
auth.js
66.07%37/5625%3/1245.45%5/1167.92%36/53
blogs.js
27.03%20/740%0/180%0/828.57%20/70
fees.js
44.44%12/270%0/100%0/248%12/25
index.js
80.95%17/21100%0/00%0/285%17/20
oauth.js
80%8/10100%0/00%0/280%8/10
profile.js
45.45%15/330%0/80%0/451.72%15/29
users.js
46.43%13/280%0/20%0/548.15%13/27
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/routes/index.js.html b/coverage/lcov-report/hw5/routes/index.js.html new file mode 100644 index 0000000..ab1dc84 --- /dev/null +++ b/coverage/lcov-report/hw5/routes/index.js.html @@ -0,0 +1,147 @@ + + + + Code coverage report for hw5/routes/index.js + + + + + + + +
+
+

+ All files / hw5/routes index.js +

+
+
+ 80.95% + Statements + 17/21 +
+
+ 100% + Branches + 0/0 +
+
+ 0% + Functions + 0/2 +
+
+ 85% + Lines + 17/20 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +271x +1x +  +1x +1x +1x +1x +1x +1x +  +1x +  +1x +1x +1x +1x +1x +1x +  +1x +  +  +  +  +  +1x + 
const https = require('https')
+const router = require('express').Router()
+ 
+const auth = require('./auth')
+const oauth = require('./oauth')
+const blog = require('./blogs')
+const user = require('./users')
+const profile = require('./profile')
+const fees = require('./fees')
+ 
+const { mongooseLogger } = require('../services/logger')
+ 
+router.use('/api/v1/oauth', oauth)
+router.use('/api/v1', auth)
+router.use('/api/v1/profile', profile)
+router.use('/api/v1/users', user)
+router.use('/api/v1/blog', blog)
+router.use('/api/v1/fees', fees)
+ 
+router.get('*', (req, res) => {
+	https.get(process.env.FRONTEND_URL, response => response.pipe(res))
+	const date = new Date()
+	mongooseLogger.info(`App: incoming ${req.method} request at ${date}`)
+})
+ 
+module.exports = router
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/routes/oauth.js.html b/coverage/lcov-report/hw5/routes/oauth.js.html new file mode 100644 index 0000000..4513b0d --- /dev/null +++ b/coverage/lcov-report/hw5/routes/oauth.js.html @@ -0,0 +1,138 @@ + + + + Code coverage report for hw5/routes/oauth.js + + + + + + + +
+
+

+ All files / hw5/routes oauth.js +

+
+
+ 80% + Statements + 8/10 +
+
+ 100% + Branches + 0/0 +
+
+ 0% + Functions + 0/2 +
+
+ 80% + Lines + 8/10 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24  +  +  +  +  +  +1x +1x +1x +  +1x +  +1x +  +1x +  +  +  +1x +  +  +  +1x + 
/*
+	GET /api/v1/oauth/google
+	POST /api/v1/oauth/google/callback
+	GET /api/v1/oauth/facebook
+	POST /api/v1/oauth/facebook/callback
+*/
+const express = require('express')
+const router = express.Router()
+const passport = require('passport')
+ 
+router.get('/google', passport.authenticate('google', { scope: ['profile', 'email'] }))
+ 
+router.get('/facebook', passport.authenticate('facebook', { scope: ['email'] }))
+ 
+router.post('/google/callback', passport.authenticate('google'), (req, res) => {
+	res.send({ data: req.user })
+})
+ 
+router.post('/facebook/callback', passport.authenticate('facebook'), (req, res) => {
+	res.send({ data: req.user })
+})
+ 
+module.exports = router
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/routes/profile.js.html b/coverage/lcov-report/hw5/routes/profile.js.html new file mode 100644 index 0000000..4987dab --- /dev/null +++ b/coverage/lcov-report/hw5/routes/profile.js.html @@ -0,0 +1,258 @@ + + + + Code coverage report for hw5/routes/profile.js + + + + + + + +
+
+

+ All files / hw5/routes profile.js +

+
+
+ 45.45% + Statements + 15/33 +
+
+ 0% + Branches + 0/8 +
+
+ 0% + Functions + 0/4 +
+
+ 51.72% + Lines + 15/29 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64  +  +  +  +  +  +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x + 
/*
+	PUT /api/v1/profile - update user
+	DELETE /api/v1/profile - delete user
+	PUT /api/v1/picture - update or add users picture
+*/
+ 
+const express = require('express')
+const router = express.Router()
+const asyncHandler = require('express-async-handler')
+ 
+const { Users, Articles } = require('../db/models/index.js')
+const authCheck = require('../services/middlewares/authCheck')
+const { logOut } = require('../services/helpers')
+const { avatarMulter } = require('../services/multer')
+const { gcUserIMGRemover } = require('../services/gcRemovalService')
+const { editUserValidation } = require('../services/validationService')
+const { createCustomer } = require('../services/stripeService')
+ 
+router.put(
+	'/',
+	authCheck,
+	editUserValidation,
+	asyncHandler(async (req, res) => {
+		await req.user.update({ firstName: req.body.firstName, lastName: req.body.lastName })
+		res.send({ data: req.user })
+	})
+)
+ 
+router.delete(
+	'/',
+	authCheck,
+	asyncHandler(async (req, res) => {
+		const imgs = await Articles.findAll({ where: { authorId: req.user.id }, raw: true, attributes: ['picture'] })
+		if (req.user.picture) imgs.push({ picture: req.user.picture })
+		if (imgs.length) await gcUserIMGRemover.remove(imgs)
+		const destroyedUser = await Users.destroy({ where: { id: req.user.id } })
+		if (destroyedUser > 0) return logOut(req, res)
+		res.sendStatus(500)
+	})
+)
+ 
+router.put(
+	'/picture',
+	authCheck,
+	avatarMulter.single('picture'),
+	asyncHandler(async (req, res) => {
+		if (!req.file) return res.status(400).send('No file uploaded.')
+		await req.user.update({ picture: req.file.path })
+		res.send({ data: { picture: req.file.path } })
+	})
+)
+ 
+router.put(
+	'/card',
+	authCheck,
+	asyncHandler(async (req, res) => {
+		const user = req.user.get({ plain: true })
+		const updatedData = await createCustomer(req.body.token, user)
+		res.send({ data: { ...user, ...updatedData } })
+	})
+)
+ 
+module.exports = router
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/routes/users.js.html b/coverage/lcov-report/hw5/routes/users.js.html new file mode 100644 index 0000000..35f7c88 --- /dev/null +++ b/coverage/lcov-report/hw5/routes/users.js.html @@ -0,0 +1,279 @@ + + + + Code coverage report for hw5/routes/users.js + + + + + + + +
+
+

+ All files / hw5/routes users.js +

+
+
+ 46.43% + Statements + 13/28 +
+
+ 0% + Branches + 0/2 +
+
+ 0% + Functions + 0/5 +
+
+ 48.15% + Lines + 13/27 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71  +  +  +  +  +  +  +  +1x +1x +1x +  +1x +1x +  +1x +1x +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x + 
/*
+	GET /api/v1/users - get all users
+	POST /api/v1/users - add a new user
+	GET /api/v1/users/:id - get the user by id
+	PUT /api/v1/users/:id - update the user by id
+	DELETE /api/v1/users/:id - delete the user by id
+*/
+ 
+const express = require('express')
+const router = express.Router()
+const asyncHandler = require('express-async-handler')
+ 
+const { Users } = require('../db/models/index.js')
+const db = require('../db/dbConnection')
+ 
+const { getViews } = require('../mongodb/queries')
+const { combineArticles2Views } = require('../services/helpers')
+const authCheck = require('../services/middlewares/authCheck')
+const { getArticles } = require('../services/queryHelperService')
+ 
+router.get(
+	'/',
+	authCheck,
+	asyncHandler(async (req, res) => {
+		const users = await db.query(
+			`
+			SELECT
+				users.id,
+				users.email,
+				users.first_name AS firstName,
+				users.last_name AS lastName,
+				users.last_name AS lastName,
+				users.is_pro,
+				COUNT(articles.id) AS articlesCount
+			FROM users 
+			LEFT JOIN articles ON articles.author_id = users.id 
+			GROUP BY users.id`,
+			{ type: db.QueryTypes.SELECT }
+		)
+		const views = await getViews()
+		users.forEach(item => {
+			let viewsCount = 0
+			views.forEach(view => {
+				if (item.id === view.authorId) viewsCount += view.views
+			})
+			item.viewsCount = viewsCount
+		})
+		res.send({ data: users })
+	})
+)
+ 
+router.get(
+	'/:id',
+	asyncHandler(async (req, res) => {
+		const user = await Users.findByPk(req.params.id)
+		res.send({ data: user })
+	})
+)
+ 
+router.get(
+	'/:id/blog',
+	asyncHandler(async (req, res) => {
+		const articles = await getArticles(req.query.after, req.params.id)
+		const views = await getViews(req.params.id)
+		combineArticles2Views(articles, views)
+		res.send({ data: articles })
+	})
+)
+ 
+module.exports = router
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/services/AuthService.js.html b/coverage/lcov-report/hw5/services/AuthService.js.html new file mode 100644 index 0000000..9beabb6 --- /dev/null +++ b/coverage/lcov-report/hw5/services/AuthService.js.html @@ -0,0 +1,171 @@ + + + + Code coverage report for hw5/services/AuthService.js + + + + + + + +
+
+

+ All files / hw5/services AuthService.js +

+
+
+ 15.79% + Statements + 3/19 +
+
+ 0% + Branches + 0/4 +
+
+ 0% + Functions + 0/3 +
+
+ 16.67% + Lines + 3/18 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +351x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
const { errorLogger } = require('./logger')
+const { Users, Providers } = require('../db/models/index.js')
+ 
+class AuthService {
+	static async findOrCreateOauthProvider({ provider, email, firstName, lastName, providerUserId }) {
+		try {
+			const userData = await Users.findOne({ where: { email } })
+			if (userData) {
+				await userData.update({ isVerified: true })
+				const user = userData.get({ plain: true })
+				const hasAccount = await Providers.findOne({ where: { providerUserId } })
+				if (!hasAccount) await this.createOauthAccount(user.id, provider, providerUserId)
+				return user
+			} else {
+				const newUser = await this.createUser(firstName, lastName, email)
+				await newUser.update({ isVerified: true })
+				await this.createOauthAccount(newUser.dataValues.id, provider, providerUserId)
+				return newUser.get({ plain: true })
+			}
+		} catch (err) {
+			errorLogger.error(`An error on MySQL request`, { metadata: err })
+		}
+	}
+ 
+	static async createOauthAccount(userId, provider, providerUserId) {
+		await Providers.create({ userId, provider, providerUserId })
+	}
+ 
+	static async createUser(firstName, lastName, email) {
+		return await Users.create({ firstName, lastName, email, password: '123qwe' })
+	}
+}
+ 
+module.exports = { AuthService }
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/services/emailService.js.html b/coverage/lcov-report/hw5/services/emailService.js.html new file mode 100644 index 0000000..606a53c --- /dev/null +++ b/coverage/lcov-report/hw5/services/emailService.js.html @@ -0,0 +1,114 @@ + + + + Code coverage report for hw5/services/emailService.js + + + + + + + +
+
+

+ All files / hw5/services emailService.js +

+
+
+ 75% + Statements + 3/4 +
+
+ 0% + Branches + 0/2 +
+
+ 0% + Functions + 0/1 +
+
+ 75% + Lines + 3/4 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +161x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
const sgMail = require('@sendgrid/mail')
+sgMail.setApiKey(process.env.SENDGRID_API_KEY)
+ 
+class SendgridService {
+	static async sendEmail(to, from, templateId = '', dynamicData = {}) {
+		await sgMail.send({
+			to,
+			from,
+			template_id: templateId,
+			dynamic_template_data: dynamicData
+		})
+	}
+}
+ 
+module.exports = { sgMail, SendgridService }
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/services/gcRemovalService.js.html b/coverage/lcov-report/hw5/services/gcRemovalService.js.html new file mode 100644 index 0000000..621ff9c --- /dev/null +++ b/coverage/lcov-report/hw5/services/gcRemovalService.js.html @@ -0,0 +1,153 @@ + + + + Code coverage report for hw5/services/gcRemovalService.js + + + + + + + +
+
+

+ All files / hw5/services gcRemovalService.js +

+
+
+ 46.67% + Statements + 7/15 +
+
+ 0% + Branches + 0/2 +
+
+ 16.67% + Functions + 1/6 +
+
+ 53.85% + Lines + 7/13 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +291x +1x +  +  +  +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +1x + 
const { avatarStorage, articlesStorage } = require('./gcStorageService')
+const { errorLogger } = require('./logger')
+ 
+class GCRemoverTool {
+	constructor(storage, bucket) {
+		this.gcStorage = storage
+		this.gcsBucket = bucket
+	}
+	remove(data) {
+		Array.isArray(data) ? this.removeMany(data) : this.removeOne(data)
+	}
+ 
+	async removeMany(urls) {
+		await Promise.all(urls.map(url => this.removeOne(url.picture)))
+	}
+ 
+	async removeOne(url) {
+		const filePath = new URL(url).pathname
+		const fileName = filePath.replace(new RegExp(`${this.gcsBucket.name}/`, 'g'), '')
+		const gcFile = this.gcsBucket.file(fileName.slice(1))
+		await gcFile.delete().catch(e => errorLogger.error(`Some problem with pictures removing`, { metadata: e }))
+	}
+}
+ 
+const gcUserIMGRemover = new GCRemoverTool(avatarStorage.gcStorage, avatarStorage.gcsBucket)
+const gcArticlesIMGRemover = new GCRemoverTool(articlesStorage.gcStorage, articlesStorage.gcsBucket)
+ 
+module.exports = { gcUserIMGRemover, gcArticlesIMGRemover }
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/services/gcStorageService.js.html b/coverage/lcov-report/hw5/services/gcStorageService.js.html new file mode 100644 index 0000000..e38db46 --- /dev/null +++ b/coverage/lcov-report/hw5/services/gcStorageService.js.html @@ -0,0 +1,282 @@ + + + + Code coverage report for hw5/services/gcStorageService.js + + + + + + + +
+
+

+ All files / hw5/services gcStorageService.js +

+
+
+ 41.18% + Statements + 14/34 +
+
+ 42.86% + Branches + 6/14 +
+
+ 11.11% + Functions + 1/9 +
+
+ 46.67% + Lines + 14/30 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +721x +1x +1x +1x +  +  +  +2x +2x +2x +2x +2x +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x + 
const { Storage } = require('@google-cloud/storage')
+const path = require('path')
+const sharp = require('sharp')
+const { errorLogger } = require('./logger')
+ 
+class GCStorage {
+	constructor(opts) {
+		Iif (!opts.bucket) throw new Error('You have to specify bucket for GCStorage.')
+		Iif (!opts.keyFilename) throw new Error('You have to specify credentials key file for GCStorage.')
+		this.getDestination = opts.destination || this.getDestination
+		this.getFilename = opts.filename || this.getFilename
+		this.gcStorage = new Storage({ keyFilename: opts.keyFilename })
+		this.gcsBucket = this.gcStorage.bucket(opts.bucket)
+		this.options = opts
+	}
+ 
+	getDestination(req, file, cb) {
+		cb(null, `${this.options.prefix}/${this.options.size.width}x${this.options.size.height}/`)
+	}
+ 
+	getFilename(req, file, cb) {
+		const prefix = Date.now()
+		cb(null, `${prefix}-${file.originalname}`)
+	}
+ 
+	_handleFile(req, file, cb) {
+		this.getDestination(req, file, (err, destination) => {
+			if (err) return cb(err)
+			this.getFilename(req, file, async (err, filename) => {
+				if (err) return cb(err)
+				const finalPath = path.join(destination, filename)
+				let gcFile = this.gcsBucket.file(finalPath)
+				const streamOpts = { predefinedAcl: this.options.acl || 'publicread' }
+				const sharpResizer = sharp().resize(this.options.size.width, this.options.size.height)
+				file.stream
+					.pipe(sharpResizer)
+					.pipe(gcFile.createWriteStream(streamOpts))
+					.on('error', err => {
+						errorLogger.error(`Error while file uploading`, { metadata: err })
+						cb(err)
+					})
+					.on('finish', () => {
+						cb(null, {
+							path: `https://storage.googleapis.com/${this.options.bucket}/${finalPath}`,
+							filename: filename
+						})
+					})
+			})
+		})
+	}
+ 
+	_removeFile(req, file, cb) {
+		this.gcsBucket.file(file.filename).delete()
+	}
+}
+ 
+const avatarStorage = new GCStorage({
+	prefix: `denis/avatars`,
+	bucket: process.env.BUCKET_NAME,
+	keyFilename: path.join(__dirname, '../service-key.json'),
+	size: { width: 180, height: 180 }
+})
+ 
+const articlesStorage = new GCStorage({
+	prefix: `denis/articles`,
+	bucket: process.env.BUCKET_NAME,
+	keyFilename: path.join(__dirname, '../service-key.json'),
+	size: { width: 1200, height: 630 }
+})
+ 
+module.exports = { avatarStorage, articlesStorage }
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/services/hashPsw.js.html b/coverage/lcov-report/hw5/services/hashPsw.js.html new file mode 100644 index 0000000..561e09d --- /dev/null +++ b/coverage/lcov-report/hw5/services/hashPsw.js.html @@ -0,0 +1,120 @@ + + + + Code coverage report for hw5/services/hashPsw.js + + + + + + + +
+
+

+ All files / hw5/services hashPsw.js +

+
+
+ 81.82% + Statements + 9/11 +
+
+ 100% + Branches + 2/2 +
+
+ 50% + Functions + 1/2 +
+
+ 90% + Lines + 9/10 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +181x +1x +1x +  +1x +2x +2x +1x +  +  +  +  +  +  +1x +  +1x + 
const bcrypt = require('bcrypt')
+const { errorLogger } = require('./logger')
+const saltRound = 10
+ 
+const hashPassword = async user => {
+	try {
+		if (user.changed('password')) {
+			user.password = await bcrypt.hash(user.password, saltRound)
+		}
+	} catch (err) {
+		errorLogger.error(`Some problem with passwords hashing`, { metadata: err })
+	}
+}
+ 
+const checkPsw = (psw, hash) => bcrypt.compare(psw, hash)
+ 
+module.exports = { hashPassword, checkPsw }
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/services/helpers.js.html b/coverage/lcov-report/hw5/services/helpers.js.html new file mode 100644 index 0000000..d97f507 --- /dev/null +++ b/coverage/lcov-report/hw5/services/helpers.js.html @@ -0,0 +1,126 @@ + + + + Code coverage report for hw5/services/helpers.js + + + + + + + +
+
+

+ All files / hw5/services helpers.js +

+
+
+ 69.23% + Statements + 9/13 +
+
+ 0% + Branches + 0/2 +
+
+ 40% + Functions + 2/5 +
+
+ 72.73% + Lines + 8/11 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +201x +  +1x +  +  +  +  +  +  +  +1x +1x +1x +1x +  +  +1x +  +1x + 
const url = require('url')
+ 
+const combineArticles2Views = (articles, views) => {
+	articles.forEach(item => {
+		views.forEach(view => {
+			if (item.dataValues.id === view.articleId) item.dataValues.views = view.views
+		})
+	})
+}
+ 
+const logOut = (req, res) => {
+	req.logout()
+	req.session.destroy()
+	res.send({})
+}
+ 
+const getFormattedUrl = req => url.format({ protocol: req.protocol, host: req.get('host') })
+ 
+module.exports = { combineArticles2Views, logOut, getFormattedUrl }
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/services/index.html b/coverage/lcov-report/hw5/services/index.html new file mode 100644 index 0000000..9f6f4ef --- /dev/null +++ b/coverage/lcov-report/hw5/services/index.html @@ -0,0 +1,279 @@ + + + + Code coverage report for hw5/services + + + + + + + +
+
+

+ All files hw5/services +

+
+
+ 52.21% + Statements + 130/249 +
+
+ 21.15% + Branches + 11/52 +
+
+ 20% + Functions + 11/55 +
+
+ 56.64% + Lines + 128/226 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
AuthService.js
15.79%3/190%0/40%0/316.67%3/18
emailService.js
75%3/40%0/20%0/175%3/4
gcRemovalService.js
46.67%7/150%0/216.67%1/653.85%7/13
gcStorageService.js
41.18%14/3442.86%6/1411.11%1/946.67%14/30
hashPsw.js
81.82%9/11100%2/250%1/290%9/10
helpers.js
69.23%9/130%0/240%2/572.73%8/11
logger.js
78.57%11/14100%0/00%0/284.62%11/13
multer.js
100%5/5100%0/0100%0/0100%5/5
passportService.js
44.74%17/380%0/450%3/645.71%16/35
queryHelperService.js
35.71%5/140%0/60%0/238.46%5/13
rateLimitService.js
100%8/8100%0/0100%1/1100%8/8
redisConnectService.js
83.33%5/6100%0/00%0/183.33%5/6
socketService.js
38.46%10/260%0/410%1/1043.48%10/23
stripeService.js
41.18%7/170%0/40%0/441.18%7/17
validationService.js
68%17/2537.5%3/833.33%1/385%17/20
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/services/logger.js.html b/coverage/lcov-report/hw5/services/logger.js.html new file mode 100644 index 0000000..b739d86 --- /dev/null +++ b/coverage/lcov-report/hw5/services/logger.js.html @@ -0,0 +1,303 @@ + + + + Code coverage report for hw5/services/logger.js + + + + + + + +
+
+

+ All files / hw5/services logger.js +

+
+
+ 78.57% + Statements + 11/14 +
+
+ 100% + Branches + 0/0 +
+
+ 0% + Functions + 0/2 +
+
+ 84.62% + Lines + 11/13 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +791x +1x +1x +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +1x +1x +  +1x +  +  +  +  + 
const winston = require('winston')
+require('winston-mongodb')
+require('../mongodb/mongoConnection')
+ 
+const { format, transports, createLogger } = winston
+ 
+const mongooseLogger = createLogger({
+	format: format.combine(format.splat(), format.simple()),
+	transports: [
+		new transports.MongoDB({
+			db: process.env.CONNECTION_STR,
+			collection: 'mongoose_logs',
+			decolorize: true,
+			options: {
+				useUnifiedTopology: true,
+				useNewUrlParser: true
+			}
+		}),
+		new transports.Console({
+			json: false,
+			colorize: true
+		})
+	]
+})
+ 
+const errorLogger = createLogger({
+	transports: [
+		new transports.Console({
+			level: 'info',
+			format: format.combine(format.splat(), format.simple()),
+			colorize: true,
+			handleExceptions: true
+		}),
+		new transports.MongoDB({
+			level: 'error',
+			db: process.env.CONNECTION_STR,
+			collection: 'error_logs',
+			options: {
+				useUnifiedTopology: true,
+				useNewUrlParser: true
+			}
+		})
+	]
+})
+ 
+const articlesLogger = createLogger({
+	transports: [
+		new transports.Console({
+			level: 'info',
+			format: format.combine(format.splat(), format.simple()),
+			colorize: true,
+			handleExceptions: true
+		}),
+		new transports.MongoDB({
+			level: 'info',
+			db: process.env.CONNECTION_STR,
+			collection: 'articles_logs',
+			options: {
+				useUnifiedTopology: true,
+				useNewUrlParser: true
+			}
+		})
+	]
+})
+ 
+const exceptionLogger = error => {
+	errorLogger.error('Uncaught exception', { metadata: error })
+	errorLogger.end(() => process.exit(1))
+}
+ 
+process.on('uncaughtException', exceptionLogger)
+process.on('unhandledRejection', exceptionLogger)
+ 
+module.exports = {
+	mongooseLogger,
+	errorLogger,
+	articlesLogger
+}
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/services/middlewares/authCheck.js.html b/coverage/lcov-report/hw5/services/middlewares/authCheck.js.html new file mode 100644 index 0000000..3b266b5 --- /dev/null +++ b/coverage/lcov-report/hw5/services/middlewares/authCheck.js.html @@ -0,0 +1,84 @@ + + + + Code coverage report for hw5/services/middlewares/authCheck.js + + + + + + + +
+
+

+ All files / hw5/services/middlewares authCheck.js +

+
+
+ 25% + Statements + 1/4 +
+
+ 0% + Branches + 0/2 +
+
+ 0% + Functions + 0/1 +
+
+ 33.33% + Lines + 1/3 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6  +1x +  +  +  + 
// route middleware to make sure a user is logged in
+module.exports = (req, res, next) => {
+	if (req.isAuthenticated()) return next()
+	res.status(401).send('You have to be authenticated.')
+}
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/services/middlewares/index.html b/coverage/lcov-report/hw5/services/middlewares/index.html new file mode 100644 index 0000000..1d241bc --- /dev/null +++ b/coverage/lcov-report/hw5/services/middlewares/index.html @@ -0,0 +1,110 @@ + + + + Code coverage report for hw5/services/middlewares + + + + + + + +
+
+

+ All files hw5/services/middlewares +

+
+
+ 69.23% + Statements + 9/13 +
+
+ 25% + Branches + 1/4 +
+
+ 66.67% + Functions + 2/3 +
+
+ 81.82% + Lines + 9/11 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
authCheck.js
25%1/40%0/20%0/133.33%1/3
validation.js
88.89%8/950%1/2100%2/2100%8/8
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/services/middlewares/validation.js.html b/coverage/lcov-report/hw5/services/middlewares/validation.js.html new file mode 100644 index 0000000..f4863d3 --- /dev/null +++ b/coverage/lcov-report/hw5/services/middlewares/validation.js.html @@ -0,0 +1,114 @@ + + + + Code coverage report for hw5/services/middlewares/validation.js + + + + + + + +
+
+

+ All files / hw5/services/middlewares validation.js +

+
+
+ 88.89% + Statements + 8/9 +
+
+ 50% + Branches + 1/2 +
+
+ 100% + Functions + 2/2 +
+
+ 100% + Lines + 8/8 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +161x +  +1x +5x +  +  +1x +1x +1x +  +  +5x +  +  +1x + 
const { validationResult } = require('express-validator')
+ 
+const validation = rules => {
+	const middlewares = [
+		...rules,
+		(req, res, next) => {
+			const errors = validationResult(req)
+			Iif (!errors.isEmpty()) return res.status(422).json({ errors: errors.array() })
+			next()
+		}
+	]
+	return middlewares
+}
+ 
+module.exports = { validation }
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/services/multer.js.html b/coverage/lcov-report/hw5/services/multer.js.html new file mode 100644 index 0000000..df3cb73 --- /dev/null +++ b/coverage/lcov-report/hw5/services/multer.js.html @@ -0,0 +1,126 @@ + + + + Code coverage report for hw5/services/multer.js + + + + + + + +
+
+

+ All files / hw5/services multer.js +

+
+
+ 100% + Statements + 5/5 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 0/0 +
+
+ 100% + Lines + 5/5 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +201x +  +1x +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x + 
const Multer = require('multer')
+ 
+const { avatarStorage, articlesStorage } = require('./gcStorageService')
+ 
+const avatarMulter = Multer({
+	storage: avatarStorage,
+	limits: {
+		fileSize: 5 * 1024 * 1024
+	}
+})
+ 
+const articlesMulter = Multer({
+	storage: articlesStorage,
+	limits: {
+		fileSize: 5 * 1024 * 1024
+	}
+})
+ 
+module.exports = { avatarMulter, articlesMulter }
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/services/passportService.js.html b/coverage/lcov-report/hw5/services/passportService.js.html new file mode 100644 index 0000000..6a04165 --- /dev/null +++ b/coverage/lcov-report/hw5/services/passportService.js.html @@ -0,0 +1,333 @@ + + + + Code coverage report for hw5/services/passportService.js + + + + + + + +
+
+

+ All files / hw5/services passportService.js +

+
+
+ 44.74% + Statements + 17/38 +
+
+ 0% + Branches + 0/4 +
+
+ 50% + Functions + 3/6 +
+
+ 45.71% + Lines + 16/35 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +891x +1x +1x +  +1x +1x +1x +1x +  +1x +1x +  +1x +1x +1x +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
const LocalStrategy = require('passport-local').Strategy
+const GoogleStrategy = require('passport-google-oauth20')
+const FacebookStrategy = require('passport-facebook').Strategy
+ 
+const { errorLogger } = require('./logger')
+const { checkPsw } = require('./hashPsw')
+const { Users } = require('../db/models/index.js')
+const { AuthService } = require('./AuthService')
+ 
+module.exports = passport => {
+	passport.serializeUser((user, done) => done(null, user.id))
+ 
+	passport.deserializeUser(async (id, done) => {
+		try {
+			const user = await Users.findByPk(id)
+			return done(null, user)
+		} catch (err) {
+			done(err)
+			errorLogger.error(`An error on MySQL request`, { metadata: err })
+		}
+	})
+ 
+	passport.use(
+		new LocalStrategy({ usernameField: 'email', passwordField: 'password' }, async (email, password, done) => {
+			try {
+				const userData = await Users.unscoped().findOne({ where: { email: email } })
+				const user = userData.get({ plain: true })
+				if (!user.isVerified) done({ error: 'You should verify your account. Check your email.' })
+				const match = await checkPsw(password, user.password)
+				if (match) return done(null, user)
+				return done(null, {})
+			} catch (err) {
+				done(err)
+				errorLogger.error(`An error on MySQL request`, { metadata: err })
+			}
+		})
+	)
+ 
+	passport.use(
+		new GoogleStrategy(
+			{
+				clientID: process.env.GOOGLE_CLIENT_ID,
+				clientSecret: process.env.GOOGLE_CLIENT_SECRET,
+				callbackURL: process.env.GOOGLE_CALLBACK_URL
+			},
+			async (accessToken, refreshToken, profile, done) => {
+				try {
+					const user = await AuthService.findOrCreateOauthProvider({
+						provider: 'google',
+						email: profile._json.email,
+						firstName: profile._json.given_name,
+						lastName: profile._json.family_name,
+						providerUserId: profile.id
+					})
+					done(null, user)
+				} catch (e) {
+					done(e)
+				}
+			}
+		)
+	)
+ 
+	passport.use(
+		'facebook-strategy',
+		new FacebookStrategy(
+			{
+				clientID: process.env.FACEBOOK_CLIENT_ID,
+				clientSecret: process.env.FACEBOOK_CLIENT_SECRET,
+				callbackURL: process.env.FACEBOOK_CALLBACK_URL,
+				profileFields: ['id', 'email', 'first_name', 'last_name']
+			},
+			async (accessToken, refreshToken, profile, done) => {
+				try {
+					const user = await AuthService.findOrCreateOauthProvider({
+						provider: 'facebook',
+						email: profile._json.email,
+						firstName: profile.name.givenName,
+						lastName: profile.name.familyName,
+						providerUserId: profile.id
+					})
+					done(null, user)
+				} catch (error) {
+					done(error)
+				}
+			}
+		)
+	)
+}
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/services/queryHelperService.js.html b/coverage/lcov-report/hw5/services/queryHelperService.js.html new file mode 100644 index 0000000..4cca3e2 --- /dev/null +++ b/coverage/lcov-report/hw5/services/queryHelperService.js.html @@ -0,0 +1,156 @@ + + + + Code coverage report for hw5/services/queryHelperService.js + + + + + + + +
+
+

+ All files / hw5/services queryHelperService.js +

+
+
+ 35.71% + Statements + 5/14 +
+
+ 0% + Branches + 0/6 +
+
+ 0% + Functions + 0/2 +
+
+ 38.46% + Lines + 5/13 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +301x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x + 
const Op = require('sequelize').Op
+const { Articles, Users, Comments } = require('../db/models/index')
+ 
+const getArticles = async (after, authorId) => {
+	let whereObj = {}
+	if (after) {
+		const [timestamp, id] = after.split('_')
+		whereObj = { id: { [Op.lte]: +id }, publishedAt: { [Op.lt]: timestamp } }
+	}
+	if (authorId) whereObj.authorId = authorId
+	return await Articles.findAll({
+		where: whereObj,
+		limit: 5,
+		order: [['publishedAt', 'DESC'], ['id', 'ASC']],
+		include: [{ model: Users, as: 'author' }]
+	})
+}
+ 
+const getComments = async (articleId, continuation) => {
+	let whereObj = !continuation ? { articleId } : { id: { [Op.lt]: continuation }, articleId }
+	return await Comments.findAll({
+		where: whereObj,
+		limit: 5,
+		order: [['id', 'DESC']],
+		include: [{ model: Users, as: 'author', attributes: ['id', 'firstName', 'lastName', 'picture'] }]
+	})
+}
+ 
+module.exports = { getArticles, getComments }
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/services/rateLimitService.js.html b/coverage/lcov-report/hw5/services/rateLimitService.js.html new file mode 100644 index 0000000..e379734 --- /dev/null +++ b/coverage/lcov-report/hw5/services/rateLimitService.js.html @@ -0,0 +1,168 @@ + + + + Code coverage report for hw5/services/rateLimitService.js + + + + + + + +
+
+

+ All files / hw5/services rateLimitService.js +

+
+
+ 100% + Statements + 8/8 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 1/1 +
+
+ 100% + Lines + 8/8 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +341x +1x +1x +  +1x +1x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  + 
const RateLimit = require('express-rate-limit')
+const RLimitStore = require('rate-limit-redis')
+const { RateLimiterRedis } = require('rate-limiter-flexible')
+ 
+module.exports = client => {
+	const limiter = new RateLimit({
+		store: new RLimitStore({
+			client: client,
+			prefix: 'denis:limits:'
+		}),
+		max: 200,
+		delayMs: 0
+	})
+ 
+	const loginLimiter = new RateLimit({
+		store: new RLimitStore({
+			client: client,
+			prefix: 'denis:loginLimits:'
+		}),
+		windowMs: 10 * 60 * 1000,
+		max: 20,
+		delayMs: 0
+	})
+ 
+	const wsLimiter = new RateLimiterRedis({
+		redis: client,
+		keyPrefix: 'denis:socket:rl:',
+		points: 15,
+		duration: 30
+	})
+ 
+	return { limiter, loginLimiter, wsLimiter }
+}
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/services/redisConnectService.js.html b/coverage/lcov-report/hw5/services/redisConnectService.js.html new file mode 100644 index 0000000..8547445 --- /dev/null +++ b/coverage/lcov-report/hw5/services/redisConnectService.js.html @@ -0,0 +1,96 @@ + + + + Code coverage report for hw5/services/redisConnectService.js + + + + + + + +
+
+

+ All files / hw5/services redisConnectService.js +

+
+
+ 83.33% + Statements + 5/6 +
+
+ 100% + Branches + 0/0 +
+
+ 0% + Functions + 0/1 +
+
+ 83.33% + Lines + 5/6 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +101x +1x +1x +  +1x +  +  +  +1x + 
const R = require('ioredis')
+const client = new R(process.env.REDIS_URL)
+const { errorLogger } = require('./logger')
+ 
+client.on('error', err => {
+	errorLogger.error(`An error on Redis`, { metadata: err })
+})
+ 
+module.exports = client
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/services/socketService.js.html b/coverage/lcov-report/hw5/services/socketService.js.html new file mode 100644 index 0000000..12aa003 --- /dev/null +++ b/coverage/lcov-report/hw5/services/socketService.js.html @@ -0,0 +1,186 @@ + + + + Code coverage report for hw5/services/socketService.js + + + + + + + +
+
+

+ All files / hw5/services socketService.js +

+
+
+ 38.46% + Statements + 10/26 +
+
+ 0% + Branches + 0/4 +
+
+ 10% + Functions + 1/10 +
+
+ 43.48% + Lines + 10/23 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +401x +1x +1x +  +1x +  +1x +1x +1x +1x +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  + 
const socketio = require('socket.io')
+const passportSocketIo = require('passport.socketio')
+const adapter = require('socket.io-redis')
+ 
+const { errorLogger } = require('./logger')
+ 
+module.exports = (server, rStore, wsLimiter) => {
+	const io = socketio(server)
+	io.adapter(adapter(process.env.REDIS_URL))
+	io.use(
+		passportSocketIo.authorize({
+			secret: process.env.SESSION_SECRET,
+			store: rStore,
+			fail: (data, message, error, accept) => accept()
+		})
+	)
+ 
+	io.on('connection', function(socket) {
+		io.of('/').adapter.clients((err, clients) => {
+			if (err) errorLogger.error(`Some problem with socket connection`, { metadata: err })
+		})
+		const ip = socket.request.connection.remoteAddress
+		socket.use((packet, next) => {
+			wsLimiter
+				.consume(ip)
+				.then(consume => next())
+				.catch(consume => next(new Error('Rate limit error')))
+		})
+		if (socket.request.user.logged_in) {
+			socket.on('watch-comments', articleId => socket.join(`room-${articleId}`))
+			socket.on('unwatch-comments', articleId => socket.leave(`room-${articleId}`))
+ 
+			socket.on('comment-typing', articleId => {
+				socket.to(`room-${articleId}`).emit('comment-typing', { action: 'typing' })
+			})
+		}
+	})
+	return io
+}
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/services/stripeService.js.html b/coverage/lcov-report/hw5/services/stripeService.js.html new file mode 100644 index 0000000..8c07c9a --- /dev/null +++ b/coverage/lcov-report/hw5/services/stripeService.js.html @@ -0,0 +1,171 @@ + + + + Code coverage report for hw5/services/stripeService.js + + + + + + + +
+
+

+ All files / hw5/services stripeService.js +

+
+
+ 41.18% + Statements + 7/17 +
+
+ 0% + Branches + 0/4 +
+
+ 0% + Functions + 0/4 +
+
+ 41.18% + Lines + 7/17 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +351x +1x +1x +  +1x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +1x + 
const stripe = require('stripe')(process.env.STRIPE_SK)
+const asyncHandler = require('express-async-handler')
+const { Users } = require('../db/models/index')
+ 
+const createCustomer = asyncHandler(async (token, user) => {
+	const customer = await stripe.customers.create({ email: user.email, source: token })
+	const updated = await Users.update(
+		{ stripe_customer_id: customer.id, stripe_card_id: customer.default_source },
+		{ where: { id: user.id } }
+	)
+	return updated ? { stripe_customer_id: customer.id, stripe_card_id: customer.default_source } : null
+})
+ 
+const createCharge = asyncHandler(async (customerID, cardID, amount, email) => {
+	const charge = await stripe.charges.create({
+		customer: customerID,
+		amount: amount,
+		currency: 'usd',
+		description: `Charge Pro for ${email}`,
+		source: cardID
+	})
+	return charge ? charge.receipt_url : null
+})
+ 
+const getChargesAmount = asyncHandler(async customerID => {
+	const charges = await stripe.charges.list({ customer: customerID })
+	let sum = 0
+	charges.data.forEach(item => {
+		sum += item.amount
+	})
+	return sum / 100
+})
+ 
+module.exports = { createCustomer, createCharge, getChargesAmount }
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/services/validationService.js.html b/coverage/lcov-report/hw5/services/validationService.js.html new file mode 100644 index 0000000..44a2302 --- /dev/null +++ b/coverage/lcov-report/hw5/services/validationService.js.html @@ -0,0 +1,324 @@ + + + + Code coverage report for hw5/services/validationService.js + + + + + + + +
+
+

+ All files / hw5/services validationService.js +

+
+
+ 68% + Statements + 17/25 +
+
+ 37.5% + Branches + 3/8 +
+
+ 33.33% + Functions + 1/3 +
+
+ 85% + Lines + 17/20 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +861x +  +1x +  +1x +1x +1x +1x +1x +1x +1x +  +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +1x + 
const { body } = require('express-validator')
+ 
+const { validation } = require('../services/middlewares/validation')
+ 
+const isPass = value => {
+	const letters = /[a-zA-Z]/
+	const numbers = /[0-9]/
+	Iif (value.length < 6) return false
+	Iif (!letters.test(value)) return false
+	Iif (!numbers.test(value)) return false
+	return true
+}
+ 
+const checkCommentLength = value => value.length >= 2
+ 
+const userCreationValidation = validation([
+	body('firstName')
+		.exists({ checkFalsy: true })
+		.withMessage('First name is required'),
+	body('lastName')
+		.exists({ checkFalsy: true })
+		.withMessage('Last name is required'),
+	body('email')
+		.exists({ checkFalsy: true })
+		.withMessage('Email is required')
+		.isEmail()
+		.withMessage('Should be an email'),
+	body('password')
+		.exists({ checkFalsy: true })
+		.withMessage('Password is required')
+		.custom(isPass)
+		.withMessage('Password must have at least 6 symbols and digits.')
+])
+ 
+const loginValidation = validation([
+	body('email')
+		.exists({ checkFalsy: true })
+		.withMessage('Email is required')
+		.isEmail()
+		.withMessage('Should be an email'),
+	body('password')
+		.exists({ checkFalsy: true })
+		.withMessage('Password is required')
+		.custom(isPass)
+		.withMessage('Password must have at least 6 symbols and digits.')
+])
+ 
+const isValidDate = value => {
+	const date = new Date(value)
+	if (date.getDate) return true
+	return false
+}
+ 
+const articleValidation = validation([
+	body('title')
+		.exists({ checkFalsy: true })
+		.withMessage('Title is required'),
+	body('content')
+		.exists({ checkFalsy: true })
+		.withMessage('Content is required'),
+	body('publishedAt')
+		.exists({ checkFalsy: true })
+		.withMessage('publishedAt is required')
+		.custom(isValidDate)
+		.withMessage('publishedAt must be valid')
+])
+ 
+const editUserValidation = validation([
+	body('firstName')
+		.exists({ checkFalsy: true })
+		.withMessage('First name is required'),
+	body('lastName')
+		.exists({ checkFalsy: true })
+		.withMessage('Last name is required')
+])
+ 
+const commentValidation = validation([
+	body('content')
+		.exists({ checkFalsy: true })
+		.withMessage('Content is required')
+		.custom(checkCommentLength)
+		.withMessage('Content must have at least 2 symbols')
+])
+ 
+module.exports = { userCreationValidation, articleValidation, loginValidation, editUserValidation, commentValidation }
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/tests/helpers.js.html b/coverage/lcov-report/hw5/tests/helpers.js.html new file mode 100644 index 0000000..4c32126 --- /dev/null +++ b/coverage/lcov-report/hw5/tests/helpers.js.html @@ -0,0 +1,150 @@ + + + + Code coverage report for hw5/tests/helpers.js + + + + + + + +
+
+

+ All files / hw5/tests helpers.js +

+
+
+ 100% + Statements + 19/19 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 1/1 +
+
+ 100% + Lines + 19/19 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28  +1x +1x +1x +1x +1x +  +1x +  +1x +1x +1x +1x +1x +  +1x +1x +1x +1x +  +1x +1x +1x +  +1x +  +  + 
/* eslint-disable */
+const faker = require('faker')
+const supertest = require('supertest')
+const app = require('../index')
+const { SendgridService } = require('../services/emailService')
+const request = supertest(app)
+ 
+module.exports = {
+	registerUser: async () => {
+		const firstName = faker.name.firstName()
+		const lastName = faker.name.lastName()
+		const email = faker.internet.email()
+		const password = faker.internet.password()
+		const sendEmailSpy = jest.spyOn(SendgridService, 'sendEmail').mockImplementation()
+ 
+		await request.post('/api/v1/registration').send({ firstName, lastName, email, password })
+		const { verifyLink } = sendEmailSpy.mock.calls[0][3]
+		const token = verifyLink.split('token=').pop()
+		const response = await request.post('/api/v1/registration/verify').send({ token })
+ 
+		sendEmailSpy.mockReset()
+		const user = response.body.data
+		user.authCookie = response.headers['set-cookie'][0].split(';').shift()
+ 
+		return user
+	}
+}
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/hw5/tests/index.html b/coverage/lcov-report/hw5/tests/index.html new file mode 100644 index 0000000..54c4d05 --- /dev/null +++ b/coverage/lcov-report/hw5/tests/index.html @@ -0,0 +1,97 @@ + + + + Code coverage report for hw5/tests + + + + + + + +
+
+

+ All files hw5/tests +

+
+
+ 100% + Statements + 19/19 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 1/1 +
+
+ 100% + Lines + 19/19 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
helpers.js
100%19/19100%0/0100%1/1100%19/19
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/index.html b/coverage/lcov-report/index.html new file mode 100644 index 0000000..98fabee --- /dev/null +++ b/coverage/lcov-report/index.html @@ -0,0 +1,201 @@ + + + + Code coverage report for All files + + + + + + + +
+
+

+ All files +

+
+
+ 56.63% + Statements + 380/671 +
+
+ 15.18% + Branches + 17/112 +
+
+ 23.93% + Functions + 28/117 +
+
+ 59.94% + Lines + 377/629 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
hw5
84.09%37/4425%1/440%2/586.05%37/43
hw5/db
100%3/3100%0/0100%0/0100%3/3
hw5/db/models
100%35/3550%1/2100%5/5100%35/35
hw5/mongodb
36.84%14/38100%0/028.57%2/736.84%14/38
hw5/mongodb/models
52.38%11/21100%0/00%0/755%11/20
hw5/routes
49%122/2496%3/5014.71%5/3451.71%121/234
hw5/services
52.21%130/24921.15%11/5220%11/5556.64%128/226
hw5/services/middlewares
69.23%9/1325%1/466.67%2/381.82%9/11
hw5/tests
100%19/19100%0/0100%1/1100%19/19
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/prettify.css b/coverage/lcov-report/prettify.css new file mode 100644 index 0000000..b317a7c --- /dev/null +++ b/coverage/lcov-report/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/coverage/lcov-report/prettify.js b/coverage/lcov-report/prettify.js new file mode 100644 index 0000000..b322523 --- /dev/null +++ b/coverage/lcov-report/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/coverage/lcov-report/sort-arrow-sprite.png b/coverage/lcov-report/sort-arrow-sprite.png new file mode 100644 index 0000000..03f704a Binary files /dev/null and b/coverage/lcov-report/sort-arrow-sprite.png differ diff --git a/coverage/lcov-report/sorter.js b/coverage/lcov-report/sorter.js new file mode 100644 index 0000000..16de10c --- /dev/null +++ b/coverage/lcov-report/sorter.js @@ -0,0 +1,170 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/coverage/lcov.info b/coverage/lcov.info new file mode 100644 index 0000000..8bc8ed9 --- /dev/null +++ b/coverage/lcov.info @@ -0,0 +1,1299 @@ +TN: +SF:/home/denis/Zazmic_Internship/hw5/index.js +FN:54,(anonymous_0) +FN:59,(anonymous_1) +FN:71,(anonymous_2) +FN:72,(anonymous_3) +FN:77,(anonymous_4) +FNF:5 +FNH:2 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:1,(anonymous_2) +FNDA:1,(anonymous_3) +FNDA:0,(anonymous_4) +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:8,1 +DA:11,1 +DA:12,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:19,1 +DA:21,1 +DA:22,1 +DA:25,1 +DA:26,1 +DA:35,1 +DA:36,1 +DA:38,1 +DA:40,1 +DA:41,1 +DA:42,1 +DA:43,1 +DA:44,1 +DA:47,1 +DA:50,1 +DA:51,1 +DA:54,1 +DA:55,0 +DA:56,0 +DA:57,0 +DA:59,1 +DA:60,0 +DA:61,0 +DA:64,1 +DA:66,1 +DA:67,1 +DA:70,1 +DA:72,1 +DA:73,1 +DA:74,1 +DA:77,0 +DA:79,1 +LF:43 +LH:37 +BRDA:60,0,0,0 +BRDA:60,0,1,0 +BRDA:73,1,0,0 +BRDA:73,1,1,1 +BRF:4 +BRH:1 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/db/constant.js +FNF:0 +FNH:0 +DA:1,1 +LF:1 +LH:1 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/db/dbConnection.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +LF:2 +LH:2 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/db/models/Articles.js +FN:56,(anonymous_0) +FNF:1 +FNH:1 +FNDA:1,(anonymous_0) +DA:1,1 +DA:2,1 +DA:6,1 +DA:56,1 +DA:57,1 +DA:58,1 +DA:61,1 +LF:7 +LH:7 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/db/models/Comments.js +FN:42,(anonymous_0) +FNF:1 +FNH:1 +FNDA:1,(anonymous_0) +DA:1,1 +DA:2,1 +DA:6,1 +DA:42,1 +DA:43,1 +DA:44,1 +DA:47,1 +LF:7 +LH:7 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/db/models/Providers.js +FN:37,(anonymous_0) +FNF:1 +FNH:1 +FNDA:1,(anonymous_0) +DA:1,1 +DA:2,1 +DA:6,1 +DA:37,1 +DA:38,1 +DA:44,1 +LF:6 +LH:6 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/db/models/Users.js +FN:89,(anonymous_0) +FNF:1 +FNH:1 +FNDA:1,(anonymous_0) +DA:1,1 +DA:2,1 +DA:3,1 +DA:7,1 +DA:89,1 +DA:90,1 +DA:91,1 +DA:92,1 +DA:95,1 +LF:9 +LH:9 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/db/models/index.js +FN:10,(anonymous_0) +FNF:1 +FNH:1 +FNDA:4,(anonymous_0) +DA:1,1 +DA:8,1 +DA:10,1 +DA:11,4 +DA:12,4 +DA:16,1 +LF:6 +LH:6 +BRDA:11,0,0,4 +BRDA:11,0,1,0 +BRF:2 +BRH:1 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/mongodb/mongoConnection.js +FN:4,(anonymous_0) +FNF:1 +FNH:1 +FNDA:1,(anonymous_0) +DA:1,1 +DA:5,1 +DA:6,1 +DA:11,0 +DA:15,1 +DA:17,1 +LF:6 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/mongodb/queries.js +FN:5,(anonymous_0) +FN:6,(anonymous_1) +FN:8,(anonymous_2) +FN:18,(anonymous_3) +FN:28,(anonymous_4) +FN:41,(anonymous_5) +FNF:6 +FNH:1 +FNDA:1,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +DA:1,1 +DA:2,1 +DA:4,1 +DA:5,1 +DA:6,0 +DA:8,1 +DA:9,0 +DA:10,0 +DA:11,0 +DA:13,0 +DA:14,0 +DA:18,1 +DA:19,0 +DA:20,0 +DA:21,0 +DA:23,0 +DA:24,0 +DA:28,1 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:36,0 +DA:37,0 +DA:41,1 +DA:42,0 +DA:43,0 +DA:45,0 +DA:46,0 +DA:50,1 +LF:32 +LH:9 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/mongodb/models/ArticlesViews.js +FN:14,(anonymous_0) +FN:19,(anonymous_1) +FN:25,(anonymous_2) +FN:26,(anonymous_3) +FN:30,(anonymous_4) +FN:33,(anonymous_5) +FN:37,(anonymous_6) +FNF:7 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +DA:1,1 +DA:2,1 +DA:4,1 +DA:6,1 +DA:14,1 +DA:15,0 +DA:16,0 +DA:19,1 +DA:20,0 +DA:21,0 +DA:25,1 +DA:26,0 +DA:27,0 +DA:30,1 +DA:31,0 +DA:33,1 +DA:34,0 +DA:37,1 +DA:38,0 +DA:41,1 +LF:20 +LH:11 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/routes/auth.js +FN:24,(anonymous_0) +FN:38,(anonymous_1) +FN:51,(anonymous_2) +FN:57,(anonymous_3) +FN:72,(anonymous_4) +FN:75,(anonymous_5) +FN:80,(anonymous_6) +FN:81,(anonymous_7) +FN:86,(anonymous_8) +FN:89,(anonymous_9) +FN:94,verifyToken +FNF:11 +FNH:5 +FNDA:1,(anonymous_0) +FNDA:1,(anonymous_1) +FNDA:1,(anonymous_2) +FNDA:1,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:1,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,verifyToken +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:21,1 +DA:25,1 +DA:26,1 +DA:27,0 +DA:28,0 +DA:30,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +DA:45,1 +DA:51,1 +DA:52,1 +DA:53,1 +DA:54,1 +DA:55,1 +DA:56,1 +DA:57,1 +DA:58,1 +DA:59,1 +DA:62,0 +DA:66,1 +DA:72,0 +DA:75,1 +DA:80,1 +DA:81,0 +DA:82,0 +DA:86,1 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:96,0 +DA:97,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:105,0 +DA:109,1 +LF:53 +LH:36 +BRDA:26,0,0,0 +BRDA:26,0,1,1 +BRDA:39,1,0,0 +BRDA:39,1,1,1 +BRDA:58,2,0,0 +BRDA:58,2,1,1 +BRDA:82,3,0,0 +BRDA:82,3,1,0 +BRDA:90,4,0,0 +BRDA:90,4,1,0 +BRDA:97,5,0,0 +BRDA:97,5,1,0 +BRF:12 +BRH:3 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/routes/blogs.js +FN:27,(anonymous_0) +FN:38,(anonymous_1) +FN:51,(anonymous_2) +FN:68,(anonymous_3) +FN:81,(anonymous_4) +FN:98,(anonymous_5) +FN:108,(anonymous_6) +FN:124,(anonymous_7) +FNF:8 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +DA:12,1 +DA:13,1 +DA:14,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:25,1 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:35,1 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:48,1 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:61,0 +DA:66,1 +DA:69,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:79,1 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:90,0 +DA:96,1 +DA:99,0 +DA:100,0 +DA:104,1 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:121,1 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:133,0 +DA:137,1 +LF:70 +LH:20 +BRDA:41,0,0,0 +BRDA:41,0,1,0 +BRDA:54,1,0,0 +BRDA:54,1,1,0 +BRDA:56,2,0,0 +BRDA:56,2,1,0 +BRDA:57,3,0,0 +BRDA:57,3,1,0 +BRDA:59,4,0,0 +BRDA:59,4,1,0 +BRDA:84,5,0,0 +BRDA:84,5,1,0 +BRDA:87,6,0,0 +BRDA:87,6,1,0 +BRDA:88,7,0,0 +BRDA:88,7,1,0 +BRDA:127,8,0,0 +BRDA:127,8,1,0 +BRF:18 +BRH:0 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/routes/fees.js +FN:20,(anonymous_0) +FN:32,(anonymous_1) +FNF:2 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +DA:6,1 +DA:7,1 +DA:8,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:17,1 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:29,1 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:55,0 +DA:59,1 +LF:25 +LH:12 +BRDA:22,0,0,0 +BRDA:22,0,1,0 +BRDA:23,1,0,0 +BRDA:23,1,1,0 +BRDA:43,2,0,0 +BRDA:43,2,1,0 +BRDA:47,3,0,0 +BRDA:47,3,1,0 +BRDA:47,4,0,0 +BRDA:47,4,1,0 +BRF:10 +BRH:0 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/routes/index.js +FN:20,(anonymous_0) +FN:21,(anonymous_1) +FNF:2 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +DA:1,1 +DA:2,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:11,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:20,1 +DA:21,0 +DA:22,0 +DA:23,0 +DA:26,1 +LF:20 +LH:17 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/routes/oauth.js +FN:15,(anonymous_0) +FN:19,(anonymous_1) +FNF:2 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +DA:7,1 +DA:8,1 +DA:9,1 +DA:11,1 +DA:13,1 +DA:15,1 +DA:16,0 +DA:19,1 +DA:20,0 +DA:23,1 +LF:10 +LH:8 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/routes/profile.js +FN:23,(anonymous_0) +FN:32,(anonymous_1) +FN:46,(anonymous_2) +FN:56,(anonymous_3) +FNF:4 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +DA:7,1 +DA:8,1 +DA:9,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:19,1 +DA:24,0 +DA:25,0 +DA:29,1 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:42,1 +DA:47,0 +DA:48,0 +DA:49,0 +DA:53,1 +DA:57,0 +DA:58,0 +DA:59,0 +DA:63,1 +LF:29 +LH:15 +BRDA:34,0,0,0 +BRDA:34,0,1,0 +BRDA:35,1,0,0 +BRDA:35,1,1,0 +BRDA:37,2,0,0 +BRDA:37,2,1,0 +BRDA:47,3,0,0 +BRDA:47,3,1,0 +BRF:8 +BRH:0 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/routes/users.js +FN:24,(anonymous_0) +FN:41,(anonymous_1) +FN:43,(anonymous_2) +FN:54,(anonymous_3) +FN:62,(anonymous_4) +FNF:5 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +DA:9,1 +DA:10,1 +DA:11,1 +DA:13,1 +DA:14,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:21,1 +DA:25,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:46,0 +DA:48,0 +DA:52,1 +DA:55,0 +DA:56,0 +DA:60,1 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:70,1 +LF:27 +LH:13 +BRDA:44,0,0,0 +BRDA:44,0,1,0 +BRF:2 +BRH:0 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/services/AuthService.js +FN:5,(anonymous_0) +FN:25,(anonymous_1) +FN:29,(anonymous_2) +FNF:3 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +DA:1,1 +DA:2,1 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:21,0 +DA:26,0 +DA:30,0 +DA:34,1 +LF:18 +LH:3 +BRDA:8,0,0,0 +BRDA:8,0,1,0 +BRDA:12,1,0,0 +BRDA:12,1,1,0 +BRF:4 +BRH:0 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/services/emailService.js +FN:5,(anonymous_0) +FNF:1 +FNH:0 +FNDA:0,(anonymous_0) +DA:1,1 +DA:2,1 +DA:6,0 +DA:15,1 +LF:4 +LH:3 +BRDA:5,0,0,0 +BRDA:5,1,0,0 +BRF:2 +BRH:0 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/services/gcRemovalService.js +FN:5,(anonymous_0) +FN:9,(anonymous_1) +FN:13,(anonymous_2) +FN:14,(anonymous_3) +FN:17,(anonymous_4) +FN:21,(anonymous_5) +FNF:6 +FNH:1 +FNDA:2,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +DA:1,1 +DA:2,1 +DA:6,2 +DA:7,2 +DA:10,0 +DA:14,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:25,1 +DA:26,1 +DA:28,1 +LF:13 +LH:7 +BRDA:10,0,0,0 +BRDA:10,0,1,0 +BRF:2 +BRH:0 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/services/gcStorageService.js +FN:7,(anonymous_0) +FN:17,(anonymous_1) +FN:21,(anonymous_2) +FN:26,(anonymous_3) +FN:27,(anonymous_4) +FN:29,(anonymous_5) +FN:38,(anonymous_6) +FN:42,(anonymous_7) +FN:52,(anonymous_8) +FNF:9 +FNH:1 +FNDA:2,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:8,2 +DA:9,2 +DA:10,2 +DA:11,2 +DA:12,2 +DA:13,2 +DA:14,2 +DA:18,0 +DA:22,0 +DA:23,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:39,0 +DA:40,0 +DA:43,0 +DA:53,0 +DA:57,1 +DA:64,1 +DA:71,1 +LF:30 +LH:14 +BRDA:8,0,0,0 +BRDA:8,0,1,2 +BRDA:9,1,0,0 +BRDA:9,1,1,2 +BRDA:10,2,0,2 +BRDA:10,2,1,2 +BRDA:11,3,0,2 +BRDA:11,3,1,2 +BRDA:28,4,0,0 +BRDA:28,4,1,0 +BRDA:30,5,0,0 +BRDA:30,5,1,0 +BRDA:33,6,0,0 +BRDA:33,6,1,0 +BRF:14 +BRH:6 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/services/hashPsw.js +FN:5,(anonymous_0) +FN:15,(anonymous_1) +FNF:2 +FNH:1 +FNDA:2,(anonymous_0) +FNDA:0,(anonymous_1) +DA:1,1 +DA:2,1 +DA:3,1 +DA:5,1 +DA:6,2 +DA:7,2 +DA:8,1 +DA:11,0 +DA:15,1 +DA:17,1 +LF:10 +LH:9 +BRDA:7,0,0,1 +BRDA:7,0,1,1 +BRF:2 +BRH:2 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/services/helpers.js +FN:3,(anonymous_0) +FN:4,(anonymous_1) +FN:5,(anonymous_2) +FN:11,(anonymous_3) +FN:17,(anonymous_4) +FNF:5 +FNH:2 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:1,(anonymous_3) +FNDA:1,(anonymous_4) +DA:1,1 +DA:3,1 +DA:4,0 +DA:5,0 +DA:6,0 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:17,1 +DA:19,1 +LF:11 +LH:8 +BRDA:6,0,0,0 +BRDA:6,0,1,0 +BRF:2 +BRH:0 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/services/logger.js +FN:66,(anonymous_0) +FN:68,(anonymous_1) +FNF:2 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +DA:1,1 +DA:2,1 +DA:3,1 +DA:5,1 +DA:7,1 +DA:26,1 +DA:46,1 +DA:66,1 +DA:67,0 +DA:68,0 +DA:71,1 +DA:72,1 +DA:74,1 +LF:13 +LH:11 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/services/multer.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:5,1 +DA:12,1 +DA:19,1 +LF:5 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/services/passportService.js +FN:10,(anonymous_0) +FN:11,(anonymous_1) +FN:13,(anonymous_2) +FN:24,(anonymous_3) +FN:46,(anonymous_4) +FN:72,(anonymous_5) +FNF:6 +FNH:3 +FNDA:1,(anonymous_0) +FNDA:1,(anonymous_1) +FNDA:1,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +DA:1,1 +DA:2,1 +DA:3,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:10,1 +DA:11,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:18,0 +DA:19,0 +DA:23,1 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:33,0 +DA:34,0 +DA:39,1 +DA:47,0 +DA:48,0 +DA:55,0 +DA:57,0 +DA:63,1 +DA:73,0 +DA:74,0 +DA:81,0 +DA:83,0 +LF:35 +LH:16 +BRDA:28,0,0,0 +BRDA:28,0,1,0 +BRDA:30,1,0,0 +BRDA:30,1,1,0 +BRF:4 +BRH:0 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/services/queryHelperService.js +FN:4,(anonymous_0) +FN:19,(anonymous_1) +FNF:2 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +DA:1,1 +DA:2,1 +DA:4,1 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:10,0 +DA:11,0 +DA:19,1 +DA:20,0 +DA:21,0 +DA:29,1 +LF:13 +LH:5 +BRDA:6,0,0,0 +BRDA:6,0,1,0 +BRDA:10,1,0,0 +BRDA:10,1,1,0 +BRDA:20,2,0,0 +BRDA:20,2,1,0 +BRF:6 +BRH:0 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/services/rateLimitService.js +FN:5,(anonymous_0) +FNF:1 +FNH:1 +FNDA:1,(anonymous_0) +DA:1,1 +DA:2,1 +DA:3,1 +DA:5,1 +DA:6,1 +DA:15,1 +DA:25,1 +DA:32,1 +LF:8 +LH:8 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/services/redisConnectService.js +FN:5,(anonymous_0) +FNF:1 +FNH:0 +FNDA:0,(anonymous_0) +DA:1,1 +DA:2,1 +DA:3,1 +DA:5,1 +DA:6,0 +DA:9,1 +LF:6 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/services/socketService.js +FN:7,(anonymous_0) +FN:14,(anonymous_1) +FN:18,(anonymous_2) +FN:19,(anonymous_3) +FN:23,(anonymous_4) +FN:26,(anonymous_5) +FN:27,(anonymous_6) +FN:30,(anonymous_7) +FN:31,(anonymous_8) +FN:33,(anonymous_9) +FNF:10 +FNH:1 +FNDA:1,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +DA:1,1 +DA:2,1 +DA:3,1 +DA:5,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:14,0 +DA:18,1 +DA:19,0 +DA:20,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:26,0 +DA:27,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:33,0 +DA:34,0 +DA:38,1 +LF:23 +LH:10 +BRDA:20,0,0,0 +BRDA:20,0,1,0 +BRDA:29,1,0,0 +BRDA:29,1,1,0 +BRF:4 +BRH:0 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/services/stripeService.js +FN:5,(anonymous_0) +FN:14,(anonymous_1) +FN:25,(anonymous_2) +FN:28,(anonymous_3) +FNF:4 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +DA:1,1 +DA:2,1 +DA:3,1 +DA:5,1 +DA:6,0 +DA:7,0 +DA:11,0 +DA:14,1 +DA:15,0 +DA:22,0 +DA:25,1 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:31,0 +DA:34,1 +LF:17 +LH:7 +BRDA:11,0,0,0 +BRDA:11,0,1,0 +BRDA:22,1,0,0 +BRDA:22,1,1,0 +BRF:4 +BRH:0 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/services/validationService.js +FN:5,(anonymous_0) +FN:14,(anonymous_1) +FN:48,(anonymous_2) +FNF:3 +FNH:1 +FNDA:1,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +DA:1,1 +DA:3,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:14,1 +DA:16,1 +DA:35,1 +DA:48,1 +DA:49,0 +DA:50,0 +DA:51,0 +DA:54,1 +DA:68,1 +DA:77,1 +DA:85,1 +LF:20 +LH:17 +BRDA:8,0,0,0 +BRDA:8,0,1,1 +BRDA:9,1,0,0 +BRDA:9,1,1,1 +BRDA:10,2,0,0 +BRDA:10,2,1,1 +BRDA:50,3,0,0 +BRDA:50,3,1,0 +BRF:8 +BRH:3 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/services/middlewares/authCheck.js +FN:2,(anonymous_0) +FNF:1 +FNH:0 +FNDA:0,(anonymous_0) +DA:2,1 +DA:3,0 +DA:4,0 +LF:3 +LH:1 +BRDA:3,0,0,0 +BRDA:3,0,1,0 +BRF:2 +BRH:0 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/services/middlewares/validation.js +FN:3,(anonymous_0) +FN:6,(anonymous_1) +FNF:2 +FNH:2 +FNDA:5,(anonymous_0) +FNDA:1,(anonymous_1) +DA:1,1 +DA:3,1 +DA:4,5 +DA:7,1 +DA:8,1 +DA:9,1 +DA:12,5 +DA:15,1 +LF:8 +LH:8 +BRDA:8,0,0,0 +BRDA:8,0,1,1 +BRF:2 +BRH:1 +end_of_record +TN: +SF:/home/denis/Zazmic_Internship/hw5/tests/helpers.js +FN:9,(anonymous_0) +FNF:1 +FNH:1 +FNDA:1,(anonymous_0) +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:8,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:25,1 +LF:19 +LH:19 +BRF:0 +BRH:0 +end_of_record diff --git a/db/migrations/20191010114724-createArticles.js b/db/migrations/20191010114724-createArticles.js index 3db788c..ea762bb 100644 --- a/db/migrations/20191010114724-createArticles.js +++ b/db/migrations/20191010114724-createArticles.js @@ -15,7 +15,7 @@ module.exports = { allowNull: false }, content: { - type: Sequelize.STRING, + type: Sequelize.TEXT, allowNull: false }, published_at: { diff --git a/docs/components/responses/Errors.yaml b/docs/components/responses/Errors.yaml new file mode 100644 index 0000000..37fe141 --- /dev/null +++ b/docs/components/responses/Errors.yaml @@ -0,0 +1,16 @@ +components: + responses: + NotFound: + description: The specified resource was not found + Unauthorized: + description: Unauthorized + Forbidden: + description: Forbidden + UnprocessableEntity: + description: Unprocessable Entity + schema: + $ref: '#/components/schemas/ValidationErrors' + InternalError: + description: Unexpected server error + schema: + $ref: '#/components/schemas/Error' diff --git a/docs/components/schemas/ArrayOfArticles.yaml b/docs/components/schemas/ArrayOfArticles.yaml new file mode 100644 index 0000000..dbcfc4c --- /dev/null +++ b/docs/components/schemas/ArrayOfArticles.yaml @@ -0,0 +1,6 @@ +components: + schemas: + ArrayOfArticles: + type: array + items: + $ref: '#/components/schemas/Article' diff --git a/docs/components/schemas/ArrayOfComments.yaml b/docs/components/schemas/ArrayOfComments.yaml new file mode 100644 index 0000000..67061e1 --- /dev/null +++ b/docs/components/schemas/ArrayOfComments.yaml @@ -0,0 +1,6 @@ +components: + schemas: + ArrayOfComments: + type: array + items: + $ref: '#/components/schemas/Comments' diff --git a/docs/components/schemas/ArrayOfUsers.yaml b/docs/components/schemas/ArrayOfUsers.yaml new file mode 100644 index 0000000..0dedf10 --- /dev/null +++ b/docs/components/schemas/ArrayOfUsers.yaml @@ -0,0 +1,6 @@ +components: + schemas: + ArrayOfUsers: + type: array + items: + $ref: '#/components/schemas/User' diff --git a/docs/components/schemas/Article.yaml b/docs/components/schemas/Article.yaml new file mode 100644 index 0000000..c5ea448 --- /dev/null +++ b/docs/components/schemas/Article.yaml @@ -0,0 +1,26 @@ +components: + schemas: + Article: + type: object + properties: + id: + type: integer + description: Articles ID. + title: + type: string + content: + type: string + picture: + type: string + authorId: + type: integer + author: + $ref: '#/components/schemas/User' + views: + type: integer + updatedAt: + type: string + format: date-time + createdAt: + type: string + format: date-time diff --git a/docs/components/schemas/Comments.yaml b/docs/components/schemas/Comments.yaml new file mode 100644 index 0000000..19f18b6 --- /dev/null +++ b/docs/components/schemas/Comments.yaml @@ -0,0 +1,17 @@ +components: + schemas: + Comments: + type: object + properties: + id: + type: integer + description: Articles ID. + content: + type: string + authorId: + type: integer + articleId: + type: integer + createdAt: + type: string + format: date-time diff --git a/docs/components/schemas/Error.yaml b/docs/components/schemas/Error.yaml new file mode 100644 index 0000000..c0e0bd7 --- /dev/null +++ b/docs/components/schemas/Error.yaml @@ -0,0 +1,7 @@ +components: + schemas: + Error: + type: object + properties: + data: + type: object diff --git a/docs/components/schemas/User.yaml b/docs/components/schemas/User.yaml new file mode 100644 index 0000000..287ade2 --- /dev/null +++ b/docs/components/schemas/User.yaml @@ -0,0 +1,38 @@ +components: + schemas: + User: + type: object + properties: + id: + type: integer + description: Users ID. + email: + type: string + firstName: + type: string + lastName: + type: string + picture: + type: string + articlesCount: + type: integer + is_pro: + type: boolean + nullable: true + is_verified: + type: boolean + nullable: true + stripe_card_id: + type: string + nullable: true + stripe_customer_id: + type: string + nullable: true + viewsCount: + type: integer + updatedAt: + type: string + format: date-time + createdAt: + type: string + format: date-time diff --git a/docs/components/schemas/ValidationErrors.yaml b/docs/components/schemas/ValidationErrors.yaml new file mode 100644 index 0000000..7f0acdd --- /dev/null +++ b/docs/components/schemas/ValidationErrors.yaml @@ -0,0 +1,7 @@ +components: + schemas: + ValidationErrors: + type: object + properties: + errors: + type: array diff --git a/docs/paths/auth.yaml b/docs/paths/auth.yaml new file mode 100644 index 0000000..ce5d88d --- /dev/null +++ b/docs/paths/auth.yaml @@ -0,0 +1,123 @@ +paths: + /api/v1/login: + post: + tags: + - Auth + summary: Login with given user + requestBody: + required: true + content: + application/json: + schema: + properties: + email: + type: string + password: + type: string + required: + - email + - password + responses: + 200: + description: Logged in user + content: + application/json: + schema: + type: object + properties: + data: + $ref: '#/components/schemas/User' + 401: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + 500: + $ref: '#/components/responses/InternalError' + /api/v1/logout: + post: + tags: + - Auth + summary: Logout + responses: + 200: + description: Logged out + content: + application/json: + schema: + type: object + properties: + data: + type: object + 404: + $ref: '#/components/responses/NotFound' + 500: + $ref: '#/components/responses/InternalError' + /api/v1/registration: + post: + tags: + - Auth + summary: Registration a new user + requestBody: + required: true + content: + application/json: + schema: + properties: + firstName: + type: string + lastName: + type: string + email: + type: string + password: + type: string + required: + - firstName + - lastName + - email + - password + responses: + 200: + description: A new user was registered + content: + application/json: + schema: + type: object + properties: + data: + $ref: '#/components/schemas/User' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/InternalError' + /api/v1/registration/verify: + post: + tags: + - Auth + summary: User verification + requestBody: + required: true + content: + application/json: + schema: + properties: + token: + type: string + required: + - token + responses: + 200: + description: User was verified + content: + application/json: + schema: + type: object + properties: + data: + $ref: '#/components/schemas/User' + 403: + $ref: '#/components/responses/Forbidden' + 422: + $ref: '#/components/responses/UnprocessableEntity' + 500: + $ref: '#/components/responses/InternalError' diff --git a/docs/paths/blog.yaml b/docs/paths/blog.yaml new file mode 100644 index 0000000..4d8d8bb --- /dev/null +++ b/docs/paths/blog.yaml @@ -0,0 +1,158 @@ +paths: + /api/v1/blog: + get: + tags: + - Articles + summary: Get articles list + parameters: + - in: query + name: after + description: Continuation token + schema: + type: object + responses: + 200: + description: Articles list + content: + application/json: + schema: + type: object + properties: + data: + $ref: '#/components/schemas/ArrayOfArticles' + 500: + $ref: '#/components/responses/InternalError' + post: + tags: + - Articles + summary: Create a new article + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + title: + type: string + picture: + type: string + format: binary + content: + type: string + publishedAt: + type: string + format: date-time + required: + - title + - content + - publishedAt + responses: + 200: + description: Created article + content: + application/json: + schema: + type: object + properties: + data: + $ref: '#/components/schemas/Article' + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/InternalError' + /api/v1/blog/{blogId}: + put: + tags: + - Articles + summary: Change a blog by id + parameters: + - name: blogId + in: path + required: true + description: Change a post by id + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + title: + type: string + picture: + type: string + format: binary + content: + type: string + publishedAt: + type: string + format: date-time + required: + - title + - content + - publishedAt + responses: + 200: + description: Created article + content: + application/json: + schema: + type: object + properties: + data: + type: object + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/InternalError' + get: + tags: + - Articles + summary: Get a blog by id + parameters: + - name: blogId + in: path + required: true + description: Get a post by id + responses: + 200: + description: Blog response + content: + application/json: + schema: + type: object + properties: + data: + $ref: '#/components/schemas/Article' + 500: + $ref: '#/components/responses/InternalError' + delete: + tags: + - Articles + summary: Delete a blog by id + parameters: + - name: blogId + in: path + required: true + description: Delete a post by id + responses: + 200: + description: Blog response + content: + application/json: + schema: + type: object + properties: + data: + $ref: '#/components/schemas/Article' + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/InternalError' diff --git a/docs/paths/comments.yaml b/docs/paths/comments.yaml new file mode 100644 index 0000000..8a315ac --- /dev/null +++ b/docs/paths/comments.yaml @@ -0,0 +1,84 @@ +paths: + /api/v1/blog/{blogId}/comments: + get: + tags: + - Comments + summary: Get all comments of a post + parameters: + - name: blogId + in: path + required: true + description: Get all comments of a post + responses: + 200: + description: Comments response + content: + application/json: + schema: + type: object + properties: + data: + $ref: '#/components/schemas/ArrayOfComments' + 500: + $ref: '#/components/responses/InternalError' + post: + tags: + - Comments + summary: Create a new comment + parameters: + - name: blogId + in: path + required: true + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + content: + type: string + required: + - content + responses: + 200: + description: Created comment + content: + application/json: + schema: + type: object + properties: + data: + $ref: '#/components/schemas/Comments' + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/InternalError' + /api/v1/blog/{blogId}/comments/{commentId}: + delete: + tags: + - Comments + summary: Delete a comment by id + parameters: + - name: blogId + in: path + required: true + - name: commentId + in: path + required: true + description: Delete a post by id + responses: + 200: + description: Comment response + content: + application/json: + schema: + type: object + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/InternalError' diff --git a/docs/paths/fees.yaml b/docs/paths/fees.yaml new file mode 100644 index 0000000..4af0bdd --- /dev/null +++ b/docs/paths/fees.yaml @@ -0,0 +1,63 @@ +paths: + /api/v1/fees: + get: + tags: + - Fees + summary: Get amount of fees + description: Get amount of fees + responses: + 200: + description: The amount of fees response + content: + application/json: + schema: + type: object + properties: + data: + type: object + properties: + amount: + type: integer + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/InternalError' + put: + tags: + - Fees + summary: Make a pay + description: Pay to become a pro + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + amount: + type: string + required: + - amount + responses: + 200: + description: The amount of fees response + content: + application/json: + schema: + type: object + properties: + data: + type: object + properties: + amount: + type: integer + user: + $ref: '#/components/schemas/User' + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/InternalError' diff --git a/docs/paths/oauth.yaml b/docs/paths/oauth.yaml new file mode 100644 index 0000000..fd358cc --- /dev/null +++ b/docs/paths/oauth.yaml @@ -0,0 +1,47 @@ +paths: + /api/v1/google/callback/{code}: + post: + tags: + - OAuth + summary: Login with google + parameters: + - name: code + in: path + required: true + responses: + 200: + description: Logged in user via google + content: + application/json: + schema: + type: object + properties: + data: + $ref: '#/components/schemas/User' + 404: + $ref: '#/components/responses/NotFound' + 500: + $ref: '#/components/responses/InternalError' + /api/v1/facebook/callback/{code}: + post: + tags: + - OAuth + summary: Login with facebook + parameters: + - name: code + in: path + required: true + responses: + 200: + description: Logged in user via facebook + content: + application/json: + schema: + type: object + properties: + data: + $ref: '#/components/schemas/User' + 404: + $ref: '#/components/responses/NotFound' + 500: + $ref: '#/components/responses/InternalError' diff --git a/docs/paths/profile.yaml b/docs/paths/profile.yaml new file mode 100644 index 0000000..4c2cd48 --- /dev/null +++ b/docs/paths/profile.yaml @@ -0,0 +1,123 @@ +paths: + /api/v1/profile: + put: + tags: + - Profile + summary: Update profile + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + firstName: + type: string + lastName: + type: string + required: + - firstName + - lastName + responses: + 200: + description: Profile response + content: + application/json: + schema: + type: object + properties: + data: + $ref: '#/components/schemas/User' + 401: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + 500: + $ref: '#/components/responses/InternalError' + delete: + tags: + - Profile + summary: Delete profile + responses: + 200: + description: Profile response + content: + application/json: + schema: + type: object + properties: + data: + type: object + 401: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + 500: + $ref: '#/components/responses/InternalError' + /api/v1/profile/picture: + put: + tags: + - Profile + summary: Change a photo + description: Change a photo + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + picture: + type: string + format: binary + required: + - picture + responses: + 200: + description: Photo was changed + content: + application/json: + schema: + type: object + properties: + data: + type: object + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/InternalError' + /api/v1/profile/card: + put: + tags: + - Profile + summary: Put a card + description: Put a card + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + token: + type: string + required: + - token + responses: + 200: + description: Card was added + content: + application/json: + schema: + type: object + properties: + data: + $ref: '#/components/schemas/User' + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/InternalError' diff --git a/docs/paths/users.yaml b/docs/paths/users.yaml new file mode 100644 index 0000000..e3adab7 --- /dev/null +++ b/docs/paths/users.yaml @@ -0,0 +1,60 @@ +paths: + /api/v1/users: + get: + tags: + - Users + summary: Get users list + responses: + 200: + description: Users response + content: + application/json: + schema: + type: object + properties: + data: + $ref: '#/components/schemas/ArrayOfUsers' + /api/v1/users/{userId}: + get: + tags: + - Users + summary: Get user by id + parameters: + - name: userId + in: path + required: true + description: Returns user by id + responses: + 200: + description: Users response + content: + application/json: + schema: + type: object + properties: + data: + $ref: '#/components/schemas/User' + 500: + $ref: '#/components/responses/InternalError' + /api/v1/users/{userId}/blog: + get: + tags: + - Users + summary: Get users posts + parameters: + - name: userId + in: path + required: true + description: Returns users posts + responses: + 200: + description: Users response + content: + application/json: + schema: + type: object + properties: + data: + $ref: '#/components/schemas/ArrayOfArticles' + 500: + $ref: '#/components/responses/InternalError' diff --git a/docs/swagger-config.js b/docs/swagger-config.js new file mode 100644 index 0000000..db8dfa4 --- /dev/null +++ b/docs/swagger-config.js @@ -0,0 +1,39 @@ +/* istanbul ignore file */ +const swaggerJSDoc = require('swagger-jsdoc') +const swaggerUi = require('swagger-ui-express') + +const swaggerDefinition = { + openapi: '3.0.0', + info: { + title: 'Blog API', + version: '1.0.0' + }, + basePath: '/', + components: {}, + security: [] +} + +const swaggerUiOptions = { + customCss: '.swagger-ui .toolbar { display: none }', + swaggerOptions: { filter: true } +} + +module.exports = app => { + app.use( + '/docs', + (req, res, next) => { + try { + req.swaggerDoc = swaggerJSDoc({ + swaggerDefinition, + apis: [`${__dirname}/components/**/*.yaml`, `${__dirname}/paths/**/*.yaml`] + }) + } catch (err) { + console.log(err) + return next(err) + } + next() + }, + swaggerUi.serve, + swaggerUi.setup(null, swaggerUiOptions) + ) +} diff --git a/index.js b/index.js index b9b0d53..1cf2a9a 100644 --- a/index.js +++ b/index.js @@ -43,6 +43,9 @@ app.use('/api/v1/users', limiter) app.use('/api/v1/profile', limiter) app.use('/api/v1/login', loginLimiter) +// docs +require('./docs/swagger-config')(app) + // routes const routes = require('./routes') app.use(routes) @@ -72,3 +75,5 @@ db.authenticate() }) }) .catch(err => errorLogger.error(`Some problem with MySQL connection`, { metadata: err })) + +module.exports = app diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..35c07bc --- /dev/null +++ b/jest.config.js @@ -0,0 +1,6 @@ +module.exports = { + testEnvironment: 'node', + globalSetup: './tests/setup.js', + // globalTeardown: './tests/teardown.js', + setupFiles: ['dotenv/config'] +} diff --git a/models/data.js b/models/data.js deleted file mode 100644 index 4b3a1ef..0000000 --- a/models/data.js +++ /dev/null @@ -1,20 +0,0 @@ -let blogs = [ - { - id: '1', - title: 'Some title', - content: 'Some text', - author: 'John Doe', - publishedAt: 'Wednesday' - } -] - -let users = [ - { - id: '1', - email: 'ddd@gmail.com', - firstName: 'Li', - lastName: 'Ju' - } -] - -module.exports = { blogs, users } diff --git a/mongo-init.js b/mongo-init.js new file mode 100644 index 0000000..f4c1c8d --- /dev/null +++ b/mongo-init.js @@ -0,0 +1,11 @@ +// eslint-disable-next-line +db.getSiblingDB('database').createUser({ + user: 'user', + pwd: 'password', + roles: [ + { + role: 'readWrite', + db: 'database' + } + ] +}) diff --git a/mongodb/mongoConnection.js b/mongodb/mongoConnection.js index 6cfea72..1b2a228 100644 --- a/mongodb/mongoConnection.js +++ b/mongodb/mongoConnection.js @@ -5,8 +5,7 @@ class MDatabase { try { return mongoose.connect(process.env.CONNECTION_STR, { useNewUrlParser: true, - useUnifiedTopology: true, - replicaSet: 'mentorship-shard-0' + useUnifiedTopology: true }) } catch (e) { throw e @@ -14,3 +13,5 @@ class MDatabase { } } MDatabase.connect() + +module.exports = MDatabase diff --git a/package-lock.json b/package-lock.json index 20c2b21..298d559 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,22 +8,165 @@ "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", - "dev": true, "requires": { "@babel/highlight": "^7.0.0" } }, + "@babel/core": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.4.tgz", + "integrity": "sha512-+bYbx56j4nYBmpsWtnPUsKW3NdnYxbqyfrP2w9wILBuHzdfIKz9prieZK0DFPyIzkjYVUe4QkusGL07r5pXznQ==", + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.4", + "@babel/helpers": "^7.7.4", + "@babel/parser": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "@babel/generator": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.4.tgz", + "integrity": "sha512-m5qo2WgdOJeyYngKImbkyQrnUN1mPceaG5BV+G0E3gWsa4l/jCSryWJdM2x8OuGAOyh+3d5pVYfZWCiNFtynxg==", + "requires": { + "@babel/types": "^7.7.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==" + }, + "@babel/helper-split-export-declaration": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", + "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/helpers": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.7.4.tgz", + "integrity": "sha512-ak5NGZGJ6LV85Q1Zc9gn2n+ayXOizryhjSUBTdu5ih1tlVCJeuQENzc4ItyCVhINVXvIT/ZQ4mheGIsfBkpskg==", + "requires": { + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, "@babel/highlight": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", - "dev": true, "requires": { "chalk": "^2.0.0", "esutils": "^2.0.2", "js-tokens": "^4.0.0" } }, + "@babel/parser": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.4.tgz", + "integrity": "sha512-jIwvLO0zCL+O/LmEJQjWA75MQTWwx3c3u2JOTDK5D3/9egrWRRA0/0hk9XXywYnXZVVpzrBYeIQTmhwUaePI9g==" + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz", + "integrity": "sha512-mObR+r+KZq0XhRVS2BrBKBpr5jqrqzlPvS9C9vuOf5ilSwzloAl7RPWLrgKdWS6IreaVrjHxTjtyqFiOisaCwg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/template": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/traverse": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", + "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.4", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@cnakazawa/watch": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz", + "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, "@google-cloud/common": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-2.2.3.tgz", @@ -136,6 +279,219 @@ } } }, + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" + }, + "dependencies": { + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + } + } + }, + "@jest/core": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", + "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", + "requires": { + "@jest/console": "^24.7.1", + "@jest/reporters": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-changed-files": "^24.9.0", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-resolve-dependencies": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "jest-watcher": "^24.9.0", + "micromatch": "^3.1.10", + "p-each-series": "^1.0.0", + "realpath-native": "^1.1.0", + "rimraf": "^2.5.4", + "slash": "^2.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + } + } + }, + "@jest/environment": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", + "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", + "requires": { + "@jest/fake-timers": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0" + } + }, + "@jest/fake-timers": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", + "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", + "requires": { + "@jest/types": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0" + } + }, + "@jest/reporters": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", + "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", + "requires": { + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "istanbul-lib-coverage": "^2.0.2", + "istanbul-lib-instrument": "^3.0.1", + "istanbul-lib-report": "^2.0.4", + "istanbul-lib-source-maps": "^3.0.1", + "istanbul-reports": "^2.2.6", + "jest-haste-map": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.6.0", + "node-notifier": "^5.4.2", + "slash": "^2.0.0", + "source-map": "^0.6.0", + "string-length": "^2.0.0" + }, + "dependencies": { + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@jest/test-result": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "requires": { + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } + }, + "@jest/test-sequencer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", + "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", + "requires": { + "@jest/test-result": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0" + } + }, + "@jest/transform": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", + "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^24.9.0", + "babel-plugin-istanbul": "^5.1.0", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.1.15", + "jest-haste-map": "^24.9.0", + "jest-regex-util": "^24.9.0", + "jest-util": "^24.9.0", + "micromatch": "^3.1.10", + "pirates": "^4.0.1", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "2.4.1" + }, + "dependencies": { + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "write-file-atomic": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", + "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + } + } + }, + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, "@sendgrid/client": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/@sendgrid/client/-/client-6.4.0.tgz", @@ -164,11 +520,79 @@ "@sendgrid/helpers": "^6.4.0" } }, + "@types/babel__core": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz", + "integrity": "sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA==", + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.0.tgz", + "integrity": "sha512-c1mZUu4up5cp9KROs/QAw0gTeHrw/x7m52LcnvMxxOZ03DmLwPV0MlGmlgzV3cnSdjhJOZsj7E7FHeioai+egw==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", + "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.8.tgz", + "integrity": "sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw==", + "requires": { + "@babel/types": "^7.3.0" + } + }, "@types/caseless": { "version": "0.12.2", "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==" }, + "@types/istanbul-lib-coverage": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", + "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==" + }, + "@types/istanbul-lib-report": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", + "integrity": "sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg==", + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", + "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "24.0.23", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.0.23.tgz", + "integrity": "sha512-L7MBvwfNpe7yVPTXLn32df/EK+AMBFAFvZrRuArGs7npEWnlziUXK+5GMIUTI4NIuwok3XibsjXCs5HxviYXjg==", + "dev": true, + "requires": { + "jest-diff": "^24.3.0" + } + }, "@types/node": { "version": "12.7.12", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.12.tgz", @@ -191,11 +615,34 @@ "form-data": "^2.5.0" } }, + "@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" + }, "@types/tough-cookie": { "version": "2.3.5", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.5.tgz", "integrity": "sha512-SCcK7mvGi3+ZNz833RRjFIxrn4gI1PPR3NtuIS+6vMkvmsGjosqTJwRt5bAEFLRz+wtJMWv8+uOnZf2hi2QXTg==" }, + "@types/yargs": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.3.tgz", + "integrity": "sha512-K8/LfZq2duW33XW/tFwEAfnZlqIfVsoyRB3kfXdPXYhl0nfM8mmh7GS0jg7WrX2Dgq/0Ha/pR1PaR+BvmWwjiQ==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-13.1.0.tgz", + "integrity": "sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg==" + }, + "abab": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", + "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==" + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -224,12 +671,33 @@ "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", "dev": true }, + "acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==" + } + } + }, "acorn-jsx": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.2.tgz", "integrity": "sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==", "dev": true }, + "acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==" + }, "after": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", @@ -266,8 +734,7 @@ "ansi-escapes": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" }, "ansi-regex": { "version": "3.0.0", @@ -291,7 +758,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, "requires": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" @@ -301,7 +767,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, "requires": { "remove-trailing-separator": "^1.0.1" } @@ -331,7 +796,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, "requires": { "sprintf-js": "~1.0.2" } @@ -339,20 +803,22 @@ "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" }, "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" }, "arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" }, "array-flatten": { "version": "1.1.1", @@ -372,8 +838,7 @@ "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" }, "arraybuffer.slice": { "version": "0.0.7", @@ -401,14 +866,12 @@ "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" }, "astral-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" }, "async": { "version": "2.6.3", @@ -437,8 +900,7 @@ "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, "aws-sign2": { "version": "0.7.0", @@ -450,6 +912,95 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, + "babel-jest": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", + "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", + "requires": { + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/babel__core": "^7.1.0", + "babel-plugin-istanbul": "^5.1.0", + "babel-preset-jest": "^24.9.0", + "chalk": "^2.4.2", + "slash": "^2.0.0" + }, + "dependencies": { + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + } + } + }, + "babel-plugin-istanbul": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", + "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "find-up": "^3.0.0", + "istanbul-lib-instrument": "^3.3.0", + "test-exclude": "^5.2.3" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "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==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + } + } + }, + "babel-plugin-jest-hoist": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", + "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", + "requires": { + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-jest": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", + "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", + "requires": { + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "babel-plugin-jest-hoist": "^24.9.0" + } + }, "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", @@ -473,7 +1024,6 @@ "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, "requires": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", @@ -488,7 +1038,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, "requires": { "is-descriptor": "^1.0.0" } @@ -497,7 +1046,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -506,7 +1054,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -515,7 +1062,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -677,7 +1223,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, "requires": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -695,13 +1240,40 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } } } }, + "browser-process-hrtime": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==" + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" + } + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "requires": { + "node-int64": "^0.4.0" + } + }, "bson": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.1.tgz", @@ -758,7 +1330,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, "requires": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", @@ -771,6 +1342,11 @@ "unset-value": "^1.0.0" } }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" + }, "caller-callsite": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", @@ -805,8 +1381,7 @@ "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, "camelcase": { "version": "4.1.0", @@ -814,7 +1389,15 @@ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", "dev": true }, - "capture-stack-trace": { + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "requires": { + "rsvp": "^4.8.4" + } + }, + "capture-stack-trace": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", @@ -899,7 +1482,6 @@ "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, "requires": { "arr-union": "^3.1.0", "define-property": "^0.2.5", @@ -911,7 +1493,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -1000,6 +1581,11 @@ "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz", "integrity": "sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw==" }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -1009,7 +1595,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, "requires": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" @@ -1086,8 +1671,7 @@ "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, "component-inherit": { "version": "0.0.3", @@ -1187,6 +1771,14 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, "cookie": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", @@ -1213,11 +1805,15 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, "core-js": { "version": "2.6.9", @@ -1282,7 +1878,6 @@ "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -1294,8 +1889,7 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -1305,6 +1899,19 @@ "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", "dev": true }, + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + }, + "cssstyle": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "requires": { + "cssom": "0.3.x" + } + }, "d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", @@ -1322,6 +1929,28 @@ "assert-plus": "^1.0.0" } }, + "data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, "date-and-time": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-0.10.0.tgz", @@ -1343,8 +1972,7 @@ "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" }, "decompress-response": { "version": "4.2.1", @@ -1362,8 +1990,7 @@ "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, "deepmerge": { "version": "2.2.1", @@ -1382,7 +2009,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, "requires": { "object-keys": "^1.0.12" } @@ -1391,7 +2017,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, "requires": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -1401,7 +2026,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -1410,7 +2034,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -1419,7 +2042,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -1458,6 +2080,11 @@ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=" + }, "diagnostics": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", @@ -1500,15 +2127,27 @@ } } }, + "diff-sequences": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==" + }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, "requires": { "esutils": "^2.0.2" } }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "requires": { + "webidl-conversions": "^4.0.2" + } + }, "dot-prop": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", @@ -1695,7 +2334,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "requires": { "is-arrayish": "^0.2.1" } @@ -1704,7 +2342,6 @@ "version": "1.14.2", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.14.2.tgz", "integrity": "sha512-DgoQmbpFNOofkjJtKwr87Ma5EW4Dc8fWhD0R+ndq7Oc456ivUfGOOP6oAZTTKl5/CcNMP+EN+e3/iUzgE0veZg==", - "dev": true, "requires": { "es-to-primitive": "^1.2.0", "function-bind": "^1.1.1", @@ -1722,7 +2359,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "dev": true, "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -1792,6 +2428,31 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, + "escodegen": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", + "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + } + } + }, "eslint": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.5.1.tgz", @@ -2052,8 +2713,7 @@ "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esquery": { "version": "1.0.1", @@ -2076,14 +2736,12 @@ "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, "etag": { "version": "1.8.1", @@ -2104,6 +2762,11 @@ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" }, + "exec-sh": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==" + }, "execa": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", @@ -2132,11 +2795,15 @@ } } }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" + }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, "requires": { "debug": "^2.3.3", "define-property": "^0.2.5", @@ -2151,7 +2818,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -2160,7 +2826,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -2169,7 +2834,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -2177,8 +2841,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -2187,6 +2850,19 @@ "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" }, + "expect": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", + "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", + "requires": { + "@jest/types": "^24.9.0", + "ansi-styles": "^3.2.0", + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.9.0" + } + }, "express": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", @@ -2314,7 +2990,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -2324,7 +2999,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, "requires": { "is-plain-object": "^2.0.4" } @@ -2346,7 +3020,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, "requires": { "array-unique": "^0.3.2", "define-property": "^1.0.0", @@ -2362,7 +3035,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, "requires": { "is-descriptor": "^1.0.0" } @@ -2371,7 +3043,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -2380,7 +3051,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -2389,7 +3059,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -2398,7 +3067,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -2412,6 +3080,12 @@ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, + "faker": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/faker/-/faker-4.1.0.tgz", + "integrity": "sha1-HkW7vsxndLPBlfrSg1EJxtdIzD8=", + "dev": true + }, "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", @@ -2431,8 +3105,7 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "fast-safe-stringify": { "version": "2.0.7", @@ -2444,6 +3117,14 @@ "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.0.tgz", "integrity": "sha512-R9bHCvweUxxwkDwhjav5vxpFvdPGlVngtqmx4pIZfSUhM/Q4NiIUHB456BAf+Q1Nwu3HEZYONtu+Rya+af4jiQ==" }, + "fb-watchman": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "requires": { + "bser": "^2.0.0" + } + }, "fecha": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", @@ -2471,7 +3152,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -2483,7 +3163,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -2548,8 +3227,7 @@ "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" }, "forever-agent": { "version": "0.6.1", @@ -2566,6 +3244,11 @@ "mime-types": "^2.1.12" } }, + "formidable": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", + "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" + }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -2575,7 +3258,6 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, "requires": { "map-cache": "^0.2.2" } @@ -2617,7 +3299,6 @@ "version": "1.2.9", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", - "dev": true, "optional": true, "requires": { "nan": "^2.12.1", @@ -2627,25 +3308,21 @@ "abbrev": { "version": "1.1.1", "bundled": true, - "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true, "optional": true }, "aproba": { "version": "1.2.0", "bundled": true, - "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.5", "bundled": true, - "dev": true, "optional": true, "requires": { "delegates": "^1.0.0", @@ -2655,13 +3332,11 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, - "dev": true, "optional": true, "requires": { "balanced-match": "^1.0.0", @@ -2671,37 +3346,31 @@ "chownr": { "version": "1.1.1", "bundled": true, - "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, "optional": true }, "core-util-is": { "version": "1.0.2", "bundled": true, - "dev": true, "optional": true }, "debug": { "version": "4.1.1", "bundled": true, - "dev": true, "optional": true, "requires": { "ms": "^2.1.1" @@ -2710,25 +3379,21 @@ "deep-extend": { "version": "0.6.0", "bundled": true, - "dev": true, "optional": true }, "delegates": { "version": "1.0.0", "bundled": true, - "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", "bundled": true, - "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.5", "bundled": true, - "dev": true, "optional": true, "requires": { "minipass": "^2.2.1" @@ -2737,13 +3402,11 @@ "fs.realpath": { "version": "1.0.0", "bundled": true, - "dev": true, "optional": true }, "gauge": { "version": "2.7.4", "bundled": true, - "dev": true, "optional": true, "requires": { "aproba": "^1.0.3", @@ -2759,7 +3422,6 @@ "glob": { "version": "7.1.3", "bundled": true, - "dev": true, "optional": true, "requires": { "fs.realpath": "^1.0.0", @@ -2773,13 +3435,11 @@ "has-unicode": { "version": "2.0.1", "bundled": true, - "dev": true, "optional": true }, "iconv-lite": { "version": "0.4.24", "bundled": true, - "dev": true, "optional": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" @@ -2788,7 +3448,6 @@ "ignore-walk": { "version": "3.0.1", "bundled": true, - "dev": true, "optional": true, "requires": { "minimatch": "^3.0.4" @@ -2797,7 +3456,6 @@ "inflight": { "version": "1.0.6", "bundled": true, - "dev": true, "optional": true, "requires": { "once": "^1.3.0", @@ -2807,19 +3465,16 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, "optional": true }, "ini": { "version": "1.3.5", "bundled": true, - "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, - "dev": true, "optional": true, "requires": { "number-is-nan": "^1.0.0" @@ -2828,13 +3483,11 @@ "isarray": { "version": "1.0.0", "bundled": true, - "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", "bundled": true, - "dev": true, "optional": true, "requires": { "brace-expansion": "^1.1.7" @@ -2843,13 +3496,11 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, - "dev": true, "optional": true, "requires": { "safe-buffer": "^5.1.2", @@ -2859,7 +3510,6 @@ "minizlib": { "version": "1.2.1", "bundled": true, - "dev": true, "optional": true, "requires": { "minipass": "^2.2.1" @@ -2868,7 +3518,6 @@ "mkdirp": { "version": "0.5.1", "bundled": true, - "dev": true, "optional": true, "requires": { "minimist": "0.0.8" @@ -2877,13 +3526,11 @@ "ms": { "version": "2.1.1", "bundled": true, - "dev": true, "optional": true }, "needle": { "version": "2.3.0", "bundled": true, - "dev": true, "optional": true, "requires": { "debug": "^4.1.0", @@ -2894,7 +3541,6 @@ "node-pre-gyp": { "version": "0.12.0", "bundled": true, - "dev": true, "optional": true, "requires": { "detect-libc": "^1.0.2", @@ -2912,7 +3558,6 @@ "nopt": { "version": "4.0.1", "bundled": true, - "dev": true, "optional": true, "requires": { "abbrev": "1", @@ -2922,13 +3567,11 @@ "npm-bundled": { "version": "1.0.6", "bundled": true, - "dev": true, "optional": true }, "npm-packlist": { "version": "1.4.1", "bundled": true, - "dev": true, "optional": true, "requires": { "ignore-walk": "^3.0.1", @@ -2938,7 +3581,6 @@ "npmlog": { "version": "4.1.2", "bundled": true, - "dev": true, "optional": true, "requires": { "are-we-there-yet": "~1.1.2", @@ -2950,19 +3592,16 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, "optional": true }, "object-assign": { "version": "4.1.1", "bundled": true, - "dev": true, "optional": true }, "once": { "version": "1.4.0", "bundled": true, - "dev": true, "optional": true, "requires": { "wrappy": "1" @@ -2971,19 +3610,16 @@ "os-homedir": { "version": "1.0.2", "bundled": true, - "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", "bundled": true, - "dev": true, "optional": true }, "osenv": { "version": "0.1.5", "bundled": true, - "dev": true, "optional": true, "requires": { "os-homedir": "^1.0.0", @@ -2993,19 +3629,16 @@ "path-is-absolute": { "version": "1.0.1", "bundled": true, - "dev": true, "optional": true }, "process-nextick-args": { "version": "2.0.0", "bundled": true, - "dev": true, "optional": true }, "rc": { "version": "1.2.8", "bundled": true, - "dev": true, "optional": true, "requires": { "deep-extend": "^0.6.0", @@ -3017,7 +3650,6 @@ "minimist": { "version": "1.2.0", "bundled": true, - "dev": true, "optional": true } } @@ -3025,7 +3657,6 @@ "readable-stream": { "version": "2.3.6", "bundled": true, - "dev": true, "optional": true, "requires": { "core-util-is": "~1.0.0", @@ -3040,7 +3671,6 @@ "rimraf": { "version": "2.6.3", "bundled": true, - "dev": true, "optional": true, "requires": { "glob": "^7.1.3" @@ -3049,43 +3679,36 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true, "optional": true }, "safer-buffer": { "version": "2.1.2", "bundled": true, - "dev": true, "optional": true }, "sax": { "version": "1.2.4", "bundled": true, - "dev": true, "optional": true }, "semver": { "version": "5.7.0", "bundled": true, - "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", "bundled": true, - "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", "bundled": true, - "dev": true, "optional": true }, "string-width": { "version": "1.0.2", "bundled": true, - "dev": true, "optional": true, "requires": { "code-point-at": "^1.0.0", @@ -3096,7 +3719,6 @@ "string_decoder": { "version": "1.1.1", "bundled": true, - "dev": true, "optional": true, "requires": { "safe-buffer": "~5.1.0" @@ -3105,7 +3727,6 @@ "strip-ansi": { "version": "3.0.1", "bundled": true, - "dev": true, "optional": true, "requires": { "ansi-regex": "^2.0.0" @@ -3114,13 +3735,11 @@ "strip-json-comments": { "version": "2.0.1", "bundled": true, - "dev": true, "optional": true }, "tar": { "version": "4.4.8", "bundled": true, - "dev": true, "optional": true, "requires": { "chownr": "^1.1.1", @@ -3135,13 +3754,11 @@ "util-deprecate": { "version": "1.0.2", "bundled": true, - "dev": true, "optional": true }, "wide-align": { "version": "1.1.3", "bundled": true, - "dev": true, "optional": true, "requires": { "string-width": "^1.0.2 || 2" @@ -3150,13 +3767,11 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true, "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true, "optional": true } } @@ -3164,8 +3779,7 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "functional-red-black-tree": { "version": "1.0.1", @@ -3355,8 +3969,7 @@ "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" }, "getpass": { "version": "0.1.7", @@ -3405,8 +4018,7 @@ "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "google-auth-library": { "version": "5.5.1", @@ -3470,6 +4082,11 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" + }, "gtoken": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-4.1.0.tgz", @@ -3488,6 +4105,24 @@ } } }, + "handlebars": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.3.tgz", + "integrity": "sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==", + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -3506,7 +4141,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -3539,8 +4173,7 @@ "has-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" }, "has-unicode": { "version": "2.0.1", @@ -3551,7 +4184,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, "requires": { "get-value": "^2.0.6", "has-values": "^1.0.0", @@ -3562,7 +4194,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, "requires": { "is-number": "^3.0.0", "kind-of": "^4.0.0" @@ -3572,7 +4203,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -3601,8 +4231,15 @@ "hosted-git-info": { "version": "2.8.4", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", - "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", - "dev": true + "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==" + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "requires": { + "whatwg-encoding": "^1.0.1" + } }, "http-errors": { "version": "1.7.2", @@ -3862,6 +4499,63 @@ "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", "dev": true }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "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==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } + } + } + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -3917,6 +4611,14 @@ "through": "^2.3.6" } }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, "ioredis": { "version": "4.14.1", "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-4.14.1.tgz", @@ -3942,7 +4644,6 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -3951,7 +4652,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -3961,8 +4661,7 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, "is-binary-path": { "version": "1.0.1", @@ -3981,14 +4680,12 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-callable": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", - "dev": true + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" }, "is-ci": { "version": "1.2.1", @@ -4003,7 +4700,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -4012,7 +4708,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -4022,14 +4717,12 @@ "is-date-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", @@ -4039,8 +4732,7 @@ "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" } } }, @@ -4053,8 +4745,7 @@ "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" }, "is-extglob": { "version": "2.1.1", @@ -4067,6 +4758,11 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" + }, "is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", @@ -4096,7 +4792,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -4105,7 +4800,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -4131,7 +4825,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, "requires": { "isobject": "^3.0.1" } @@ -4156,7 +4849,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, "requires": { "has": "^1.0.1" } @@ -4172,47 +4864,624 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "dev": true, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==" + }, + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "requires": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + } + }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "istanbul-reports": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", + "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "requires": { + "handlebars": "^4.1.2" + } + }, + "jest": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", + "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", + "requires": { + "import-local": "^2.0.0", + "jest-cli": "^24.9.0" + }, + "dependencies": { + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "requires": { + "ci-info": "^2.0.0" + } + }, + "jest-cli": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", + "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", + "requires": { + "@jest/core": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "import-local": "^2.0.0", + "is-ci": "^2.0.0", + "jest-config": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "prompts": "^2.0.1", + "realpath-native": "^1.1.0", + "yargs": "^13.3.0" + } + } + } + }, + "jest-changed-files": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", + "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", + "requires": { + "@jest/types": "^24.9.0", + "execa": "^1.0.0", + "throat": "^4.0.0" + }, + "dependencies": { + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.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" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + } + } + }, + "jest-config": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", + "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^24.9.0", + "@jest/types": "^24.9.0", + "babel-jest": "^24.9.0", + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^24.9.0", + "jest-environment-node": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-jasmine2": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "micromatch": "^3.1.10", + "pretty-format": "^24.9.0", + "realpath-native": "^1.1.0" + } + }, + "jest-diff": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "requires": { + "chalk": "^2.0.1", + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-docblock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", + "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", + "requires": { + "detect-newline": "^2.1.0" + } + }, + "jest-each": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", + "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", + "requires": { + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "jest-get-type": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-environment-jsdom": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", + "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", + "requires": { + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0", + "jsdom": "^11.5.1" + } + }, + "jest-environment-node": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", + "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", + "requires": { + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0" + } + }, + "jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==" + }, + "jest-haste-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", + "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", + "requires": { + "@jest/types": "^24.9.0", + "anymatch": "^2.0.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.7", + "graceful-fs": "^4.1.15", + "invariant": "^2.2.4", + "jest-serializer": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.9.0", + "micromatch": "^3.1.10", + "sane": "^4.0.3", + "walker": "^1.0.7" + } + }, + "jest-jasmine2": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", + "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^24.9.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0", + "throat": "^4.0.0" + } + }, + "jest-leak-detector": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", + "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", + "requires": { + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-matcher-utils": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", + "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-message-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + }, + "dependencies": { + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + } + } + }, + "jest-mock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "requires": { + "@jest/types": "^24.9.0" + } + }, + "jest-pnp-resolver": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", + "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==" + }, + "jest-regex-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", + "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==" + }, + "jest-resolve": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", + "requires": { + "@jest/types": "^24.9.0", + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" + } + }, + "jest-resolve-dependencies": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", + "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", + "requires": { + "@jest/types": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-snapshot": "^24.9.0" + } + }, + "jest-runner": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", + "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", + "requires": { + "@jest/console": "^24.7.1", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.4.2", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-config": "^24.9.0", + "jest-docblock": "^24.3.0", + "jest-haste-map": "^24.9.0", + "jest-jasmine2": "^24.9.0", + "jest-leak-detector": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.6.0", + "source-map-support": "^0.5.6", + "throat": "^4.0.0" + } + }, + "jest-runtime": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", + "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", + "requires": { + "@jest/console": "^24.7.1", + "@jest/environment": "^24.9.0", + "@jest/source-map": "^24.3.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "strip-bom": "^3.0.0", + "yargs": "^13.3.0" + }, + "dependencies": { + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + } + } + }, + "jest-serializer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==" + }, + "jest-snapshot": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", + "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "expect": "^24.9.0", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^24.9.0", + "semver": "^6.2.0" + } + }, + "jest-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "requires": { + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "requires": { + "ci-info": "^2.0.0" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "jest-validate": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", + "requires": { + "@jest/types": "^24.9.0", + "camelcase": "^5.3.1", + "chalk": "^2.0.1", + "jest-get-type": "^24.9.0", + "leven": "^3.1.0", + "pretty-format": "^24.9.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + } + } + }, + "jest-watcher": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", + "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", "requires": { - "has-symbols": "^1.0.0" + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "jest-util": "^24.9.0", + "string-length": "^2.0.0" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } }, "js-beautify": { "version": "1.10.2", @@ -4240,14 +5509,12 @@ "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -4258,6 +5525,59 @@ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, + "jsdom": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "requires": { + "abab": "^2.0.0", + "acorn": "^5.5.3", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": "^1.0.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.1", + "escodegen": "^1.9.1", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.3.0", + "nwsapi": "^2.0.7", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.4", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^5.2.0", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, "json-bigint": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-0.3.0.tgz", @@ -4269,14 +5589,23 @@ "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, + "json-schema-ref-parser": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-7.1.2.tgz", + "integrity": "sha512-bi2Nns2UqdX7wThX5qSHd+lOxlu9oeJvlCnWGuR3qS4Ex4UZtuwygkyq/43J31GuNGX8xBHeV6zjQztYk/G5VA==", + "requires": { + "call-me-maybe": "^1.0.1", + "js-yaml": "^3.13.1", + "ono": "^5.1.0" + } + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -4293,6 +5622,21 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, + "json5": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", + "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", + "requires": { + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -4363,8 +5707,12 @@ "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" }, "kuler": { "version": "1.0.1", @@ -4383,11 +5731,20 @@ "package-json": "^4.0.0" } }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==" + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, "requires": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" @@ -4436,6 +5793,11 @@ "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, "lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", @@ -4446,6 +5808,11 @@ "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + }, "lodash.isinteger": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", @@ -4471,6 +5838,11 @@ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + }, "logform": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/logform/-/logform-2.1.2.tgz", @@ -4488,6 +5860,14 @@ "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -4528,17 +5908,23 @@ } } }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "requires": { + "tmpl": "1.0.x" + } + }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, "requires": { "object-visit": "^1.0.0" } @@ -4568,6 +5954,11 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -4577,7 +5968,6 @@ "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -4664,7 +6054,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" @@ -4674,7 +6063,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, "requires": { "is-plain-object": "^2.0.4" } @@ -4866,7 +6254,6 @@ "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -4889,8 +6276,7 @@ "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" }, "needle": { "version": "2.4.0", @@ -4917,6 +6303,11 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" + }, "next-tick": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", @@ -4925,8 +6316,7 @@ "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "node-abi": { "version": "2.12.0", @@ -4953,6 +6343,35 @@ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.1.tgz", "integrity": "sha512-G6RlQt5Sb4GMBzXvhfkeFmbqR6MzhtnT7VTHuLadjkii3rdYHNdw0m8zA4BTxVIh68FicCQ2NSUANpsqkr9jvQ==" }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" + }, + "node-notifier": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", + "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", + "requires": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, "node-pre-gyp": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz", @@ -5039,7 +6458,6 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, "requires": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -5050,8 +6468,7 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -5084,7 +6501,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, "requires": { "path-key": "^2.0.0" } @@ -5105,6 +6521,11 @@ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" + }, "oauth": { "version": "0.9.15", "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", @@ -5129,7 +6550,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, "requires": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", @@ -5140,7 +6560,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -5149,7 +6568,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -5159,29 +6577,34 @@ "object-inspect": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", - "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", - "dev": true + "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==" }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, "requires": { "isobject": "^3.0.0" } }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, "requires": { "isobject": "^3.0.1" } @@ -5233,17 +6656,47 @@ "mimic-fn": "^1.0.0" } }, + "ono": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ono/-/ono-5.1.0.tgz", + "integrity": "sha512-GgqRIUWErLX4l9Up0khRtbrlH8Fyj59A0nKv8V6pWEto38aUgnOGOOF7UmgFFLzFnDSc8REzaTXOc0hqEe7yIw==" + }, + "openapi-schemas": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/openapi-schemas/-/openapi-schemas-1.0.3.tgz", + "integrity": "sha512-KtMWcK2VtOS+nD8RKSIyScJsj8JrmVWcIX7Kjx4xEHijFYuvMTDON8WfeKOgeSb4uNG6UsqLj5Na7nKbSav9RQ==" + }, + "openapi-types": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-1.3.5.tgz", + "integrity": "sha512-11oi4zYorsgvg5yBarZplAqbpev5HkuVNPlZaPTknPDzAynq+lnJdXAmruGWP0s+dNYZS7bjM+xrTpJw7184Fg==" + }, "opencollective-postinstall": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==", "dev": true }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + } + } + }, "optionator": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, "requires": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.4", @@ -5272,11 +6725,18 @@ "os-tmpdir": "^1.0.0" } }, + "p-each-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", + "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", + "requires": { + "p-reduce": "^1.0.0" + } + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, "p-limit": { "version": "1.3.0", @@ -5296,6 +6756,11 @@ "p-limit": "^1.1.0" } }, + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=" + }, "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", @@ -5340,6 +6805,11 @@ "error-ex": "^1.2.0" } }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" + }, "parseqs": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", @@ -5364,8 +6834,7 @@ "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" }, "passport": { "version": "0.4.0", @@ -5450,8 +6919,7 @@ "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, "path-parse": { "version": "1.0.6", @@ -5488,6 +6956,14 @@ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, "pkg-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", @@ -5506,11 +6982,15 @@ "semver-compare": "^1.0.0" } }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" + }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, "prebuild-install": { "version": "5.3.3", @@ -5544,8 +7024,7 @@ "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, "prepend-http": { "version": "1.0.4", @@ -5553,6 +7032,11 @@ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", "dev": true }, + "prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==" + }, "prettier-linter-helpers": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", @@ -5562,6 +7046,24 @@ "fast-diff": "^1.1.2" } }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + } + } + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -5573,6 +7075,15 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, + "prompts": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.0.tgz", + "integrity": "sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg==", + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.3" + } + }, "proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -5713,6 +7224,11 @@ } } }, + "react-is": { + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", + "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" + }, "read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", @@ -5759,6 +7275,14 @@ "readable-stream": "^2.0.2" } }, + "realpath-native": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", + "requires": { + "util.promisify": "^1.0.0" + } + }, "redis": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz", @@ -5786,6 +7310,11 @@ "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=" }, + "redis-mock": { + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/redis-mock/-/redis-mock-0.47.0.tgz", + "integrity": "sha512-Kbyy7xB+Sj+fPZlwtJGIVus8QfPDFxXi1d2YJ0XXxKEIPN8ciSUFt45uw8G/gGfNm+BsT3bcvBp7D+7du7s/9Q==" + }, "redis-parser": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", @@ -5803,7 +7332,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, "requires": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" @@ -5842,20 +7370,17 @@ "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, "request": { "version": "2.88.0", @@ -5901,6 +7426,24 @@ } } }, + "request-promise-core": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", + "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", + "requires": { + "lodash": "^4.17.15" + } + }, + "request-promise-native": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", + "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", + "requires": { + "request-promise-core": "1.1.3", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -5940,6 +7483,21 @@ "path-parse": "^1.0.6" } }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } + } + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -5949,8 +7507,7 @@ "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" }, "restore-cursor": { "version": "2.0.0", @@ -5965,8 +7522,7 @@ "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, "retry-as-promised": { "version": "3.2.0", @@ -5993,6 +7549,11 @@ "glob": "^7.1.3" } }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" + }, "run-async": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", @@ -6026,16 +7587,60 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, "requires": { "ret": "~0.1.10" } }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "dependencies": { + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.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" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -6178,7 +7783,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -6190,7 +7794,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -6276,7 +7879,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, "requires": { "shebang-regex": "^1.0.0" } @@ -6284,8 +7886,12 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" }, "shimmer": { "version": "1.2.1", @@ -6337,6 +7943,11 @@ } } }, + "sisteransi": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.4.tgz", + "integrity": "sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig==" + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6368,7 +7979,6 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, "requires": { "base": "^0.11.1", "debug": "^2.2.0", @@ -6384,7 +7994,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -6393,7 +8002,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -6402,7 +8010,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -6410,8 +8017,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -6419,7 +8025,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, "requires": { "define-property": "^1.0.0", "isobject": "^3.0.0", @@ -6430,7 +8035,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, "requires": { "is-descriptor": "^1.0.0" } @@ -6439,7 +8043,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -6448,7 +8051,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -6457,7 +8059,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -6470,7 +8071,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, "requires": { "kind-of": "^3.2.0" }, @@ -6479,7 +8079,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -6614,14 +8213,12 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, "source-map-resolve": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, "requires": { "atob": "^2.1.1", "decode-uri-component": "^0.2.0", @@ -6630,17 +8227,31 @@ "urix": "^0.1.0" } }, + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, "source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" }, "spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -6649,14 +8260,12 @@ "spdx-exceptions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" }, "spdx-expression-parse": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -6665,14 +8274,12 @@ "spdx-license-ids": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, "requires": { "extend-shallow": "^3.0.0" } @@ -6680,8 +8287,7 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "sqlstring": { "version": "2.3.1", @@ -6709,6 +8315,11 @@ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" }, + "stack-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==" + }, "standard-as-callback": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.0.1.tgz", @@ -6718,7 +8329,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, "requires": { "define-property": "^0.2.5", "object-copy": "^0.1.0" @@ -6728,7 +8338,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -6740,6 +8349,11 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" + }, "stream-events": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", @@ -6758,6 +8372,25 @@ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" }, + "string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -6781,7 +8414,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", - "dev": true, "requires": { "define-properties": "^1.1.3", "function-bind": "^1.1.1" @@ -6791,7 +8423,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", - "dev": true, "requires": { "define-properties": "^1.1.3", "function-bind": "^1.1.1" @@ -6823,14 +8454,12 @@ "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "strip-json-comments": { "version": "3.0.1", @@ -6851,6 +8480,42 @@ "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=" }, + "superagent": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", + "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", + "requires": { + "component-emitter": "^1.2.0", + "cookiejar": "^2.1.0", + "debug": "^3.1.0", + "extend": "^3.0.0", + "form-data": "^2.3.1", + "formidable": "^1.2.0", + "methods": "^1.1.1", + "mime": "^1.4.1", + "qs": "^6.5.1", + "readable-stream": "^2.3.5" + }, + "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" + } + } + } + }, + "supertest": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-4.0.2.tgz", + "integrity": "sha512-1BAbvrOZsGA3YTCWqbmh14L0YEq0EGICX/nBnfkfVJn7SrxQV1I3pMYjSzG9y/7ZU2V9dWqyqk2POwxlb09duQ==", + "requires": { + "methods": "^1.1.2", + "superagent": "^3.8.3" + } + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -6859,6 +8524,62 @@ "has-flag": "^3.0.0" } }, + "swagger-jsdoc": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/swagger-jsdoc/-/swagger-jsdoc-3.4.0.tgz", + "integrity": "sha512-lS3dpULpwQ5TSfPF9d9nxyXicTjJMgBGu74g/GQ0r247QMVsgqa6cL9sJ0NtK2IGxzG3HozBcXKv7qo+ns+hqg==", + "requires": { + "commander": "2.20.0", + "doctrine": "3.0.0", + "glob": "7.1.4", + "js-yaml": "3.13.1", + "swagger-parser": "8.0.0" + }, + "dependencies": { + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==" + } + } + }, + "swagger-methods": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/swagger-methods/-/swagger-methods-2.0.2.tgz", + "integrity": "sha512-/RNqvBZkH8+3S/FqBPejHxJxZenaYq3MrpeXnzi06aDIS39Mqf5YCUNb/ZBjsvFFt8h9FxfKs8EXPtcYdfLiRg==" + }, + "swagger-parser": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-8.0.0.tgz", + "integrity": "sha512-zk6ig8J2B4OqCnBSIqO67/Ui96NTjuoX10YGa4YVlIlQzLpHUZbLFZaO+zSubQoqAiJxmpvlbUplEcFIsPCESA==", + "requires": { + "call-me-maybe": "^1.0.1", + "json-schema-ref-parser": "^7.1.0", + "ono": "^5.0.1", + "openapi-schemas": "^1.0.0", + "openapi-types": "^1.3.5", + "swagger-methods": "^2.0.0", + "z-schema": "^4.1.0" + } + }, + "swagger-ui-dist": { + "version": "3.24.3", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-3.24.3.tgz", + "integrity": "sha512-kB8qobP42Xazaym7sD9g5mZuRL4416VIIYZMqPEIskkzKqbPLQGEiHA3ga31bdzyzFLgr6Z797+6X1Am6zYpbg==" + }, + "swagger-ui-express": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-4.1.2.tgz", + "integrity": "sha512-bVT16qj6WdNlEKFkSLOoTeGuqEm2lfOFRq6mVHAx+viA/ikORE+n4CS3WpVcYmQzM4HE6+DUFgAWcMRBJNpjcw==", + "requires": { + "swagger-ui-dist": "^3.18.1" + } + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, "table": { "version": "5.4.6", "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", @@ -6961,6 +8682,109 @@ "execa": "^0.7.0" } }, + "test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "requires": { + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "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==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + } + } + }, "text-hex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", @@ -6972,6 +8796,11 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=" + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -7010,16 +8839,25 @@ "os-tmpdir": "~1.0.2" } }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" + }, "to-array": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -7028,7 +8866,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -7039,7 +8876,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, "requires": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", @@ -7051,7 +8887,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, "requires": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" @@ -7092,6 +8927,14 @@ } } }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "requires": { + "punycode": "^2.1.0" + } + }, "triple-beam": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", @@ -7125,7 +8968,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, "requires": { "prelude-ls": "~1.1.2" } @@ -7158,6 +9000,30 @@ "is-typedarray": "^1.0.0" } }, + "uglify-js": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.0.tgz", + "integrity": "sha512-PC/ee458NEMITe1OufAjal65i6lB58R1HWMRcxwvdz1UopW0DYqlRL3xdu3IcTvTXsB02CRHykidkTRL+A3hQA==", + "optional": true, + "requires": { + "commander": "~2.20.3", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "optional": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + } + } + }, "uid-safe": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", @@ -7210,7 +9076,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", @@ -7241,7 +9106,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, "requires": { "has-value": "^0.3.1", "isobject": "^3.0.0" @@ -7251,7 +9115,6 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, "requires": { "get-value": "^2.0.3", "has-values": "^0.1.4", @@ -7262,7 +9125,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, "requires": { "isarray": "1.0.0" } @@ -7272,8 +9134,7 @@ "has-values": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" } } }, @@ -7318,8 +9179,7 @@ "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" }, "url-parse-lax": { "version": "1.0.0", @@ -7333,14 +9193,22 @@ "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -7361,7 +9229,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -7387,11 +9254,54 @@ "extsprintf": "^1.2.0" } }, + "w3c-hr-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "requires": { + "browser-process-hrtime": "^0.1.2" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "requires": { + "makeerror": "1.0.x" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + }, + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, "requires": { "isexe": "^2.0.0" } @@ -7480,8 +9390,7 @@ "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" }, "wrap-ansi": { "version": "5.1.0", @@ -7544,6 +9453,11 @@ "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", "dev": true }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + }, "xmlhttprequest-ssl": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", @@ -7651,6 +9565,24 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" + }, + "z-schema": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-4.2.2.tgz", + "integrity": "sha512-7bGR7LohxSdlK1EOdvA/OHksvKGE4jTLSjd8dBj9YKT0S43N9pdMZ0Z7GZt9mHrBFhbNTRh3Ky6Eu2MHsPJe8g==", + "requires": { + "commander": "^2.7.1", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^11.0.0" + }, + "dependencies": { + "validator": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-11.1.0.tgz", + "integrity": "sha512-qiQ5ktdO7CD6C/5/mYV4jku/7qnqzjrxb3C/Q5wR3vGGinHTgJZN/TdFT3ZX4vXhX2R1PXx42fB1cn5W+uJ4lg==" + } + } } } } diff --git a/package.json b/package.json index c2b3d4e..65cba0f 100644 --- a/package.json +++ b/package.json @@ -4,15 +4,18 @@ "description": "", "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", "dev": "nodemon -r dotenv/config index.js", "history": "node -r dotenv/config ./extra_task/articlesHistory.js", - "lint": "eslint ." + "lint": "eslint .", + "migrations": "npx sequelize-cli db:migrate", + "test": "jest --runInBand --forceExit --coverage --verbose false", + "test:watch": "jest --watch" }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { + "@types/jest": "^24.0.23", "eslint": "^6.5.1", "eslint-config-standart": "^0.2.0", "eslint-plugin-import": "^2.18.2", @@ -20,6 +23,7 @@ "eslint-plugin-prettier": "^3.1.1", "eslint-plugin-promise": "^4.2.1", "eslint-plugin-standard": "^4.0.1", + "faker": "^4.1.0", "husky": "^3.0.8", "nodemon": "^1.19.3" }, @@ -37,6 +41,7 @@ "express-session": "^1.17.0", "express-validator": "^6.2.0", "ioredis": "^4.14.1", + "jest": "^24.9.0", "jsonwebtoken": "^8.5.1", "mongoose": "^5.7.5", "multer": "^1.4.2", @@ -46,14 +51,19 @@ "passport-google-oauth20": "^2.0.0", "passport-local": "^1.0.0", "passport.socketio": "^3.7.0", + "prettier": "^1.19.1", "rate-limit-redis": "^1.6.0", "rate-limiter-flexible": "^1.1.6", + "redis-mock": "^0.47.0", "sequelize": "^5.19.5", "sequelize-cli": "^5.5.1", "sharp": "^0.23.2", "socket.io": "^2.3.0", "socket.io-redis": "^5.2.0", "stripe": "^7.13.0", + "supertest": "^4.0.2", + "swagger-jsdoc": "^3.4.0", + "swagger-ui-express": "^4.1.2", "winston": "^3.2.1", "winston-mongodb": "^5.0.0" }, diff --git a/routes/auth.js b/routes/auth.js index 7f3ecdb..57c6140 100644 --- a/routes/auth.js +++ b/routes/auth.js @@ -1,5 +1,6 @@ /* POST /api/v1/registration + POST /api/v1/registration/verify POST /api/v1/login POST /api/v1/logout */ @@ -14,7 +15,7 @@ const { Users } = require('../db/models/index.js') require('../services/passportService')(passport) const { logOut, getFormattedUrl } = require('../services/helpers') const { userCreationValidation, loginValidation } = require('../services/validationService') -const { sgMail } = require('../services/emailService') +const { SendgridService } = require('../services/emailService') const emailTemplates = require('../db/constant') router.post( @@ -24,7 +25,7 @@ router.post( const userData = await Users.findOne({ where: { email: req.body.email } }) if (userData) { res.status(500) - res.send('{ error: "User with this email already exist" }').end() + res.send('{ error: "User with this email already exist"}').end() } else { const userItem = { firstName: req.body.firstName, @@ -34,17 +35,12 @@ router.post( } const newUser = await Users.create(userItem) const createdUser = newUser.get({ plain: true }) - jwt.sign({ uid: createdUser.id }, 'secretkey', { expiresIn: '1h' }, (err, token) => { + jwt.sign({ uid: createdUser.id }, 'secretkey', { expiresIn: '1h' }, async (err, token) => { if (err) return res.status(403).send({ error: err }) const verifyLink = `${getFormattedUrl(req)}/verify?token=${token}` - sgMail.send({ - to: createdUser.email, - from: 'internship@zazmic.com', - template_id: emailTemplates.accountVerificationTemplate, - dynamic_template_data: { - verifyLink: verifyLink, - name: createdUser.firstName - } + await SendgridService.sendEmail(createdUser.email, 'internship@zazmic.com', emailTemplates.accountVerificationTemplate, { + verifyLink: verifyLink, + name: createdUser.firstName }) res.send({ data: newUser }) }) diff --git a/routes/blogs.js b/routes/blogs.js index a0c7dcb..34b6f5d 100644 --- a/routes/blogs.js +++ b/routes/blogs.js @@ -123,18 +123,14 @@ router.delete( authCheck, asyncHandler(async (req, res) => { req.body.id = req.params.id - const commentData = await Comments.findByPk(req.params.id) - if (commentData) { - const result = await commentData.destroy() - const deletedComment = result.get({ plain: true }) - if (deletedComment) { - // sockets - const io = req.app.get('socketio') - io.to(`room-${req.params.articleId}`).emit('comment', { action: 'destroy', data: { deletedComment } }) - return res.sendStatus(200) - } + const comment = await Comments.findByPk(req.params.id) + if (comment) { + await comment.destroy() + const io = req.app.get('socketio') + io.to(`room-${req.params.articleId}`).emit('comment', { action: 'destroy', data: { comment } }) + return res.sendStatus(200) } - res.sendStatus(500) + res.sendStatus(404) }) ) diff --git a/services/emailService.js b/services/emailService.js index 417c089..8e147d0 100644 --- a/services/emailService.js +++ b/services/emailService.js @@ -1,4 +1,15 @@ const sgMail = require('@sendgrid/mail') sgMail.setApiKey(process.env.SENDGRID_API_KEY) -module.exports = { sgMail } +class SendgridService { + static async sendEmail(to, from, templateId = '', dynamicData = {}) { + await sgMail.send({ + to, + from, + template_id: templateId, + dynamic_template_data: dynamicData + }) + } +} + +module.exports = { sgMail, SendgridService } diff --git a/services/passportService.js b/services/passportService.js index d00cabd..2cc06d7 100644 --- a/services/passportService.js +++ b/services/passportService.js @@ -61,6 +61,7 @@ module.exports = passport => { ) passport.use( + 'facebook-strategy', new FacebookStrategy( { clientID: process.env.FACEBOOK_CLIENT_ID, diff --git a/services/queryHelperService.js b/services/queryHelperService.js index 90168aa..0f31997 100644 --- a/services/queryHelperService.js +++ b/services/queryHelperService.js @@ -5,13 +5,16 @@ const getArticles = async (after, authorId) => { let whereObj = {} if (after) { const [timestamp, id] = after.split('_') - whereObj = { id: { [Op.lte]: +id }, publishedAt: { [Op.lt]: timestamp } } + whereObj = { id: { [Op.gt]: +id }, publishedAt: { [Op.lte]: timestamp } } } if (authorId) whereObj.authorId = authorId return await Articles.findAll({ where: whereObj, limit: 5, - order: [['publishedAt', 'DESC'], ['id', 'ASC']], + order: [ + ['publishedAt', 'DESC'], + ['id', 'ASC'] + ], include: [{ model: Users, as: 'author' }] }) } diff --git a/tests/.env b/tests/.env new file mode 100644 index 0000000..6fca261 --- /dev/null +++ b/tests/.env @@ -0,0 +1,8 @@ +FRONTEND_URL=https://test.com + +DATABASE_URL=mysql://user:password@localhost:3306/database +CONNECTION_STR=mongodb://user:password@localhost:27017/database + +BUCKET_NAME=test +SESSION_SECRET=test +EMAIL_SECRET=test \ No newline at end of file diff --git a/tests/auth/logout.test.js b/tests/auth/logout.test.js new file mode 100644 index 0000000..4c10f7d --- /dev/null +++ b/tests/auth/logout.test.js @@ -0,0 +1,25 @@ +/* eslint-disable */ +const supertest = require('supertest') +const app = require('../../index') +const { sgMail } = require('../../services/emailService') +const helperService = require('../../services/helpers') +const { registerUser } = require('../helpers') + +const request = supertest(app) + +// try test +describe('it should test user logout', () => { + let user + + beforeAll(async () => { + user = await registerUser() + }) + it('should log out user', async () => { + const logOutSpy = jest.spyOn(helperService, 'logOut') + await request + .post('/api/v1/logout') + .set('Cookie', user.authCookie) + .send() + .expect(200) + }) +}) diff --git a/tests/clearDatabase.js b/tests/clearDatabase.js new file mode 100644 index 0000000..f87a5be --- /dev/null +++ b/tests/clearDatabase.js @@ -0,0 +1,14 @@ +const { Articles, Users } = require('../db/models/index') +const mongoose = require('../mongodb/mongoConnection') +const ArticlesViews = require('../mongodb/models/ArticlesViews') + +module.exports = async () => { + for (const model of [Articles, Users]) { + await model.destroy({ + where: {}, + truncate: { cascade: true } + }) + } + await mongoose.connect() + await ArticlesViews.deleteMany({}).exec() +} diff --git a/tests/helpers.js b/tests/helpers.js new file mode 100644 index 0000000..3f5a348 --- /dev/null +++ b/tests/helpers.js @@ -0,0 +1,27 @@ +/* eslint-disable */ +const faker = require('faker') +const supertest = require('supertest') +const app = require('../index') +const { SendgridService } = require('../services/emailService') +const request = supertest(app) + +module.exports = { + registerUser: async () => { + const firstName = faker.name.firstName() + const lastName = faker.name.lastName() + const email = faker.internet.email() + const password = faker.internet.password() + const sendEmailSpy = jest.spyOn(SendgridService, 'sendEmail').mockImplementation() + + await request.post('/api/v1/registration').send({ firstName, lastName, email, password }) + const { verifyLink } = sendEmailSpy.mock.calls[0][3] + const token = verifyLink.split('token=').pop() + const response = await request.post('/api/v1/registration/verify').send({ token }) + + sendEmailSpy.mockReset() + const user = response.body.data + user.authCookie = response.headers['set-cookie'][0].split(';').shift() + + return user + } +} diff --git a/tests/setup.js b/tests/setup.js new file mode 100644 index 0000000..889cc69 --- /dev/null +++ b/tests/setup.js @@ -0,0 +1,9 @@ +require('dotenv').config({ path: process.cwd() + '/tests/.env' }) + +const clearDatabase = require('./clearDatabase') +const sequelize = require('../db/dbConnection') + +module.exports = async () => { + await sequelize.sync() + await clearDatabase() +}