diff --git a/backend/managers/contract.js b/backend/managers/contract.js index 976c63a..4a1c62a 100644 --- a/backend/managers/contract.js +++ b/backend/managers/contract.js @@ -63,14 +63,16 @@ const update = (inputContract, modification) => { const updatedContract = create(modifiedContract); - inputContract.rents - .filter(rent => _isPayment(rent) || rent.discounts.some(discount => discount.origin === 'settlement')) - .forEach(paidRent => { - payTerm(updatedContract, moment(String(paidRent.term), 'YYYYMMDDHH').format('DD/MM/YYYY HH:mm'), { - payments: paidRent.payments, - discounts: paidRent.discounts.filter(discount => discount.origin === 'settlement') + if (inputContract.rents) { + inputContract.rents + .filter(rent => _isPayment(rent) || rent.discounts.some(discount => discount.origin === 'settlement')) + .forEach(paidRent => { + payTerm(updatedContract, moment(String(paidRent.term), 'YYYYMMDDHH').format('DD/MM/YYYY HH:mm'), { + payments: paidRent.payments, + discounts: paidRent.discounts.filter(discount => discount.origin === 'settlement') + }); }); - }); + } return updatedContract; }; @@ -90,6 +92,9 @@ const terminate = (inputContract, termination) => { }; const payTerm = (contract, term, settlements) => { + if (!contract.rents || !contract.rents.length) { + throw Error('cannot pay term, the rents were not generated'); + } const current = moment(term, 'DD/MM/YYYY HH:mm'); const momentBegin = moment(contract.begin, 'DD/MM/YYYY HH:mm'); const momentEnd = moment(contract.termination || contract.end, 'DD/MM/YYYY HH:mm'); @@ -122,8 +127,11 @@ const _isPayment = rent => { }; const _checkLostPayments = (momentBegin, momentEnd, contract) => { - const lostPayments = - contract.rents + if (!contract.rents || !contract.rents.length) { + return; + } + + const lostPayments = contract.rents .filter(rent => !moment(rent.term, 'YYYYMMDDHH').isBetween(momentBegin, momentEnd, contract.frequency, '[]') && _isPayment(rent)) diff --git a/backend/managers/frontdata.js b/backend/managers/frontdata.js index 3e4690b..54a2e56 100644 --- a/backend/managers/frontdata.js +++ b/backend/managers/frontdata.js @@ -311,7 +311,7 @@ function toOccupantData(inputOccupant) { } ); - occupant.contactEmails = occupant.contacts.reduce((acc, {email}) => { + occupant.contactEmails = (occupant.contacts && occupant.contacts.length) ? occupant.contacts.reduce((acc, {email}) => { if (email) { return [ ...acc, @@ -319,7 +319,7 @@ function toOccupantData(inputOccupant) { ]; } return acc; - }, []); + }, []) : []; occupant.hasContactEmails = occupant.contactEmails.length > 0; @@ -332,44 +332,51 @@ function toOccupantData(inputOccupant) { occupant.terminated = true; occupant.status = 'stopped'; } - occupant.office = { - surface: 0, - m2Price: 0, - m2Expense: 0, - price: 0, - expense: 0 - }; - occupant.parking = { - price: 0, - expense: 0 - }; - occupant.properties.forEach((item) => { - var property = item.property; - if (property.type === 'parking') { - occupant.parking.price += property.price; - if (property.expense) { - occupant.parking.expense += property.expense; - } - } else { - occupant.office.surface += property.surface; - occupant.office.price += property.price; - if (property.expense) { - occupant.office.expense += property.expense; + if (occupant.properties) { + occupant.office = { + surface: 0, + m2Price: 0, + m2Expense: 0, + price: 0, + expense: 0 + }; + occupant.parking = { + price: 0, + expense: 0 + }; + occupant.properties.forEach((item) => { + var property = item.property; + if (property.type === 'parking') { + occupant.parking.price += property.price; + if (property.expense) { + occupant.parking.expense += property.expense; + } + } else { + occupant.office.surface += property.surface; + occupant.office.price += property.price; + if (property.expense) { + occupant.office.expense += property.expense; + } } + occupant.rental += property.price || 0; + occupant.expenses += property.expense || 0; + }); + occupant.preTaxTotal = occupant.rental + occupant.expenses - occupant.discount; + occupant.total = occupant.preTaxTotal; + if (occupant.vatRatio) { + occupant.vat = occupant.preTaxTotal * occupant.vatRatio; + occupant.total = occupant.preTaxTotal + occupant.vat; + } + if (occupant.office) { + occupant.office.m2Price = occupant.office.price / occupant.office.surface; + occupant.office.m2Expense = occupant.office.expense / occupant.office.surface; } - occupant.rental += property.price || 0; - occupant.expenses += property.expense || 0; - }); - occupant.preTaxTotal = occupant.rental + occupant.expenses - occupant.discount; - occupant.total = occupant.preTaxTotal; - if (occupant.vatRatio) { - occupant.vat = occupant.preTaxTotal * occupant.vatRatio; - occupant.total = occupant.preTaxTotal + occupant.vat; - } - if (occupant.office) { - occupant.office.m2Price = occupant.office.price / occupant.office.surface; - occupant.office.m2Expense = occupant.office.expense / occupant.office.surface; } + + occupant.hasPayments = occupant.rents ? occupant.rents.some( + rent => (rent.payments && rent.payments.some(payment => payment.amount > 0)) || + rent.discounts.some(discount => discount.origin === 'settlement') + ) : false; delete occupant.rents; return occupant; } diff --git a/backend/managers/occupantmanager.js b/backend/managers/occupantmanager.js index a8a02f9..318b4f7 100644 --- a/backend/managers/occupantmanager.js +++ b/backend/managers/occupantmanager.js @@ -1,10 +1,13 @@ -'use strict'; +const logger = require('winston'); +const { customAlphabet } = require('nanoid'); const moment = require('moment'); const FD = require('./frontdata'); const Contract = require('./contract'); const occupantModel = require('../models/occupant'); const propertyModel = require('../models/property'); +const nanoid = customAlphabet('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', 12); + function _buildPropertyMap(realm, callback) { propertyModel.findAll(realm, (errors, properties) => { const propertyMap = {}; @@ -25,51 +28,56 @@ function add(req, res) { const realm = req.realm; const occupant = occupantModel.schema.filter(req.body); - if (!occupant.properties || occupant.properties.length === 0) { - res.json({ - errors: ['Missing properties'] - }); - return; - } - if (!occupant.isCompany) { occupant.company = null; occupant.legalForm = null; occupant.siret = null; occupant.capital = null; - occupant.name = occupant.manager; + occupant.name = occupant.name || occupant.manager; } else { occupant.name = occupant.company; } + occupant.reference = occupant.reference || nanoid(); + + if (!occupant.name) { + return res.status(422).json({ + errors: ['Missing tenant name'] + }); + } + _buildPropertyMap(realm, (errors, propertyMap) => { if (errors && errors.length > 0) { - res.json({ + return res.status(404).json({ errors: errors }); - return; } // Resolve proprerties - occupant.properties.forEach((item) => { - item.property = propertyMap[item.propertyId]; - }); + if (occupant.properties) { + occupant.properties.forEach((item) => { + item.property = propertyMap[item.propertyId]; + }); + } - const contract = Contract.create({ - begin: occupant.beginDate, - end: occupant.endDate, - frequency: 'months', - properties: occupant.properties - }); + // Build rents from contract + occupant.rents = []; + if (occupant.beginDate && occupant.endDate && occupant.properties) { + const contract = Contract.create({ + begin: occupant.beginDate, + end: occupant.endDate, + frequency: 'months', + properties: occupant.properties + }); - occupant.rents = contract.rents; + occupant.rents = contract.rents; + } occupantModel.add(realm, occupant, (errors, occupant) => { if (errors) { - res.json({ + return res.status(500).json({ errors: errors }); - return; } res.json(FD.toOccupantData(occupant)); }); @@ -81,30 +89,29 @@ function update(req, res) { const occupantId = req.params.id; const occupant = occupantModel.schema.filter(req.body); - if (!occupant.properties || occupant.properties.length === 0) { - res.json({ - errors: ['Missing properties'] - }); - return; - } - - if (!occupant.isCompany) { occupant.company = null; occupant.legalForm = null; occupant.siret = null; occupant.capital = null; - occupant.name = occupant.manager; + occupant.name = occupant.name || occupant.manager; } else { occupant.name = occupant.company; } + occupant.reference = occupant.reference || nanoid(); + + if (!occupant.name) { + return res.status(422).json({ + errors: ['Missing tenant name'] + }); + } + occupantModel.findOne(realm, occupantId, (errors, dbOccupant) => { if (errors && errors.length > 0) { - res.json({ + return res.status(404).json({ errors: errors }); - return; } if (dbOccupant.documents) { @@ -113,70 +120,78 @@ function update(req, res) { _buildPropertyMap(realm, (errors, propertyMap) => { if (errors && errors.length > 0) { - res.json({ + return res.status(404).json({ errors: errors }); - return; } // Resolve proprerties - occupant.properties = occupant.properties.map((item) => { - let itemToKeep; - dbOccupant.properties.forEach((dbItem) => { - if (dbItem.propertyId === item.propertyId) { - itemToKeep = dbItem; + if (occupant.properties) { + occupant.properties = occupant.properties.map((item) => { + let itemToKeep; + dbOccupant.properties.forEach((dbItem) => { + if (dbItem.propertyId === item.propertyId) { + itemToKeep = dbItem; + } + }); + if (!itemToKeep) { + itemToKeep = { + propertyId: item.propertyId, + property: propertyMap[item.propertyId], + }; } + itemToKeep.entryDate = item.entryDate || occupant.beginDate; + itemToKeep.exitDate = item.exitDate || occupant.endDate; + return itemToKeep; }); - if (!itemToKeep) { - itemToKeep = { - propertyId: item.propertyId, - property: propertyMap[item.propertyId], - }; - } - itemToKeep.entryDate = occupant.beginDate; - itemToKeep.exitDate = occupant.endDate; - return itemToKeep; - }); - - const contract = { - begin: dbOccupant.beginDate, - end: dbOccupant.endDate, - frequency: 'months', - terms: Math.round( - moment(dbOccupant.endDate, 'DD/MM/YYYY') - .diff(moment(dbOccupant.beginDate, 'DD/MM/YYYY'), 'months', true)), - properties: dbOccupant.properties, - vatRate: dbOccupant.vatRatio, - discount: dbOccupant.discount, - rents: dbOccupant.rents - }; - - const modification = { - begin: occupant.beginDate, - end: occupant.endDate, - termination: occupant.terminationDate, - properties: occupant.properties - }; - - try { - const newContract = Contract.update(contract, modification); + } - occupant.rents = newContract.rents; + // Build rents from contract + occupant.rents = []; + if (occupant.beginDate && occupant.endDate && occupant.properties) { + try { + const contract = { + begin: dbOccupant.beginDate, + end: dbOccupant.endDate, + frequency: 'months', + terms: Math.ceil( + moment(dbOccupant.endDate, 'DD/MM/YYYY') + .diff(moment(dbOccupant.beginDate, 'DD/MM/YYYY'), 'months', true)), + properties: dbOccupant.properties, + vatRate: dbOccupant.vatRatio, + discount: dbOccupant.discount, + rents: dbOccupant.rents + }; - occupantModel.update(realm, occupant, (errors) => { - if (errors) { - res.json({ - errors: errors - }); - return; + const modification = { + begin: occupant.beginDate, + end: occupant.endDate, + termination: occupant.terminationDate, + properties: occupant.properties, + }; + if (occupant.vatRatio !== undefined) { + modification.vatRate = occupant.vatRatio; } - res.json(FD.toOccupantData(occupant)); - }); - } catch (e) { - res.json({ - errors: [String(e)] - }); + if (occupant.discount !== undefined) { + modification.discount = occupant.discount; + } + + const newContract = Contract.update(contract, modification); + occupant.rents = newContract.rents; + } catch (e) { + logger.error(e); + return res.sendStatus(500); + } } + + occupantModel.update(realm, occupant, (errors) => { + if (errors) { + return res.status(500).json({ + errors: errors + }); + } + res.json(FD.toOccupantData(occupant)); + }); }); }); } @@ -194,11 +209,15 @@ function remove(req, res) { } }, (errors, occupants) => { if (errors) { - res.json({ - errors: [] + return res.status(500).json({ + errors }); - return; } + + if (!occupants || !occupants.length) { + return res.sendStatus(404); + } + if (occupants) { const occupantsWithPaidRents = occupants.filter(occupant => { return occupant.rents @@ -207,29 +226,33 @@ function remove(req, res) { }); if (occupantsWithPaidRents.length > 0) { // TODO: to localize - callback(['Impossible de supprimer le locataire : ' + occupantsWithPaidRents[0].name + '. Des loyers ont été encaissés.']); - return; + return res.status(422).json({ + errors: ['Impossible de supprimer le locataire : ' + occupantsWithPaidRents[0].name + '. Des loyers ont été encaissés.'] + }); } occupantModel.remove( realm, occupants.map(occupant => occupant._id.toString()), - error => error ? callback([error]) : callback([])); + errors => { + if (errors) { + return res.status(500).json({ + errors + }); + } + callback(); + }); } }); } - releaseRent((errors) => { - if (errors && errors.length > 0) { - res.json({ - errors: errors - }); - return; - } - + releaseRent(() => { occupantModel.remove(realm, occupantIds, (errors) => { - res.json({ - errors: errors - }); + if (errors) { + return res.status(500).json({ + errors + }); + } + res.sendStatus(200); }); }); } @@ -238,12 +261,12 @@ function all(req, res) { const realm = req.realm; occupantModel.findAll(realm, (errors, occupants) => { if (errors && errors.length > 0) { - res.json({ + return res.status(500).json({ errors: errors }); - } else { - res.json(occupants.map(occupant => FD.toOccupantData(occupant))); } + + res.json(occupants.map(occupant => FD.toOccupantData(occupant))); }); } @@ -252,12 +275,12 @@ function one(req, res) { const occupantId = req.params.id; occupantModel.findOne(realm, occupantId, (errors, dbOccupant) => { if (errors && errors.length > 0) { - res.json({ + return res.status(404).json({ errors: errors }); - } else { - res.json(FD.toOccupantData(dbOccupant)); } + + res.json(FD.toOccupantData(dbOccupant)); }); } @@ -272,25 +295,24 @@ function overview(req, res) { occupantModel.findAll(realm, (errors, occupants) => { if (errors && errors.length > 0) { - res.json({ + return res.status(404).json({ errors: errors }); - } else { + } - if (occupants) { - result.countAll = occupants.length; - result = occupants.reduce((acc, occupant) => { - const endMoment = moment(occupant.terminationDate || occupant.endDate, 'DD/MM/YYYY'); - if (endMoment.isBefore(currentDate, 'day')) { - acc.countInactive++; - } else { - acc.countActive++; - } - return acc; - }, result); - } - res.json(result); + if (occupants) { + result.countAll = occupants.length; + result = occupants.reduce((acc, occupant) => { + const endMoment = moment(occupant.terminationDate || occupant.endDate, 'DD/MM/YYYY'); + if (endMoment.isBefore(currentDate, 'day')) { + acc.countInactive++; + } else { + acc.countActive++; + } + return acc; + }, result); } + res.json(result); }); } diff --git a/backend/managers/propertymanager.js b/backend/managers/propertymanager.js index dfc2360..eb51ac2 100644 --- a/backend/managers/propertymanager.js +++ b/backend/managers/propertymanager.js @@ -122,6 +122,30 @@ function all(req, res) { }); } +function one(req, res) { + const realm = req.realm; + const tenantId = req.params.id; + + propertyModel.findOne(realm, tenantId, (errors, dbProperty) => { + if (errors && errors.length > 0) { + res.json({ + errors: errors + }); + return; + } + + _toPropertiesData(realm, dbProperty, (errors, property) => { + if (errors && errors.length > 0) { + res.json({ + errors: errors + }); + return; + } + res.json(property); + }); + }); +} + function overview(req, res) { const realm = req.realm; let result = { @@ -165,5 +189,6 @@ module.exports = { update, remove, all, + one, overview }; diff --git a/backend/models/occupant.js b/backend/models/occupant.js index 42761c5..879057f 100644 --- a/backend/models/occupant.js +++ b/backend/models/occupant.js @@ -18,6 +18,8 @@ class OccupantModel extends Model { street2: String, zipCode: String, city: String, + state: String, + country: String, contacts: Array, contract: String, beginDate: String, diff --git a/backend/routes/apiv2.js b/backend/routes/apiv2.js index 352a16e..26acdc3 100755 --- a/backend/routes/apiv2.js +++ b/backend/routes/apiv2.js @@ -80,7 +80,7 @@ module.exports = function() { occupantsRouter.delete('/:ids', occupantManager.remove); occupantsRouter.get('/', occupantManager.all); occupantsRouter.get('/:id', occupantManager.one); - occupantsRouter.get('/overview', occupantManager.overview); + // occupantsRouter.get('/overview', occupantManager.overview); router.use('/tenants', occupantsRouter); const documentsRouter = express.Router(); @@ -104,7 +104,8 @@ module.exports = function() { propertiesRouter.patch('/:id', propertyManager.update); propertiesRouter.delete('/:ids', propertyManager.remove); propertiesRouter.get('/', propertyManager.all); - propertiesRouter.get('/overview', propertyManager.overview); + propertiesRouter.get('/:id', propertyManager.one); + // propertiesRouter.get('/overview', propertyManager.overview); router.use('/properties', propertiesRouter); router.get('/accounting/:year', accountingManager.all); diff --git a/package-lock.json b/package-lock.json index b52d785..6be65c9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2886,12 +2886,6 @@ "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=", "dev": true }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -3029,9 +3023,9 @@ } }, "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", "dev": true }, "base64-js": { @@ -3041,9 +3035,9 @@ "dev": true }, "base64id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true }, "batch": { @@ -3067,15 +3061,6 @@ "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "dev": true, - "requires": { - "callsite": "1.0.0" - } - }, "bin-build": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-3.0.0.tgz", @@ -3621,27 +3606,27 @@ "dev": true }, "browser-sync": { - "version": "2.26.10", - "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.26.10.tgz", - "integrity": "sha512-JeVQP3CARvNA1DELj+ZGWj+/0pzE8+Omvq1WNgzaTXVdP3lNEbGxZbkjvLK7hHpQywjQ1sDJWlJQZT6V59XDTg==", + "version": "2.26.14", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.26.14.tgz", + "integrity": "sha512-3TtpsheGolJT6UFtM2CZWEcGJmI4ZEvoCKiKE2bvcDnPxRkhQT4nIGVtfiyPcoHKXGM0LwMOZmYJNWfiNfVXWA==", "dev": true, "requires": { - "browser-sync-client": "^2.26.10", - "browser-sync-ui": "^2.26.10", + "browser-sync-client": "^2.26.14", + "browser-sync-ui": "^2.26.14", "bs-recipes": "1.3.4", "bs-snippet-injector": "^2.0.1", - "chokidar": "^3.4.1", + "chokidar": "^3.5.1", "connect": "3.6.6", "connect-history-api-fallback": "^1", "dev-ip": "^1.0.1", "easy-extender": "^2.3.4", - "eazy-logger": "^3", + "eazy-logger": "3.1.0", "etag": "^1.8.1", "fresh": "^0.5.2", "fs-extra": "3.0.1", "http-proxy": "^1.18.1", "immutable": "^3", - "localtunnel": "^2.0.0", + "localtunnel": "^2.0.1", "micromatch": "^4.0.2", "opn": "5.3.0", "portscanner": "2.1.1", @@ -3653,7 +3638,7 @@ "serve-index": "1.9.1", "serve-static": "1.13.2", "server-destroy": "1.0.1", - "socket.io": "2.1.1", + "socket.io": "2.4.0", "ua-parser-js": "^0.7.18", "yargs": "^15.4.1" }, @@ -3665,12 +3650,11 @@ "dev": true }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -3685,9 +3669,9 @@ } }, "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, "braces": { @@ -3700,19 +3684,19 @@ } }, "chokidar": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.1.tgz", - "integrity": "sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", "dev": true, "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", - "fsevents": "~2.1.2", + "fsevents": "~2.3.1", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" + "readdirp": "~3.5.0" } }, "cliui": { @@ -3778,16 +3762,16 @@ } }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -3855,18 +3839,18 @@ "dev": true }, "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", "dev": true, "requires": { "picomatch": "^2.2.1" } }, "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "requires": { "emoji-regex": "^8.0.0", @@ -3935,9 +3919,9 @@ } }, "browser-sync-client": { - "version": "2.26.10", - "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.26.10.tgz", - "integrity": "sha512-8pYitKwpVva7hzXJI8lTljNDbA9fjMEobHSxWqegIUon/GjJAG3UgHB/+lBWnOLzTY8rGX66MvGqL1Aknyrj7g==", + "version": "2.26.14", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.26.14.tgz", + "integrity": "sha512-be0m1MchmKv/26r/yyyolxXcBi052aYrmaQep5nm8YNMjFcEyzv0ZoOKn/c3WEXNlEB/KeXWaw70fAOJ+/F1zQ==", "dev": true, "requires": { "etag": "1.8.1", @@ -3947,16 +3931,16 @@ } }, "browser-sync-ui": { - "version": "2.26.10", - "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.26.10.tgz", - "integrity": "sha512-UfNSBItlXcmEvJ9RE4JooNtIsiIfHowp+7/52Jz4VFfQD4v78QK5/NV9DVrG41oMM3zLyhW4f/RliOb4ysStZg==", + "version": "2.26.14", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.26.14.tgz", + "integrity": "sha512-6oT1sboM4KVNnWCCJDMGbRIeTBw97toMFQ+srImvwQ6J5t9KMgizaIX8HcKLiemsUMSJkgGM9RVKIpq2UblgOA==", "dev": true, "requires": { "async-each-series": "0.1.1", "connect-history-api-fallback": "^1", "immutable": "^3", "server-destroy": "1.0.1", - "socket.io-client": "^2.0.4", + "socket.io-client": "^2.4.0", "stream-throttle": "^0.1.3" } }, @@ -4124,12 +4108,6 @@ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", "dev": true }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true - }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -4612,9 +4590,9 @@ } }, "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", "dev": true }, "cookie-parser": { @@ -5232,99 +5210,75 @@ } }, "engine.io": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", - "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz", + "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", "dev": true, "requires": { "accepts": "~1.3.4", - "base64id": "1.0.0", - "cookie": "0.3.1", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.0", - "ws": "~3.3.1" + "base64id": "2.0.0", + "cookie": "~0.4.1", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "~7.4.2" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, - "engine.io-parser": { + "ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", - "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", - "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } - }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true } } }, "engine.io-client": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.3.tgz", - "integrity": "sha512-0NGY+9hioejTEJCaSJZfWZLk4FPI9dN+1H1C4+wj2iuFba47UgZbJzfWs4aNFajnX/qAaYKbe2lLTfEEWzCmcw==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.1.tgz", + "integrity": "sha512-oVu9kBkGbcggulyVF0kz6BV3ganqUeqXvD79WOFKa+11oK692w1NyFkuEj4xrkFRpZhn92QOqTk4RQq5LiBXbQ==", "dev": true, "requires": { "component-emitter": "~1.3.0", "component-inherit": "0.0.3", - "debug": "~4.1.0", + "debug": "~3.1.0", "engine.io-parser": "~2.2.0", "has-cors": "1.1.0", "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "~6.1.0", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "ws": "~7.4.2", "xmlhttprequest-ssl": "~1.5.4", "yeast": "0.1.2" }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.0.0" } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true } } }, "engine.io-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz", - "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", + "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", "dev": true, "requires": { "after": "0.8.2", "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", + "base64-arraybuffer": "0.1.4", "blob": "0.0.5", "has-binary2": "~1.0.2" } @@ -5650,9 +5604,9 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true }, "execa": { @@ -6254,24 +6208,10 @@ "dev": true }, "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "dev": true, - "requires": { - "debug": "=3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", + "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==", + "dev": true }, "for-in": { "version": "1.0.2", @@ -8116,9 +8056,9 @@ "dev": true }, "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "requires": { "emoji-regex": "^8.0.0", @@ -8168,9 +8108,9 @@ } }, "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "version": "20.2.7", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", + "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", "dev": true } } @@ -9164,6 +9104,11 @@ "dev": true, "optional": true }, + "nanoid": { + "version": "3.1.22", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.22.tgz", + "integrity": "sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ==" + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -9756,12 +9701,6 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", - "dev": true - }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -10165,22 +10104,16 @@ "integrity": "sha1-ZiON9fjnwMjKTNlw1KtqE3PrdbU=" }, "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", + "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", + "dev": true }, "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", + "dev": true }, "parseurl": { "version": "1.3.3", @@ -11900,17 +11833,17 @@ } }, "socket.io": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", - "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.4.0.tgz", + "integrity": "sha512-9UPJ1UTvKayuQfVv2IQ3k7tCQC/fboDyIK62i99dAQIyHKaBsNdTpwHLgKJ6guRWxRtC9H+138UwpaGuQO9uWQ==", "dev": true, "requires": { - "debug": "~3.1.0", - "engine.io": "~3.2.0", + "debug": "~4.1.0", + "engine.io": "~3.5.0", "has-binary2": "~1.0.2", "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.1.1", - "socket.io-parser": "~3.2.0" + "socket.io-client": "2.4.0", + "socket.io-parser": "~3.4.0" }, "dependencies": { "component-emitter": { @@ -11920,44 +11853,12 @@ "dev": true }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "engine.io-client": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", - "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.1", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "~3.3.1", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - } - }, - "engine.io-parser": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", - "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.5", - "has-binary2": "~1.0.2" + "ms": "^2.1.1" } }, "isarray": { @@ -11966,49 +11867,22 @@ "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", "dev": true }, - "socket.io-client": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", - "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", - "dev": true, - "requires": { - "backo2": "1.0.2", - "base64-arraybuffer": "0.1.5", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "~3.1.0", - "engine.io-client": "~3.2.0", - "has-binary2": "~1.0.2", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "socket.io-parser": "~3.2.0", - "to-array": "0.1.4" - } + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true }, "socket.io-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", - "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", + "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", "dev": true, "requires": { "component-emitter": "1.2.1", - "debug": "~3.1.0", + "debug": "~4.1.0", "isarray": "2.0.1" } - }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } } } }, @@ -12019,67 +11893,46 @@ "dev": true }, "socket.io-client": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz", - "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz", + "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", "dev": true, "requires": { "backo2": "1.0.2", - "base64-arraybuffer": "0.1.5", "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "engine.io-client": "~3.4.0", + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "engine.io-client": "~3.5.0", "has-binary2": "~1.0.2", - "has-cors": "1.1.0", "indexof": "0.0.1", - "object-component": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", + "parseqs": "0.0.6", + "parseuri": "0.0.6", "socket.io-parser": "~3.3.0", "to-array": "0.1.4" }, "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.0.0" } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true } } }, "socket.io-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz", - "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", + "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", "dev": true, "requires": { - "component-emitter": "1.2.1", + "component-emitter": "~1.3.0", "debug": "~3.1.0", "isarray": "2.0.1" }, "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -12943,9 +12796,9 @@ } }, "ua-parser-js": { - "version": "0.7.21", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz", - "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==", + "version": "0.7.26", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.26.tgz", + "integrity": "sha512-VwIvGlFNmpKbjzRt51jpbbFTrKIEgGHxIwA8Y69K1Bqc6bTIV7TaGGABOkghSFQWsLmcRB4drGvpfv9z2szqoQ==", "dev": true }, "uglify-js": { @@ -12965,12 +12818,6 @@ "random-bytes": "~1.0.0" } }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", - "dev": true - }, "unbzip2-stream": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", @@ -13436,13 +13283,10 @@ } }, "ws": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", - "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", + "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==", + "dev": true }, "xdg-basedir": { "version": "4.0.0", @@ -13463,9 +13307,9 @@ "dev": true }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" }, "yallist": { "version": "2.1.2", diff --git a/package.json b/package.json index 961c14a..1869c4e 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "mongorestore": "node scripts/mongorestore.js" }, "dependencies": { - "axios": "^0.21.1", + "axios": "0.21.1", "bcryptjs": "2.4.3", "body-parser": "1.19.0", "bootbox": "5.4.0", @@ -52,6 +52,7 @@ "moment-timezone": "0.5.28", "mongobackup": "0.3.5", "mongojs": "3.1.0", + "nanoid": "3.1.22", "passport": "0.4.1", "passport-local": "1.0.0", "serve-favicon": "2.5.0", @@ -59,11 +60,11 @@ "winston": "2.4.4" }, "devDependencies": { - "@babel/cli": "^7.12.1", + "@babel/cli": "7.12.1", "@babel/core": "7.9.0", "@babel/preset-env": "7.9.5", "babel-eslint": "10.1.0", - "browser-sync": "^2.26.10", + "browser-sync": "2.26.14", "eslint": "6.8.0", "fs-extra": "9.0.0", "imagemin": "6.1.0",