diff --git a/core/controllers/find.js b/core/controllers/find.js index f21b085..faebcb5 100644 --- a/core/controllers/find.js +++ b/core/controllers/find.js @@ -9,7 +9,6 @@ function extractFindOptions(req, res, targetAttributes) { }) } - console.log(result); return result; } @@ -90,8 +89,6 @@ function _find(modelMaybeThunk, options = {}) { findOptions = parseFindOptions(findOptions, targetAttributes); - console.log(findOptions); - return Promise.resolve(options.before(findOptions, req, res)) .then(findOptions => { return model[isList ? 'fetchAll' : 'fetch'](findOptions); diff --git a/core/models.js b/core/models.js index 144df7f..5462b38 100644 --- a/core/models.js +++ b/core/models.js @@ -21,7 +21,8 @@ const sequelize = new Sequelize( config.database.password, config.database, { dialect: 'mysql', - operatorAliases: false + operatorAliases: false, + logging: false, } ); diff --git a/core/router.js b/core/router.js index 643c929..415e9ac 100644 --- a/core/router.js +++ b/core/router.js @@ -3,6 +3,7 @@ const express = require('express'); const glob = require('glob'); const path = require('path'); +const { apicache } = require('../middlewares/cache'); const modulesDir = path.resolve(__dirname + '/../modules/') const globOptions = { @@ -12,6 +13,8 @@ const globOptions = { absolute: true, } + + module.exports = function () { const router = express.Router({ mergeParams: true }); @@ -22,7 +25,24 @@ module.exports = function () { description: 'Welcome, this is the API for the application.' }); }); + + // APICACHE + + // route to display cache index + router.get('/v2/cache/index', (req, res) => { + res.json(apicache.getIndex()) + }); + + + // route to clear target group + router.get('/v2/cache/clear/:target?', (req, res) => { + res.json(apicache.clear(req.params.target)) + }); + + + // Resto de rutas + glob.sync("**/*.routes.js", globOptions) .forEach(function (file) { router.use('/v2', require(file)); diff --git a/helpers/controller.helper.js b/helpers/controller.helper.js index e9e4377..7fdb288 100644 --- a/helpers/controller.helper.js +++ b/helpers/controller.helper.js @@ -76,8 +76,8 @@ function setPaginationInfo(totalCount, res) { const params = extractParamsFromRequest(null, res); - console.log('>>>>>>>>>>>>>>>>>>>>>>>>> params antes de setPaginationInfo'); - console.log(params); + //console.log('>>>>>>>>>>>>>>>>>>>>>>>>> params antes de setPaginationInfo'); + //console.log(params); if (params.paginate) { const page = (params.paginate && params.paginate.page) ? params.paginate.page : null, diff --git a/helpers/qr.helper.js b/helpers/qr.helper.js new file mode 100644 index 0000000..79743b8 --- /dev/null +++ b/helpers/qr.helper.js @@ -0,0 +1,184 @@ +var _ = require('lodash'); +var QRCode = require('qrcode'); + +/* params = { + code: 'xxxx', + name: 'xxxx', + surname: 'xxxx', + color: '#ff', + +} */ + +module.exports.getInscriptionQRCode = function (params) { + return new Promise(function (resolve, reject) { + var texto = _.padStart(params.code, 4, '0') + '\n' + params.name + ' ' + params.surname; + var options = { + errorCorrectionLevel: 'M', + } + + if (params.color) { + options = _.assign(options, { + color: { + light: (params.color) ? colourNameToHex(params.color) : "#000000", + dark: "#ffffff" + } + }) + }; + + QRCode.toDataURL(texto, options, function (err, qrcode) { + if (err) resolve(''); + //console.log(qrcode); + resolve(qrcode); + }); + }) +}; + + +function colourNameToHex(colour) { + var colours = { + "aliceblue": "#f0f8ff", + "antiquewhite": "#faebd7", + "aqua": "#00ffff", + "aquamarine": "#7fffd4", + "azure": "#f0ffff", + "beige": "#f5f5dc", + "bisque": "#ffe4c4", + "blanchedalmond": "#ffebcd", + "blue": "#0000ff", + "blueviolet": "#8a2be2", + "brown": "#a52a2a", + "burlywood": "#deb887", + "cadetblue": "#5f9ea0", + "chartreuse": "#7fff00", + "chocolate": "#d2691e", + "coral": "#ff7f50", + "cornflowerblue": "#6495ed", + "cornsilk": "#fff8dc", + "crimson": "#dc143c", + "cyan": "#00ffff", + "darkblue": "#00008b", + "darkcyan": "#008b8b", + "darkgoldenrod": "#b8860b", + "darkgray": "#a9a9a9", + "darkgreen": "#006400", + "darkkhaki": "#bdb76b", + "darkmagenta": "#8b008b", + "darkolivegreen": "#556b2f", + "darkorange": "#ff8c00", + "darkorchid": "#9932cc", + "darkred": "#8b0000", + "darksalmon": "#e9967a", + "darkseagreen": "#8fbc8f", + "darkslateblue": "#483d8b", + "darkslategray": "#2f4f4f", + "darkturquoise": "#00ced1", + "darkviolet": "#9400d3", + "deeppink": "#ff1493", + "deepskyblue": "#00bfff", + "dimgray": "#696969", + "dodgerblue": "#1e90ff", + "firebrick": "#b22222", + "floralwhite": "#fffaf0", + "forestgreen": "#228b22", + "fuchsia": "#ff00ff", + "gainsboro": "#dcdcdc", + "ghostwhite": "#f8f8ff", + "gold": "#ffd700", + "goldenrod": "#daa520", + "gray": "#808080", + "green": "#008000", + "greenyellow": "#adff2f", + "honeydew": "#f0fff0", + "hotpink": "#ff69b4", + "indianred ": "#cd5c5c", + "indigo": "#4b0082", + "ivory": "#fffff0", + "khaki": "#f0e68c", + "lavender": "#e6e6fa", + "lavenderblush": "#fff0f5", + "lawngreen": "#7cfc00", + "lemonchiffon": "#fffacd", + "lightblue": "#add8e6", + "lightcoral": "#f08080", + "lightcyan": "#e0ffff", + "lightgoldenrodyellow": "#fafad2", + "lightgrey": "#d3d3d3", + "lightgreen": "#90ee90", + "lightpink": "#ffb6c1", + "lightsalmon": "#ffa07a", + "lightseagreen": "#20b2aa", + "lightskyblue": "#87cefa", + "lightslategray": "#778899", + "lightsteelblue": "#b0c4de", + "lightyellow": "#ffffe0", + "lime": "#00ff00", + "limegreen": "#32cd32", + "linen": "#faf0e6", + "magenta": "#ff00ff", + "maroon": "#800000", + "mediumaquamarine": "#66cdaa", + "mediumblue": "#0000cd", + "mediumorchid": "#ba55d3", + "mediumpurple": "#9370d8", + "mediumseagreen": "#3cb371", + "mediumslateblue": "#7b68ee", + "mediumspringgreen": "#00fa9a", + "mediumturquoise": "#48d1cc", + "mediumvioletred": "#c71585", + "midnightblue": "#191970", + "mintcream": "#f5fffa", + "mistyrose": "#ffe4e1", + "moccasin": "#ffe4b5", + "navajowhite": "#ffdead", + "navy": "#000080", + "oldlace": "#fdf5e6", + "olive": "#808000", + "olivedrab": "#6b8e23", + "orange": "#ffa500", + "orangered": "#ff4500", + "orchid": "#da70d6", + "palegoldenrod": "#eee8aa", + "palegreen": "#98fb98", + "paleturquoise": "#afeeee", + "palevioletred": "#d87093", + "papayawhip": "#ffefd5", + "peachpuff": "#ffdab9", + "peru": "#cd853f", + "pink": "#ffc0cb", + "plum": "#dda0dd", + "powderblue": "#b0e0e6", + "purple": "#800080", + "rebeccapurple": "#663399", + "red": "#ff0000", + "rosybrown": "#bc8f8f", + "royalblue": "#4169e1", + "saddlebrown": "#8b4513", + "salmon": "#fa8072", + "sandybrown": "#f4a460", + "seagreen": "#2e8b57", + "seashell": "#fff5ee", + "sienna": "#a0522d", + "silver": "#c0c0c0", + "skyblue": "#87ceeb", + "slateblue": "#6a5acd", + "slategray": "#708090", + "snow": "#fffafa", + "springgreen": "#00ff7f", + "steelblue": "#4682b4", + "tan": "#d2b48c", + "teal": "#008080", + "thistle": "#d8bfd8", + "tomato": "#ff6347", + "turquoise": "#40e0d0", + "violet": "#ee82ee", + "wheat": "#f5deb3", + "whitesmoke": "#f5f5f5", + "yellow": "#ffff00", + "yellowgreen": "#9acd32" + }; + + if (typeof colours[colour.toLowerCase()] != 'undefined') + return colours[colour.toLowerCase()]; + + return "#000000"; +} \ No newline at end of file diff --git a/helpers/security.helper.js b/helpers/security.helper.js index d70fbd2..3557d7e 100644 --- a/helpers/security.helper.js +++ b/helpers/security.helper.js @@ -76,10 +76,10 @@ const _verify = (token, options) => { algorithm: ["RS256"] }; - console.log('_VERIFY - SECURiTY.HELPERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR'); - console.log('token: ', token); - console.log('publicKEY: ', publicKEY); - console.log('verifyOptions: ', verifyOptions); + //console.log('_VERIFY - SECURiTY.HELPERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR'); + //console.log('token: ', token); + //console.log('publicKEY: ', publicKEY); + //console.log('verifyOptions: ', verifyOptions); try { return jwt.verify(token, publicKEY, verifyOptions); diff --git a/helpers/vimeo.helper.js b/helpers/vimeo.helper.js index 1121b1b..ffa1144 100644 --- a/helpers/vimeo.helper.js +++ b/helpers/vimeo.helper.js @@ -9,7 +9,7 @@ function getVimeoVideoInfo(videoId) { path: '/videos/' + videoId }, function (error, body, status_code, headers) { if (error) { - console.log(error); + console.error(error); resolve({}) } else { resolve(body); diff --git a/middlewares/cache.js b/middlewares/cache.js index 5c4844b..fb5fe99 100644 --- a/middlewares/cache.js +++ b/middlewares/cache.js @@ -1,22 +1,24 @@ const apicache = require('apicache'); const redis = require('redis'); -let cacheWithRedis = apicache - .options({ +const cacheWithRedis = apicache + .options({ debug: true, - defaultDuration: '1 hour', - redisClient: redis.createClient() - }) - .middleware; + defaultDuration: '1 minute', + //redisClient: redis.createClient(), + //appendKey: (req, res) => req.user ? req.user.id : '', +}); + +const cacheMiddleware = cacheWithRedis.middleware; // higher-order function returns false for responses of other status codes (e.g. 403, 404, 500, etc) const onlyStatus200 = (req, res) => res.statusCode === 200 -const cacheSuccesses = cacheWithRedis('1 hour', onlyStatus200); -const cache1year = cacheWithRedis('1 year', onlyStatus200); +const cacheSuccesses = (time) => { return cacheMiddleware(time, onlyStatus200) }; module.exports = { + apicache: cacheWithRedis, + cacheMiddleware, cacheSuccesses, - cache1year } diff --git a/modules/auth/auth.controller.js b/modules/auth/auth.controller.js index 9b83cd8..5a5ffa5 100644 --- a/modules/auth/auth.controller.js +++ b/modules/auth/auth.controller.js @@ -73,7 +73,7 @@ async function register(req, res, next) { newUser = await authService.extraMethods.createUser(data); } catch (error) { - console.log(error); + console.error(error); controllerHelper.handleErrorResponse(MODULE_NAME, register.name, error, res); } }; @@ -82,8 +82,8 @@ async function register(req, res, next) { newUser = cleanAdminData(newUser.toJSON()); newUser.token = tokens.token; - console.log('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>'); - console.log(newUser); + //console.log('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>'); + //console.log(newUser); return controllerHelper.handleResultResponse(newUser, null, req.params, res, httpStatus.OK); } diff --git a/modules/events/event.controller.js b/modules/events/event.controller.js index 8d2d3e1..bc46602 100644 --- a/modules/events/event.controller.js +++ b/modules/events/event.controller.js @@ -1,6 +1,7 @@ 'use strict'; const httpStatus = require('http-status'); const generateControllers = require('../../core/controllers'); +const QRHelper = require('../../helpers/qr.helper'); const eventService = require('./event.service'); const eventReservationService = require('./events_reservations.service'); const eventInscriptionService = require('./events_inscriptions.service'); @@ -67,13 +68,43 @@ const extraControllers = { }, + getInscription: async (req, res, next) => { + const params = extractParamsFromRequest(req, res, {}); + const inscriptionId = params.params.id; + const userId = req.user.id; + + try { + let inscription = await eventInscriptionService._getInscriptionById(inscriptionId); + if (!inscription) { + return handleResultResponse("Inscripción no encontrada", null, params, res, httpStatus.NOT_FOUND); + } else if (inscription.userId !== userId) { + return handleResultResponse("Inscripción no encontrada", null, params, res, httpStatus.NOT_FOUND); + } + + inscription = await inscription.toJSON(); + + const qrConfig = { + name: req.user.name, + surname: req.user.surname, + code: inscription.code_ticket, + color: (inscription.level && inscription.level.color) ? inscription.level.color : null, + } + inscription.code_ticket_qr = await QRHelper.getInscriptionQRCode(qrConfig); + + return handleResultResponse(inscription, null, params, res, httpStatus.OK); + + } catch (error) { + return handleResultResponse("Error al buscar la inscripción", null, params, res, httpStatus.NOT_FOUND); + } + }, + + deleteInscription: async (req, res, next) => { const params = extractParamsFromRequest(req, res, {}); const user = req.user; const inscriptionId = params.params.id; - try - { + try { const inscription = await eventInscriptionService._getInscriptionById(inscriptionId); console.log('>>>>>>>>>>>>>>>>>>>>>>>>>>>>> { + const params = extractParamsFromRequest(req, res, {}); + const inscriptionId = params.params.id; + const userId = req.user.id; + + try { + const inscription = await eventInscriptionService._getInscriptionById(inscriptionId); + if (!inscription) { + return handleResultResponse("Inscription no encontrada", null, params, res, httpStatus.NOT_FOUND); + } else if (inscription.userId !== userId) { + return handleResultResponse("Inscription no encontrada", null, params, res, httpStatus.NOT_FOUND); + } + + const qrConfig = { + name: req.user.name, + surname: req.user.surname, + code: inscription.code_ticket, + color: (inscription.level && inscription.level.color) ? inscription.level.color : null, + } + const qrCode = await QRHelper.getInscriptionQRCode(qrConfig); + + return handleResultResponse(qrCode, null, params, res, httpStatus.OK); + + } catch (error) { + return handleResultResponse("Error al buscar la inscripción", null, params, res, httpStatus.NOT_FOUND); + } }, diff --git a/modules/events/event.routes.js b/modules/events/event.routes.js index 8c63702..3ecf6ac 100644 --- a/modules/events/event.routes.js +++ b/modules/events/event.routes.js @@ -3,6 +3,7 @@ const routes = require('express').Router(); const { isAdministratorUser, isLoggedUser } = require('../../middlewares/accessValidator'); const SchemaValidator = require('../../middlewares/schemaValidator'); +const { cacheSuccesses } = require('../../middlewares/cache'); const PaginateMiddleware = require('../../middlewares/paginate'); const FieldMiddleware = require('../../middlewares/fields'); const SortMiddleware = require('../../middlewares/sort'); @@ -19,7 +20,7 @@ const generalInvalidFields = [ ]; //Da todas las ciudades en las que ha habido congresos -routes.get('/cities', +routes.get('/cities', cacheSuccesses('24 hours'), // isLoggedUser, // FieldMiddleware.middleware({ // invalidFields: generalInvalidFields @@ -55,7 +56,7 @@ routes.get('/events/next', }), ); -routes.get('/events/past', +routes.get('/events/past', cacheSuccesses('24 hours'), isLoggedUser, FieldMiddleware.middleware({ invalidFields: generalInvalidFields @@ -97,7 +98,6 @@ routes.get('/events/:id', invalidFields: generalInvalidFields }), (req, res, next) => { - console.log(req.user.id); return eventController.findOne({ scopes: ['defaultScope', 'includeVenue', 'includeMultimedias', 'includeSpeakers', { method: ['includeInscription', req.user.id] }] })(req, res, next) @@ -137,9 +137,48 @@ routes.get('/events/:id/inscriptions', // Esto da todas las inscripciones de un usuario routes.get('/me/inscriptions', isLoggedUser, + /*(req, res, next) => { + req.apicacheGroup = req.user.id; + next(); + }, + cacheSuccesses('1 hour'),*/ eventController.getInscriptions, ); +// Esto da la inscripción de un usuario +routes.get('/me/inscriptions/:id', + isLoggedUser, + /*(req, res, next) => { + req.apicacheGroup = req.user.id; + next(); + }, + cacheSuccesses('1 hour'),*/ + eventController.getInscription, +); + +// Inscription QR Code +routes.get('/me/inscriptions/:id/qr', isLoggedUser, + //cacheSuccesses('1 hour'), + eventController.getQRCodeInscription, +); + +/*router.get('/:conferenceId/inscription/:userId/qrimage', function (req, res) { + conference.getInscriptionQRCode(req.params.conferenceId, req.params.userId, function (result, status) { + if (result && result.data) { + var buffer = new Buffer(result.data.split(",")[1], 'base64'); + + res.writeHead(status, { + 'Content-Type': 'image/png', + 'Content-Length': buffer.length + }); + + res.end(buffer); + } else { + res.status(200).end('') + } + }); +});*/ + // Hacer una inscripción routes.post('/events/:id/inscriptions', isLoggedUser, diff --git a/modules/events/event.service.js b/modules/events/event.service.js index 5e37334..0c9130b 100644 --- a/modules/events/event.service.js +++ b/modules/events/event.service.js @@ -50,9 +50,9 @@ const extraMethods = { where: { id: eventId } }) .then(function (result) { - const aaa = result[0]; - console.log('aaaaaaaaaaaaaaaaaaaaaaaaaaa'); - console.log(aaa); + //const aaa = result[0]; + //console.log('aaaaaaaaaaaaaaaaaaaaaaaaaaa'); + //console.log(aaa); resolve((result[0] === 1)); }) .catch(function (error) { @@ -71,9 +71,9 @@ const extraMethods = { where: { id: eventId } }) .then(function (result) { - const aaa = result[0]; - console.log('aaaaaaaaaaaaaaaaaaaaaaaaaaa'); - console.log(aaa); + //const aaa = result[0]; + //console.log('aaaaaaaaaaaaaaaaaaaaaaaaaaa'); + //console.log(aaa); resolve((result[0] === 1)); }) .catch(function (error) { diff --git a/modules/events/events_inscriptions.service.js b/modules/events/events_inscriptions.service.js index 1e79b65..1a25d94 100644 --- a/modules/events/events_inscriptions.service.js +++ b/modules/events/events_inscriptions.service.js @@ -9,10 +9,10 @@ const marketing = require('../../helpers/mailchimp.helper') const extraMethods = { - _getInscriptionById: (Id) => { - return models.EventInscription.findOne({ + _getInscriptionById: (id) => { + return models.EventInscription.scope('includeEventAndVenue').findOne({ where: { - id: Id, + id: id, }, }) }, @@ -76,7 +76,7 @@ const extraMethods = { }, _createInscription: (eventId, userId, type, validated, source, reservationId, overflowEventId) => { -console.log('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>< { if (model.association[key].foreignIdentifier === foreignId) { - console.log('encontrado'); const accessors = model.association[key].accessors; return { name: model.association[key].as, diff --git a/package.json b/package.json index 8b603ce..ea5681f 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "passport-local": "^1.0.0", "path": "^0.12.7", "pino": "^4.7.1", + "qrcode": "^1.4.1", "rand-token": "^0.4.0", "redis": "^2.8.0", "response-time": "^2.3.2", diff --git a/yarn.lock b/yarn.lock index afccafe..0645ae2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -325,12 +325,17 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= -ansi-styles@^3.2.1: +ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -617,6 +622,11 @@ camelcase@^4.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + camelize@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" @@ -725,6 +735,15 @@ cli-width@^2.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + cls-bluebird@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cls-bluebird/-/cls-bluebird-2.1.0.tgz#37ef1e080a8ffb55c2f4164f536f1919e7968aee" @@ -1010,6 +1029,11 @@ debug@^4.1.0, debug@^4.1.1: dependencies: ms "^2.1.1" +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -1098,6 +1122,11 @@ dicer@^0.3.0: dependencies: streamsearch "0.1.2" +dijkstrajs@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.1.tgz#d3cd81221e3ea40742cfcde556d4e99e98ddc71b" + integrity sha1-082BIh4+pAdCz83lVtTpnpjdxxs= + dns-prefetch-control@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/dns-prefetch-control/-/dns-prefetch-control-0.1.0.tgz#60ddb457774e178f1f9415f0cabb0e85b0b300b2" @@ -1200,6 +1229,11 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + enabled@1.0.x: version "1.0.2" resolved "https://registry.yarnpkg.com/enabled/-/enabled-1.0.2.tgz#965f6513d2c2d1c5f4652b64a2e3396467fc2f93" @@ -1567,6 +1601,13 @@ finalhandler@1.1.1: statuses "~1.4.0" unpipe "~1.0.0" +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + firebase-admin@^8.1.0: version "8.2.0" resolved "https://registry.yarnpkg.com/firebase-admin/-/firebase-admin-8.2.0.tgz#d2ff17fc427f7db5e9b1ee897bdf9c0c26773cc0" @@ -1732,6 +1773,11 @@ generate-function@^2.3.1: dependencies: is-property "^1.0.2" +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" @@ -2347,6 +2393,11 @@ isarray@1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= +isarray@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isemail@3.x.x: version "3.2.0" resolved "https://registry.yarnpkg.com/isemail/-/isemail-3.2.0.tgz#59310a021931a9fb06bbb51e155ce0b3f236832c" @@ -2501,6 +2552,14 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + lodash.at@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.at/-/lodash.at-4.6.0.tgz#93cdce664f0a1994ea33dd7cd40e23afd11b0ff8" @@ -3108,6 +3167,25 @@ p-finally@^1.0.0: resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= +p-limit@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" + integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== + dependencies: + p-try "^2.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + package-json@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" @@ -3167,6 +3245,11 @@ path-dirname@^1.0.0: resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -3239,6 +3322,11 @@ pluralize@^7.0.0: resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== +pngjs@^3.3.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" + integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== + posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -3336,6 +3424,16 @@ punycode@2.x.x: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +qrcode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.4.1.tgz#2126814985d0dbbd9aee050fc523d319c6a7dc3b" + integrity sha512-3JhHQJkKqJL4PfoM6t+B40f0GWv9eNJAJmuNx2X/sHEOLvMyvEPN8GfbdN1qmr19O8N2nLraOzeWjXocHz1S4w== + dependencies: + dijkstrajs "^1.0.1" + isarray "^2.0.1" + pngjs "^3.3.0" + yargs "^13.2.4" + qs@6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" @@ -3500,6 +3598,16 @@ repeat-string@^1.6.1: resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + require-uncached@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" @@ -3694,7 +3802,7 @@ serve-static@1.13.2: parseurl "~1.3.2" send "0.16.2" -set-blocking@~2.0.0: +set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= @@ -3904,6 +4012,15 @@ string-width@^1.0.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + string_decoder@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" @@ -3937,6 +4054,13 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -4288,6 +4412,11 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -4344,6 +4473,15 @@ wordwrap@~1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -4390,6 +4528,11 @@ xtend@~4.0.1: resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" @@ -4399,3 +4542,27 @@ yallist@^3.0.0, yallist@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== + +yargs-parser@^13.1.1: + version "13.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" + integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@^13.2.4: + version "13.3.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" + integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.1"