From a242f726b8ac095310928664190de845a78f8060 Mon Sep 17 00:00:00 2001 From: Heitor Mattosinho Date: Tue, 8 Sep 2020 01:52:23 -0300 Subject: [PATCH 1/4] feat (checkToken): new route checkToken --- .../app/Controllers/Http/v1/AuthController.js | 143 ++++++++++-------- src/adonisjs/start/routes.js | 33 ++-- 2 files changed, 94 insertions(+), 82 deletions(-) diff --git a/src/adonisjs/app/Controllers/Http/v1/AuthController.js b/src/adonisjs/app/Controllers/Http/v1/AuthController.js index 7cb3517..ab1e8f4 100644 --- a/src/adonisjs/app/Controllers/Http/v1/AuthController.js +++ b/src/adonisjs/app/Controllers/Http/v1/AuthController.js @@ -6,82 +6,93 @@ const Logger = use('Logger') class AuthController { - async login({ request, auth, response }) { - // console.log(request.all()) - Logger.info('login attempt via v1/auth/login (JWT)') - - let { email, password, refresh_token } = request.all(); - console.log(password) - let user = "" - let token = "" - - try{ - await auth.check() - return response.json('user is signed already') - } catch(e) { - - // token expired - if (e.code == 'E_JWT_TOKEN_EXPIRED'){ - token = await auth.generateForRefreshToken(refresh_token) - - Object.entries(token).forEach(entry => { - if (entry[0] == 'refreshToken'){ - refresh_token = entry[1] - } - }); - Logger.info('expired token') - - } - - // unloged user - if (e.code == 'E_INVALID_JWT_TOKEN'){ - try{ - token = await auth.withRefreshToken().attempt(email, password) - Logger.info('newly generated token') - - } catch(e){ - console.log(e) - } - } - - // generic error - if (token == "") - return response.status(e.status).json(e.message) - - user = await User.findBy('email', email) - Object.assign(user, token) - - return response.json(user) - } + async checkToken({request, auth, response}){ + try { + console.log('=================Checking token...'); + await auth.check() + response.json('token valid'); + } catch (error) { + response.json('token invalid') } + } + + async login({ request, auth, response }) { + // console.log(request.all()) + Logger.info('login attempt via v1/auth/login (JWT)') + + let { email, password, refresh_token } = request.all(); + console.log(password) + let user = "" + let token = "" + + try{ + await auth.check() + return response.json('user is signed already') + } catch(e) { - async login2({ request, auth, response }) { + // token expired + if (e.code == 'E_JWT_TOKEN_EXPIRED'){ + token = await auth.generateForRefreshToken(refresh_token) + + Object.entries(token).forEach(entry => { + if (entry[0] == 'refreshToken'){ + refresh_token = entry[1] + } + }); + Logger.info('expired token') + + } + + // unloged user + if (e.code == 'E_INVALID_JWT_TOKEN'){ try{ - let refresh_token = request.input('access_code'); + token = await auth.withRefreshToken().attempt(email, password) + Logger.info('newly generated token') - let token = await auth.generateForRefreshToken(refresh_token) - return response.json(token) - }catch(e){ - console.log(e) - return response.status(500).json(e.message) + } catch(e){ + console.log(e) } - + } + + // generic error + if (token == "") + return response.status(e.status).json(e.message) + + user = await User.findBy('email', email) + Object.assign(user, token) + + return response.json(user) } + } - async logout({ auth, response }) { - try{ - Logger.info('logout attempt via v1/auth/logout (JWT)') + async login2({ request, auth, response }) { + try{ + let refresh_token = request.input('access_code'); - const refreshToken = auth.getAuthHeader() - await auth.revokeTokens(refreshToken) + let token = await auth.generateForRefreshToken(refresh_token) + return response.json(token) + }catch(e){ + console.log(e) + return response.status(500).json(e.message) + } - return response.json('successfull logout') - }catch(e){ - console.log(e) - return response.status(500).json(e.message) - } - + } + + async logout({ auth, response }) { + try{ + Logger.info('logout attempt via v1/auth/logout (JWT)') + + const refreshToken = auth.getAuthHeader() + //console.log(refreshToken); + await auth.revokeTokens(refreshToken) + + return response.json('successfull logout') + }catch(e){ + console.log(e) + return response.status(500).json(e.message) } + + } } module.exports = AuthController diff --git a/src/adonisjs/start/routes.js b/src/adonisjs/start/routes.js index c7a1457..63f5916 100644 --- a/src/adonisjs/start/routes.js +++ b/src/adonisjs/start/routes.js @@ -5,7 +5,7 @@ const Route = use('Route') /* |---------------------------------------------------------------------------------------------- -| index +| index |---------------------------------------------------------------------------------------------- */ Route.get('/', () => { return 'Hello from Harena Manager'} ) @@ -13,18 +13,18 @@ Route.get('/', () => { return 'Hello from Harena Manager'} ) /* |---------------------------------------------------------------------------------------------- -| api: v1 +| api: v1 | resource: /user |---------------------------------------------------------------------------------------------- */ -Route.group(() => { +Route.group(() => { Route.post( '', 'v1/UserController.store') - - Route.get( 'cases', 'v1/UserController.list_cases').middleware(['auth']) + + Route.get( 'cases', 'v1/UserController.list_cases').middleware(['auth']) Route.get( 'quests', 'v1/UserController.list_quests').middleware(['auth']) Route.get( 'cases_by_quest', 'v1/UserController.list_cases_by_quests').middleware(['auth']) - Route.get( ':id', 'v1/UserController.show').middleware(['auth']) + Route.get( ':id', 'v1/UserController.show').middleware(['auth']) Route.put( ':id', 'v1/UserController.update').middleware(['auth']) Route.delete(':id', 'v1/UserController.destroy').middleware(['auth']) }).prefix('/api/v1/user') @@ -32,24 +32,25 @@ Route.group(() => { /* |---------------------------------------------------------------------------------------------- -| api: v1 +| api: v1 | resource: /auth |---------------------------------------------------------------------------------------------- */ -Route.group(() => { - Route.post('login', 'v1/AuthController.login') +Route.group(() => { + Route.post('login', 'v1/AuthController.login') Route.post('logout', 'v1/AuthController.logout').middleware(['auth']) + Route.get('check', 'v1/AuthController.checkToken') }).prefix('/api/v1/auth') /* |---------------------------------------------------------------------------------------------- -| api: v2 +| api: v2 | resource: /auth |---------------------------------------------------------------------------------------------- */ -Route.group(() => { - Route.post('login', 'AuthController.login') +Route.group(() => { + Route.post('login', 'AuthController.login') Route.post('logout', 'AuthController.logout').middleware(['auth']) }).prefix('/api/v2/auth') @@ -57,13 +58,13 @@ Route.group(() => { /* |---------------------------------------------------------------------------------------------- -| api: v1 +| api: v1 | resource: /case |---------------------------------------------------------------------------------------------- */ Route.group(() => { Route.get( '', 'v1/CaseController.index') - Route.get( ':id', 'v1/CaseController.show') + Route.get( ':id', 'v1/CaseController.show') Route.post( '', 'v1/CaseController.store') Route.put( ':id', 'v1/CaseController.update').middleware(['check_permission:contributor']) Route.post( 'share', 'v1/CaseController.share').middleware(['check_permission:author']) @@ -73,7 +74,7 @@ Route.group(() => { /* |---------------------------------------------------------------------------------------------- -| api: v1 +| api: v1 | resource: /artifact |---------------------------------------------------------------------------------------------- */ @@ -128,7 +129,7 @@ Route.group(() => { | resource: /admin |---------------------------------------------------------------------------------------------- */ -Route.group(() => { +Route.group(() => { Route.get( 'users', 'v1/UserController.index') Route.get( 'roles', 'v1/AdminController.list_roles') From 4faf67b733ce7ae2e5082749a606170e50b4228a Mon Sep 17 00:00:00 2001 From: Heitor Mattosinho Date: Wed, 9 Sep 2020 18:05:26 -0300 Subject: [PATCH 2/4] refactor (InitialSeeder): new default quests --- src/adonisjs/database/seeds/InitialSeeder.js | 215 ++++++++++++------ .../resources/imgs/decisoes-extremas.png | Bin 0 -> 24362 bytes .../resources/imgs/desafio-eletro.png | Bin 0 -> 23219 bytes src/adonisjs/resources/imgs/desafio-radio.png | Bin 0 -> 19712 bytes .../resources/imgs/quiz-emergencia.png | Bin 0 -> 23584 bytes .../resources/imgs/visita-virtual.png | Bin 0 -> 20530 bytes 6 files changed, 140 insertions(+), 75 deletions(-) create mode 100644 src/adonisjs/resources/imgs/decisoes-extremas.png create mode 100644 src/adonisjs/resources/imgs/desafio-eletro.png create mode 100644 src/adonisjs/resources/imgs/desafio-radio.png create mode 100644 src/adonisjs/resources/imgs/quiz-emergencia.png create mode 100644 src/adonisjs/resources/imgs/visita-virtual.png diff --git a/src/adonisjs/database/seeds/InitialSeeder.js b/src/adonisjs/database/seeds/InitialSeeder.js index 4dfe1f2..6d8b8d3 100644 --- a/src/adonisjs/database/seeds/InitialSeeder.js +++ b/src/adonisjs/database/seeds/InitialSeeder.js @@ -13,38 +13,37 @@ /** @type {import('@adonisjs/lucid/src/Factory')} */ const Factory = use('Factory') -const Property = use('App/Models/Property'); -const CaseArtifacts = use('App/Models/CaseArtifact'); -const CaseVersion = use('App/Models/v1/CaseVersion'); -const Case = use('App/Models/v1/Case'); -const User = use('App/Models/v1/User'); -const Quest = use('App/Models/v1/Quest'); -const Artifact = use('App/Models/v1/Artifact'); -const Role = use('App/Models/v1/Role'); - -const fs = require('fs'); -const uuidv4 = require('uuid/v4'); +const Property = use('App/Models/Property') +const CaseArtifacts = use('App/Models/CaseArtifact') +const CaseVersion = use('App/Models/v1/CaseVersion') +const Case = use('App/Models/v1/Case') +const User = use('App/Models/v1/User') +const Quest = use('App/Models/v1/Quest') +const Artifact = use('App/Models/v1/Artifact') +const Role = use('App/Models/v1/Role') + +const fs = require('fs') +const uuidv4 = require('uuid/v4') const Hash = use('Hash') -const Drive = use('Drive'); +const Drive = use('Drive') const Database = use('Database') -const Helpers = use('Helpers') +const Helpers = use('Helpers') -const ARTIFACTS_DIR = "/resources/artifacts/" +const ARTIFACTS_DIR = '/resources/artifacts/' class UserSeeder { - async run() { + async run () { let trx = await Database.beginTransaction() - try{ - let jacinto = await User.findBy('username', 'jacinto') + try { + const jacinto = await User.findBy('username', 'jacinto') - if (jacinto == null){ + if (jacinto == null) { + const user = await this.seed_default_users(trx) - let user = await this.seed_default_users(trx) + const c = await this.seed_default_case(trx) - let c = await this.seed_default_case(trx) - - let artifact = await this.seed_artifact(c, trx) + const artifact = await this.seed_artifact(c, trx) await user.artifacts().save(artifact, trx) await user.save(trx) @@ -54,33 +53,96 @@ class UserSeeder { row.role = AUTHOR }, trx) - let roles = await this.seed_roles(trx) + const roles = await this.seed_roles(trx) - let quest = new Quest() - quest.id = await uuidv4() + const quest = new Quest() + quest.id = 'default-quest' quest.title = 'default-quest' quest.color = '#505050' - //let artifactQuestId = await uuidv4() - let artifactDefaultId = 'default-quest-image-00000-0000-00000' + // let artifactQuestId = await uuidv4() + const artifactDefaultId = 'default-quest-image' - let fileName = artifactDefaultId + ".png" - let questRelativePath = ARTIFACTS_DIR + const fileName = artifactDefaultId + '.png' + const questRelativePath = ARTIFACTS_DIR - let artifactDefault = new Artifact() - artifactDefault.id = artifactDefaultId + const artifactDefault = new Artifact() + artifactDefault.id = artifactDefaultId artifactDefault.relative_path = questRelativePath + fileName - let fsPath = Helpers.publicPath('/resources/artifacts/') + const fsPath = Helpers.publicPath('/resources/artifacts/') - await Drive.copy(Helpers.resourcesPath('imgs/default-quest.png'), fsPath + fileName ) + await Drive.copy(Helpers.resourcesPath('imgs/default-quest.png'), fsPath + fileName) await quest.artifact().associate(artifactDefault, trx) - await user.artifacts().save(artifactDefault, trx) + await user.artifacts().save(artifactDefault, trx) await quest.save(trx) + // Adding default quests information + const quests = [ + { + id: 'quiz-da-emergencia', + title: 'Quiz da Emergência', + color: '#e64e31', + artifactId: 'quiz-da-emergencia', + url: 'imgs/quiz-emergencia.png' + + }, + { + id: 'desafio-de-eletrocardiograma', + title: 'Desafio de Eletrocardiograma', + color: '#ae9e00', + artifactId: 'desafio-de-eletrocardiograma', + url: 'imgs/desafio-eletro.png' + }, + { + id: 'desafio-radiologico', + title: 'Desafio Radiológico', + color: '#348f00', + artifactId: 'desafio-radiologico', + url: 'imgs/desafio-radio.png' + }, + { + id: 'visita-virtual', + title: 'Visita Virtual', + color: '#245797', + artifactId: 'visita-virtual', + url: 'imgs/visita-virtual.png' + }, + { + id: 'decisoes-extremas', + title: 'Decisões Extremas', + color: '#a34fa3', + artifactId: 'decisoes-extremas', + url: 'imgs/decisoes-extremas.png' + } + ] + + // Adding default quests in DB + + for (var q in quests) { + const _quest = new Quest() + _quest.id = quests[q].id + _quest.title = quests[q].title + _quest.color = quests[q].color + const _artifactDefault = new Artifact() + let _artifactDefaultId = quests[q].artifactId + + _artifactDefaultId = quests[q].id + const _fileName = _artifactDefaultId + '.png' + _artifactDefault.id = _artifactDefaultId + _artifactDefault.relative_path = questRelativePath + _fileName + + await Drive.copy(Helpers.resourcesPath(quests[q].url), fsPath + _fileName) + await _quest.artifact().associate(_artifactDefault, trx) + await user.artifacts().save(_artifactDefault, trx) + await _quest.save(trx) + await user.quests().attach([_quest.id], (row) => { + row.role = 0 + }, trx) + } await trx.commit() trx = await Database.beginTransaction() @@ -91,20 +153,20 @@ class UserSeeder { row.order_position = 0 }, trx) - await user.quests().attach([quest.id], (row) => { - row.role = 0 }, trx) + await user.quests().attach(['default-quest'], (row) => { + row.role = 0 + }, trx) // await user.quests().attach([quest.id], (row) => { // row.role = 2 - // }, trx) + // }, trx) await trx.commit() } else { console.log('Database is already populated') trx.commit() } - - } catch(e){ + } catch (e) { console.log('Error on seed process. Transactions rolled back. Log:') console.log(e) @@ -112,26 +174,33 @@ class UserSeeder { } } - async seed_default_users(trx){ - try{ - let user = new User() - user.username = 'jacinto' - user.login = 'jacinto' - user.email = 'jacinto@email.com' - user.password = 'jacinto' + async seed_default_quests (trx) { + try { - user.id = await uuidv4() + } catch (e) { - return user - } catch (e){ - console.log(e) } } - async seed_default_case(trx){ - try{ + async seed_default_users (trx) { + try { + const user = new User() + user.username = 'jacinto' + user.login = 'jacinto' + user.email = 'jacinto@email.com' + user.password = 'jacinto' - let c = new Case() + user.id = await uuidv4() + + return user + } catch (e) { + console.log(e) + } + } + + async seed_default_case (trx) { + try { + const c = new Case() c.title = 'default-case' c.description = 'Case for tests' c.language = 'pt-br' @@ -140,35 +209,34 @@ class UserSeeder { c.keywords = 'keyword1; keyword2' c.id = await uuidv4() - let cv = new CaseVersion() + const cv = new CaseVersion() cv.source = fs.readFileSync(Helpers.resourcesPath('case.md'), 'utf8') cv.id = await uuidv4() await c.versions().save(cv, trx) return c - } catch (e){ + } catch (e) { console.log(e) } } - async seed_artifact(c, trx){ - try{ - - const artifact_id = await uuidv4() - let fileName = artifact_id + ".png" + async seed_artifact (c, trx) { + try { + const artifact_id = await uuidv4() + const fileName = artifact_id + '.png' - let fs_path = Helpers.publicPath('/resources/artifacts/cases/') + c.id + '/' + const fs_path = Helpers.publicPath('/resources/artifacts/cases/') + c.id + '/' - let case_relative_path = ARTIFACTS_DIR + 'cases/' + c.id + '/' + const case_relative_path = ARTIFACTS_DIR + 'cases/' + c.id + '/' - let artifact = new Artifact() - artifact.id = await uuidv4() + const artifact = new Artifact() + artifact.id = await uuidv4() artifact.relative_path = case_relative_path + fileName - await Drive.copy(Helpers.resourcesPath('imgs/default-image.png'), fs_path + fileName ) + await Drive.copy(Helpers.resourcesPath('imgs/default-image.png'), fs_path + fileName) - let ca = new CaseArtifacts() + const ca = new CaseArtifacts() ca.case_id = c.id await ca.artifact().associate(artifact, trx) @@ -183,28 +251,25 @@ class UserSeeder { // row.value = 'square' // }, trx) - return artifact - } catch (e){ + } catch (e) { console.log(e) } } - async seed_roles(trx){ - let admin = {name: 'Administrator', slug: 'admin', description: 'system admin', id: await uuidv4()} - let author = {name: 'Case Author', slug: 'author', description: 'user who write cases', id: await uuidv4()} - let player = {name: 'Player', slug: 'player', description: 'user who read cases', id: await uuidv4()} + async seed_roles (trx) { + const admin = { name: 'Administrator', slug: 'admin', description: 'system admin', id: await uuidv4() } + const author = { name: 'Case Author', slug: 'author', description: 'user who write cases', id: await uuidv4() } + const player = { name: 'Player', slug: 'player', description: 'user who read cases', id: await uuidv4() } - let roles = await Factory.model('App/Models/v1/Role').makeMany(3, [admin, author, player]) + const roles = await Factory.model('App/Models/v1/Role').makeMany(3, [admin, author, player]) await roles[0].save(trx) await roles[1].save(trx) await roles[2].save(trx) return roles - } - } module.exports = UserSeeder diff --git a/src/adonisjs/resources/imgs/decisoes-extremas.png b/src/adonisjs/resources/imgs/decisoes-extremas.png new file mode 100644 index 0000000000000000000000000000000000000000..e3e3ad93f37e8347220a1dac8cafda182acfe073 GIT binary patch literal 24362 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 z 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 Date: Wed, 9 Sep 2020 18:06:18 -0300 Subject: [PATCH 3/4] feat (destroy quest): feat detroy quest --- .../Controllers/Http/v1/QuestController.js | 281 ++++++++++-------- 1 file changed, 164 insertions(+), 117 deletions(-) diff --git a/src/adonisjs/app/Controllers/Http/v1/QuestController.js b/src/adonisjs/app/Controllers/Http/v1/QuestController.js index a2de855..cda2ef4 100644 --- a/src/adonisjs/app/Controllers/Http/v1/QuestController.js +++ b/src/adonisjs/app/Controllers/Http/v1/QuestController.js @@ -6,148 +6,195 @@ const Database = use('Database') -const Quest = use('App/Models/v1/Quest'); -const User = use('App/Models/v1/User'); -const Case = use('App/Models/v1/Case'); -const Role = use('App/Models/v1/Role'); +const Quest = use('App/Models/v1/Quest') +const User = use('App/Models/v1/User') +const Case = use('App/Models/v1/Case') +const Role = use('App/Models/v1/Role') +const Artifact = use('App/Models/v1/Artifact') -const uuidv4 = require('uuid/v4'); +const uuidv4 = require('uuid/v4') class QuestController { - - async index({ response }) { - try{ - let quests = await Quest.all() - return response.json(quests) - } catch(e){ - return response.status(e.status).json({ message: e.message }) - } + async index ({ response }) { + try { + const quests = await Quest.all() + return response.json(quests) + } catch (e) { + return response.status(e.status).json({ message: e.message }) } + } + + async store ({ request, response, auth }) { + const trx = await Database.beginTransaction() + try { + const user = auth.user + + const quest = new Quest() + quest.id = await uuidv4() + + const q = request.all() + q.color = q.color ? q.color : '#505050' + q.artifact_id = q.artifact_id ? q.artifact_id : 'default-quest-image' + // if(q.color == null || q.color =='') + // q.color = '#505050' + // if(q.artifact_id == null || q.artifact_id =='') + // q.artifact_id = 'default-quest-image-00000-0000-00000' + + quest.merge(q) + + await quest.save(trx) + await user.quests().attach([quest.id], (row) => { + row.role = 0 + }, trx) + trx.commit() + + return response.json(quest) + } catch (e) { + trx.rollback() + console.log(e) + + if (e.code === 'ER_DUP_ENTRY') { + return response.status(409).json({ code: e.code, message: e.sqlMessage }) + } + return response.status(e.status).json({ message: e.message }) + } + } + async update ({ params, request, response }) { + try { + const q = await Quest.find(params.id) - async store({ request, response, auth }) { - let trx = await Database.beginTransaction() - try{ - let user = auth.user - - let quest = new Quest() - quest.id = await uuidv4() - - let q = request.all() - q.color = q.color ? q.color : '#505050' - q.artifact_id = q.artifact_id ? q.artifact_id : 'default-quest-image-00000-0000-00000' - // if(q.color == null || q.color =='') - // q.color = '#505050' - // if(q.artifact_id == null || q.artifact_id =='') - // q.artifact_id = 'default-quest-image-00000-0000-00000' - - quest.merge(q) - - await quest.save(trx) - await user.quests().attach([quest.id], (row) => { - row.role = 0 - }, trx) - trx.commit() - - return response.json(quest) - } catch(e){ - trx.rollback() - console.log(e) + if (q != null) { + q.title = request.input('title') + q.color = request.input('color') - if (e.code === 'ER_DUP_ENTRY') { - return response.status(409).json({ code: e.code, message: e.sqlMessage }) - } - return response.status(e.status).json({ message: e.message }) - } + await q.save() + return response.json(q) + } else return response.status(500).json('quest not found, update failed') + } catch (e) { + console.log(e) + return response.status(500).json({ message: e }) } - - async linkUser({ request, response }) { - try { - const {userId, questId, roleSlug} = request.post() - let user = await User.find(userId) - let quest = await Quest.find(questId) - let role = await Role.findBy('slug', roleSlug) - - if (role == null) - return response.status(500).json('Invalid roleSlug') - - if (await user.checkRole(role.slug)){ - await user.quests().attach([quest.id], (row) => { - console.log('--------------------- await promisse OK') - - if (role.slug == 'author'){ - row.role = 1 - } - if (role.slug == 'player'){ - row.role = 2 - } - console.log('--------------------- promisse EXECUTED') - }) - - console.log(3) - return response.json(role.slug + ' ' + user.username + ' was added to the quest '+ quest.title) - } else { - console.log(e) - return response.status(500).json('target user must have ' + role.slug + ' role') - } - } catch (e) { - console.log(e) - return response.status(500).json(e) - } + } + + async destroy ({ params, response }) { + const trx = await Database.beginTransaction() + try { + const q = await Quest.findBy('id', params.id) + + if (q != null) { + console.log('===== Deleting quest...') + console.log(q) + await q.users().detach() + await q.cases().detach() + let artifact = await Artifact.find(q.artifact_id) + await q.artifact().dissociate() + await artifact.delete(trx) + await q.delete(trx) + + // await c.users().detach() + // await c.quests().detach() + // await c.artifacts().delete() + // + // await c.delete(trx) + + trx.commit() + return response.json('Quest deletion successfull') + } else { + trx.rollback() + return response.status(500).json('quest not found') + } + } catch (e) { + trx.rollback() + + console.log(e) + return response.status(500).json({ message: e }) + } + } + + async linkUser ({ request, response }) { + try { + const { userId, questId, roleSlug } = request.post() + const user = await User.find(userId) + const quest = await Quest.find(questId) + const role = await Role.findBy('slug', roleSlug) + + if (role == null) { return response.status(500).json('Invalid roleSlug') } + + if (await user.checkRole(role.slug)) { + await user.quests().attach([quest.id], (row) => { + console.log('--------------------- await promisse OK') + + if (role.slug == 'author') { + row.role = 1 + } + if (role.slug == 'player') { + row.role = 2 + } + console.log('--------------------- promisse EXECUTED') + }) + + console.log(3) + return response.json(role.slug + ' ' + user.username + ' was added to the quest ' + quest.title) + } else { + console.log(e) + return response.status(500).json('target user must have ' + role.slug + ' role') + } + } catch (e) { + console.log(e) + return response.status(500).json(e) } + } - async linkCase({ request, response }) { - try { - const {questId, caseId, orderPosition} = request.post() + async linkCase ({ request, response }) { + try { + const { questId, caseId, orderPosition } = request.post() - // let c = await Case.find(case_id) - let quest = await Quest.find(questId) + // let c = await Case.find(case_id) + const quest = await Quest.find(questId) - await quest.cases().attach(caseId, (row) => { - row.order_position = orderPosition - }) + await quest.cases().attach(caseId, (row) => { + row.order_position = orderPosition + }) - quest.cases = await quest.cases().fetch() + quest.cases = await quest.cases().fetch() - return response.json(quest) - } catch (e) { - console.log(e) - if (e.code === 'ER_DUP_ENTRY') { - return response.status(409).json({ message: e.message }) - } + return response.json(quest) + } catch (e) { + console.log(e) + if (e.code === 'ER_DUP_ENTRY') { + return response.status(409).json({ message: e.message }) + } - return response.status(500).json( e ) - } + return response.status(500).json(e) } + } + async listUsers ({ request, response }) { + try { + const questId = request.input('questId') - async listUsers({ request, response }) { - try{ - let questId = request.input('questId') + const quest = await Quest.find(questId) - let quest = await Quest.find(questId) - - return response.json(await quest.users().fetch()) - } catch(e){ - console.log(e) - return response.status(500).json(e) - } + return response.json(await quest.users().fetch()) + } catch (e) { + console.log(e) + return response.status(500).json(e) } + } + async listCases ({ request, response }) { + try { + const questId = request.input('questId') - async listCases({ request, response }) { - try{ - let questId = request.input('questId') - - let quest = await Quest.find(questId) + const quest = await Quest.find(questId) - return response.json(await quest.cases().fetch()) - } catch(e){ - console.log(e) - } + return response.json(await quest.cases().fetch()) + } catch (e) { + console.log(e) } - + } } module.exports = QuestController From da5f6c6d7592c58db1a786d24ed99009b2445177 Mon Sep 17 00:00:00 2001 From: Heitor Mattosinho Date: Wed, 9 Sep 2020 18:07:21 -0300 Subject: [PATCH 4/4] fix (format): harena-manager to standard style --- .../app/Controllers/Http/AuthController.js | 88 +- .../app/Controllers/Http/TestController.js | 88 +- .../Controllers/Http/v1/AdminController.js | 167 +- .../Controllers/Http/v1/ArtifactController.js | 143 +- .../app/Controllers/Http/v1/AuthController.js | 64 +- .../app/Controllers/Http/v1/CaseController.js | 104 +- .../Http/v1/InstitutionController.js | 17 +- .../app/Controllers/Http/v1/UserController.js | 146 +- .../Middleware/CheckPermissionForGivenCase.js | 49 +- .../Middleware/CheckUserQuestPermission.js | 50 +- src/adonisjs/app/Models/CaseArtifact.js | 6 +- src/adonisjs/app/Models/Hooks/UserHook.js | 2 +- src/adonisjs/app/Models/Property.js | 8 +- src/adonisjs/app/Models/Token.js | 6 +- src/adonisjs/app/Models/Traits/NoTimestamp.js | 6 +- src/adonisjs/app/Models/v1/Artifact.js | 15 +- src/adonisjs/app/Models/v1/Case.js | 46 +- src/adonisjs/app/Models/v1/CaseVersion.js | 26 +- src/adonisjs/app/Models/v1/Institution.js | 6 +- src/adonisjs/app/Models/v1/Permission.js | 6 +- src/adonisjs/app/Models/v1/Quest.js | 48 +- src/adonisjs/app/Models/v1/Role.js | 54 +- src/adonisjs/app/Models/v1/Token.js | 6 +- src/adonisjs/app/Models/v1/User.js | 134 +- .../app/Services/CloudinaryService.js | 8 +- src/adonisjs/config/app.js | 1 - src/adonisjs/config/auth.js | 4 +- src/adonisjs/config/cors.js | 2 +- src/adonisjs/config/session.js | 2 +- src/adonisjs/database/factory.js | 41 +- ...995817552_create_new_permissions_schema.js | 44 +- .../migrations/1593910551912_course_schema.js | 6 +- .../migrations/1594004809130_kos_schema.js | 2 +- .../migrations/1594005111091_type_schema.js | 2 +- .../1594005305846_property_schema.js | 4 +- .../migrations/1594005431781_term_schema.js | 2 +- ...1594036153079_course_institution_schema.js | 6 +- .../migrations/1594320151218_user_schema.js | 4 +- .../1594320921120_case_version_schema.js | 2 +- .../1594320979254_artifact_schema.js | 8 +- .../1594321032600_quests_cases_schema.js | 4 +- .../1594321554864_user_property_schema.js | 10 +- .../1594321623172_case_property_schema.js | 4 +- .../1594321905326_create_role_user_schema.js | 4 +- .../migrations/1595525775363_token_schema.js | 2 +- .../1595939263063_quests_users_schema.js | 4 +- .../1595940026109_users_cases_schema.js | 4 +- ...871_artifact_update_add_drop_attributes.js | 4 +- .../1598996196411_case_artifacts_schema.js | 4 +- ...update_add_artifact_relationship_schema.js | 4 +- .../database/seeds/RollbackInitialSeeder.js | 43 +- .../UniversidadeDoMinhoRollbackSeeder.js | 57 +- .../seeds/UniversidadeDoMinhoSeeder.js | 60 +- .../database/seeds/defaultQuests.json | 38 + src/adonisjs/package-lock.json | 2471 ++++++++++++++--- src/adonisjs/package.json | 12 +- src/adonisjs/start/routes.js | 35 +- 57 files changed, 2948 insertions(+), 1235 deletions(-) create mode 100644 src/adonisjs/database/seeds/defaultQuests.json diff --git a/src/adonisjs/app/Controllers/Http/AuthController.js b/src/adonisjs/app/Controllers/Http/AuthController.js index 30be87c..275af93 100644 --- a/src/adonisjs/app/Controllers/Http/AuthController.js +++ b/src/adonisjs/app/Controllers/Http/AuthController.js @@ -2,59 +2,51 @@ const Logger = use('Logger') -const User = use('App/Models/v1/User'); +const User = use('App/Models/v1/User') class AuthController { - async login({ request, auth, response, session }) { - console.log('v2/session') - Logger.info('login attempt via v2/auth/login (SESSION)') - try { - let { email, password } = request.all(); - // if (await auth.remember(true).attempt(email, password)) { - if (await auth.remember(true).attempt(email, password)) { - - console.log('------------------------------- attempt') - // console.log(session.all()) - - let user = await User.findBy('email', email) - // let token = await auth.generate(user) - - // let authenticatedUser = new User() - // authenticatedUser.id = user.id - // authenticatedUser.email = user.email - // authenticatedUser.username = user.username - - Object.assign(user, { 'adonisAuth': session.get('adonis-auth') }) - // return response.json('Logged in successfully') - - // let adonis_session = session.get('adonis-auth') - console.log(session.all()) - // console.log(auth) - return response.json(user) - - } - } - catch (e) { - console.log(e) - return response.status(e.status).json({ message: e.message }) - } + async login ({ request, auth, response, session }) { + console.log('v2/session') + Logger.info('login attempt via v2/auth/login (SESSION)') + try { + const { email, password } = request.all() + // if (await auth.remember(true).attempt(email, password)) { + if (await auth.remember(true).attempt(email, password)) { + console.log('------------------------------- attempt') + // console.log(session.all()) + + const user = await User.findBy('email', email) + // let token = await auth.generate(user) + + // let authenticatedUser = new User() + // authenticatedUser.id = user.id + // authenticatedUser.email = user.email + // authenticatedUser.username = user.username + + Object.assign(user, { adonisAuth: session.get('adonis-auth') }) + // return response.json('Logged in successfully') + + // let adonis_session = session.get('adonis-auth') + console.log(session.all()) + // console.log(auth) + return response.json(user) + } + } catch (e) { + console.log(e) + return response.status(e.status).json({ message: e.message }) } + } - async logout({ auth, response }) { - try{ - await auth.logout() - - return response.json('Logged out successfuly') - }catch(e){ - console.log(e) - return response.status(500).json(e.message) - } - + async logout ({ auth, response }) { + try { + await auth.logout() + + return response.json('Logged out successfuly') + } catch (e) { + console.log(e) + return response.status(500).json(e.message) } + } } module.exports = AuthController - - - - diff --git a/src/adonisjs/app/Controllers/Http/TestController.js b/src/adonisjs/app/Controllers/Http/TestController.js index 18d0094..e786d21 100644 --- a/src/adonisjs/app/Controllers/Http/TestController.js +++ b/src/adonisjs/app/Controllers/Http/TestController.js @@ -1,52 +1,52 @@ 'use strict' -const Case = use('App/Models/v1/Case'); -const CloudinaryService = use('App/Services/CloudinaryService'); +const Case = use('App/Models/v1/Case') +const CloudinaryService = use('App/Services/CloudinaryService') class TestController { - async test() { - console.log('Method reached') - - // const profilePic = request.file('profile_pic', { - // types: ['image'], - // size: '2mb' - // }) - - // await profilePic.move(Helpers.tmpPath('uploads'), { - // name: 'custom-name.jpg', - // overwrite: true - // }) - - // if (!profilePic.moved()) { - // return profilePic.error() - // } - // return 'File moved' - } - - async index({ view }) { - const cases = await Case.all(); - // console.log(cases.toJSON()) - return view.render('index', { cases: cases.toJSON() }) - } - - async create({ request, response, view, session }) { - console.log('chegou') - const { name } = request.all(); - const file = request.file('image'); - try { - const cloudinaryResponse = await CloudinaryService.v2.uploader.upload(file.tmpPath, {folder: 'harena'}); - let c = new Case(); - c.name = name; - c.image_url = cloudinaryResponse.secure_url; - await c.save(); - session.flash({success: 'Successfully added case'}); - return response.redirect('back'); - } catch (e) { - console.log(e) - session.flash({error: 'Error Uploading Image'}); - return response.redirect('/') - } + async test () { + console.log('Method reached') + + // const profilePic = request.file('profile_pic', { + // types: ['image'], + // size: '2mb' + // }) + + // await profilePic.move(Helpers.tmpPath('uploads'), { + // name: 'custom-name.jpg', + // overwrite: true + // }) + + // if (!profilePic.moved()) { + // return profilePic.error() + // } + // return 'File moved' + } + + async index ({ view }) { + const cases = await Case.all() + // console.log(cases.toJSON()) + return view.render('index', { cases: cases.toJSON() }) + } + + async create ({ request, response, view, session }) { + console.log('chegou') + const { name } = request.all() + const file = request.file('image') + try { + const cloudinaryResponse = await CloudinaryService.v2.uploader.upload(file.tmpPath, { folder: 'harena' }) + const c = new Case() + c.name = name + c.image_url = cloudinaryResponse.secure_url + await c.save() + session.flash({ success: 'Successfully added case' }) + return response.redirect('back') + } catch (e) { + console.log(e) + session.flash({ error: 'Error Uploading Image' }) + return response.redirect('/') } + } } module.exports = TestController diff --git a/src/adonisjs/app/Controllers/Http/v1/AdminController.js b/src/adonisjs/app/Controllers/Http/v1/AdminController.js index 6d228c4..b8d6e21 100644 --- a/src/adonisjs/app/Controllers/Http/v1/AdminController.js +++ b/src/adonisjs/app/Controllers/Http/v1/AdminController.js @@ -6,113 +6,106 @@ const Database = use('Database') -const Role = use('Adonis/Acl/Role'); -const Permission = use('Adonis/Acl/Permission'); -const User = use('App/Models/v1/User'); +const Role = use('Adonis/Acl/Role') +const Permission = use('Adonis/Acl/Permission') +const User = use('App/Models/v1/User') -const uuidv4 = require('uuid/v4'); +const uuidv4 = require('uuid/v4') class AdminController { + async create_role ({ request, response }) { + try { + const role = new Role() + role.id = await uuidv4() - async create_role({ request, response }) { - try { + const r = request.all() + role.merge(r) - let role = new Role() - role.id = await uuidv4() + await role.save() - let r = request.all() - role.merge(r) + return response.json(role) + } catch (e) { + console.log(e) - await role.save() - - return response.json(role) - } catch(e){ - console.log(e) - - if (e.code === 'ER_DUP_ENTRY') { - return response.status(409).json({ code: e.code, message: e.sqlMessage }) - } - return response.status(500).json({ message: e.toString() }) - } + if (e.code === 'ER_DUP_ENTRY') { + return response.status(409).json({ code: e.code, message: e.sqlMessage }) + } + return response.status(500).json({ message: e.toString() }) } - - - async linkRoleUser({ request, response }) { - try { - const {userId, roleId} = request.post() - let user = await User.find(userId) - let role = await Role.find(roleId) - - await user.roles().attach(role.id) - return response.json(role.slug + ' role has given to the user ' + user.username) - } catch (e) { - console.log(e) - return response.status(500).json(e) - } + } + + async linkRoleUser ({ request, response }) { + try { + const { userId, roleId } = request.post() + const user = await User.find(userId) + const role = await Role.find(roleId) + + await user.roles().attach(role.id) + return response.json(role.slug + ' role has given to the user ' + user.username) + } catch (e) { + console.log(e) + return response.status(500).json(e) } + } - async link_role_permission({ request, response }) { - try { - const {permission_id, role_id} = request.post() - let permission = await User.find(permission_id) - let role = await Role.find(role_id) + async link_role_permission ({ request, response }) { + try { + const { permission_id, role_id } = request.post() + const permission = await User.find(permission_id) + const role = await Role.find(role_id) - await role.permissions().attach(permission.id) + await role.permissions().attach(permission.id) - role.permissions = await role.permissions().fetch() + role.permissions = await role.permissions().fetch() - return response.json(role) - } catch (e) { - console.log(e) - if (e.code === 'ER_DUP_ENTRY') { - return response.status(409).json({ message: e.message }) - } + return response.json(role) + } catch (e) { + console.log(e) + if (e.code === 'ER_DUP_ENTRY') { + return response.status(409).json({ message: e.message }) + } - return response.status(500).json({ message: e.toString() }) - } + return response.status(500).json({ message: e.toString() }) } - - async list_roles({ response }) { - try{ - let roles = await Role.all() - return response.json(roles) - } catch(e){ - return response.status(500).json({ message: e.toString() }) - } + } + + async list_roles ({ response }) { + try { + const roles = await Role.all() + return response.json(roles) + } catch (e) { + return response.status(500).json({ message: e.toString() }) } + } + async list_roles_by_user ({ params, response }) { + try { + const user = await User.find(params.id) - - async list_roles_by_user({ params, response }) { - try{ - let user = await User.find(params.id) - - return response.json(await user.roles().fetch()) - } catch(e){ - console.log(e) - return response.status(500).json({ message: e.toString() }) - } + return response.json(await user.roles().fetch()) + } catch (e) { + console.log(e) + return response.status(500).json({ message: e.toString() }) } - - - - async revoke_tokens({ auth, params, response }) { - try{ - // await user.tokens().update({ is_revoked: true }) -// console.log('antes') -// console.log(await auth.listTokens()) -// // const affectedRows = await Database -// // .table('tokens').update('is_revoked', true) -// // console.log(affectedRows) -// console.log('depois') -// console.log(await auth.listTokens()) -await auth.revokeTokens() - return response.json('tokens revoked') - } catch(e){ - console.log(e) - return response.status(500).json({ message: e.message }) - } + } + + async revoke_tokens ({ auth, params, response }) { + try { + // await user.tokens().update({ is_revoked: true }) + // console.log('antes') + // console.log(await auth.listTokens()) + // // const affectedRows = await Database + // // .table('tokens').update('is_revoked', true) + // // console.log(affectedRows) + // console.log('depois') + // console.log(await auth.listTokens()) + await auth.revokeTokens() + return response.json('tokens revoked') + } catch (e) { + console.log(e) + return response.status(500).json({ message: e.message }) } + } } module.exports = AdminController diff --git a/src/adonisjs/app/Controllers/Http/v1/ArtifactController.js b/src/adonisjs/app/Controllers/Http/v1/ArtifactController.js index 1633513..860ca7f 100644 --- a/src/adonisjs/app/Controllers/Http/v1/ArtifactController.js +++ b/src/adonisjs/app/Controllers/Http/v1/ArtifactController.js @@ -1,108 +1,101 @@ 'use strict' -const Helpers = use('Helpers') -const Env = use('Env') -const uuid4 = require('uuid/v4'); +const Helpers = use('Helpers') +const Env = use('Env') +const uuid4 = require('uuid/v4') -const Artifact = use('App/Models/v1/Artifact'); -const Case = use('App/Models/v1/Case'); -const Quest = use('App/Models/v1/Quest'); -const CaseArtifacts = use('App/Models/CaseArtifact'); +const Artifact = use('App/Models/v1/Artifact') +const Case = use('App/Models/v1/Case') +const Quest = use('App/Models/v1/Quest') +const CaseArtifacts = use('App/Models/CaseArtifact') class ArtifactController { - - constructor(){ + constructor () { // See this for more on MIM types: https://docs.openx.com/Content/publishers/adunit_linearvideo_mime_types.html - this.validationOptions = { - size: '100mb', - types: ['image','video'], - extnames: ['png', 'jpg', 'jpeg', 'gif','mp4','avi', '.wmv'] + this.validationOptions = { + size: '100mb', + types: ['image', 'video'], + extnames: ['png', 'jpg', 'jpeg', 'gif', 'mp4', 'avi', '.wmv'] } - this.relativePath = '/resources/artifacts/' - this.baseUrl = Env.getOrFail('APP_URL') + this.relativePath = '/resources/artifacts/' + this.baseUrl = Env.getOrFail('APP_URL') } + async store ({ request, auth, response }) { + try { + const file = request.file('file', this.validationOptions) + const questId = request.input('questId') + const caseId = request.input('caseId', null) - async store({ request, auth, response }) { - try{ - - - let file = request.file('file', this.validationOptions) - let questId = request.input('questId') - let caseId = request.input('caseId', null) - - let artifactId = await uuid4() - let artifactFileName = artifactId + "." + file.extname - let fs_path = Helpers.publicPath(this.relativePath) + const artifactId = await uuid4() + const artifactFileName = artifactId + '.' + file.extname + let fs_path = Helpers.publicPath(this.relativePath) - let artifact = new Artifact() - artifact.id = artifactId + const artifact = new Artifact() + artifact.id = artifactId - let bodyMessage = { filename: artifactFileName, + const bodyMessage = { + filename: artifactFileName, size_in_bytes: file.size, - type: file.type, - subtype: file.subtype, - extension: file.extname, - status: file.status + type: file.type, + subtype: file.subtype, + extension: file.extname, + status: file.status } - if (caseId != null && questId == null){ - var c = await Case.find(caseId) - - if (c == null) - return response.json({ message: "Case id not found" }) - - fs_path += 'cases/' + caseId + '/' - let case_relative_path = this.relativePath + 'cases/' + caseId + '/' - - artifact.relative_path = case_relative_path + artifactFileName - - let ca = new CaseArtifacts() + if (caseId != null && questId == null) { + var c = await Case.find(caseId) + + if (c == null) { return response.json({ message: 'Case id not found' }) } + + fs_path += 'cases/' + caseId + '/' + const case_relative_path = this.relativePath + 'cases/' + caseId + '/' + + artifact.relative_path = case_relative_path + artifactFileName + + const ca = new CaseArtifacts() ca.case_id = c.id - await ca.artifact().associate(artifact) + await ca.artifact().associate(artifact) + + bodyMessage.case = c + bodyMessage.url = this.baseUrl + artifact.relative_path + } - bodyMessage.case = c - bodyMessage.url = this.baseUrl+artifact.relative_path - } + if (questId != null && caseId == null) { + var quest = await Quest.find(questId) - if (questId != null && caseId == null){ - var quest = await Quest.find(questId) + if (quest == null) { + return response.json({ message: 'Quest id not found' }) + } - if (quest == null){ - return response.json({ message: "Quest id not found" }) - } + const questRelativePath = this.relativePath + 'quests/' + quest.id + '/' - let questRelativePath = this.relativePath + 'quests/' + quest.id + '/' + artifact.relative_path = questRelativePath + artifactFileName - artifact.relative_path = questRelativePath + artifactFileName - - await quest.artifact().associate(artifact) + await quest.artifact().associate(artifact) - fs_path += 'quests/' + quest.id + '/' + fs_path += 'quests/' + quest.id + '/' - bodyMessage.quest = quest - bodyMessage.url = this.baseUrl+artifact.relative_path - } + bodyMessage.quest = quest + bodyMessage.url = this.baseUrl + artifact.relative_path + } - if (questId == null && caseId == null){ - artifact.relative_path = this.relativePath + artifactFileName - bodyMessage.url = this.baseUrl+artifact.relative_path - } + if (questId == null && caseId == null) { + artifact.relative_path = this.relativePath + artifactFileName + bodyMessage.url = this.baseUrl + artifact.relative_path + } - await file.move(fs_path, {name: artifactFileName, overwrite: false}) - await auth.user.artifacts().save(artifact) + await file.move(fs_path, { name: artifactFileName, overwrite: false }) + await auth.user.artifacts().save(artifact) - return response.json(bodyMessage) - - } catch(e){ - console.log(e) - return response.status(e.status).json({ message: e.message }) + return response.json(bodyMessage) + } catch (e) { + console.log(e) + return response.status(e.status).json({ message: e.message }) } } - } module.exports = ArtifactController - diff --git a/src/adonisjs/app/Controllers/Http/v1/AuthController.js b/src/adonisjs/app/Controllers/Http/v1/AuthController.js index ab1e8f4..1ec2d37 100644 --- a/src/adonisjs/app/Controllers/Http/v1/AuthController.js +++ b/src/adonisjs/app/Controllers/Http/v1/AuthController.js @@ -1,62 +1,58 @@ 'use strict' -const User = use('App/Models/v1/User'); -const Token = use('App/Models/v1/Token'); +const User = use('App/Models/v1/User') +const Token = use('App/Models/v1/Token') const Logger = use('Logger') class AuthController { - - async checkToken({request, auth, response}){ + async checkToken ({ request, auth, response }) { try { - console.log('=================Checking token...'); + console.log('====Checking token...') await auth.check() - response.json('token valid'); + response.json('token valid') + console.log('====Token valid') } catch (error) { - response.json('token invalid') + console.log('====Token invalid') } } - async login({ request, auth, response }) { + async login ({ request, auth, response }) { // console.log(request.all()) Logger.info('login attempt via v1/auth/login (JWT)') - let { email, password, refresh_token } = request.all(); + let { email, password, refresh_token } = request.all() console.log(password) - let user = "" - let token = "" + let user = '' + let token = '' - try{ + try { await auth.check() return response.json('user is signed already') - } catch(e) { - + } catch (e) { // token expired - if (e.code == 'E_JWT_TOKEN_EXPIRED'){ + if (e.code == 'E_JWT_TOKEN_EXPIRED') { token = await auth.generateForRefreshToken(refresh_token) Object.entries(token).forEach(entry => { - if (entry[0] == 'refreshToken'){ + if (entry[0] == 'refreshToken') { refresh_token = entry[1] } - }); + }) Logger.info('expired token') - } // unloged user - if (e.code == 'E_INVALID_JWT_TOKEN'){ - try{ + if (e.code == 'E_INVALID_JWT_TOKEN') { + try { token = await auth.withRefreshToken().attempt(email, password) Logger.info('newly generated token') - - } catch(e){ + } catch (e) { console.log(e) } } // generic error - if (token == "") - return response.status(e.status).json(e.message) + if (token == '') { return response.status(e.status).json(e.message) } user = await User.findBy('email', email) Object.assign(user, token) @@ -65,33 +61,31 @@ class AuthController { } } - async login2({ request, auth, response }) { - try{ - let refresh_token = request.input('access_code'); + async login2 ({ request, auth, response }) { + try { + const refresh_token = request.input('access_code') - let token = await auth.generateForRefreshToken(refresh_token) + const token = await auth.generateForRefreshToken(refresh_token) return response.json(token) - }catch(e){ + } catch (e) { console.log(e) return response.status(500).json(e.message) } - } - async logout({ auth, response }) { - try{ + async logout ({ auth, response }) { + try { Logger.info('logout attempt via v1/auth/logout (JWT)') const refreshToken = auth.getAuthHeader() - //console.log(refreshToken); + // console.log(refreshToken); await auth.revokeTokens(refreshToken) return response.json('successfull logout') - }catch(e){ + } catch (e) { console.log(e) return response.status(500).json(e.message) } - } } diff --git a/src/adonisjs/app/Controllers/Http/v1/CaseController.js b/src/adonisjs/app/Controllers/Http/v1/CaseController.js index 1c8df5c..467e55d 100644 --- a/src/adonisjs/app/Controllers/Http/v1/CaseController.js +++ b/src/adonisjs/app/Controllers/Http/v1/CaseController.js @@ -6,21 +6,20 @@ const Database = use('Database') -const User = use('App/Models/v1/User'); -const Case = use('App/Models/v1/Case'); +const User = use('App/Models/v1/User') +const Case = use('App/Models/v1/Case') const CaseVersion = use('App/Models/v1/CaseVersion') -const uuidv4 = require('uuid/v4'); +const uuidv4 = require('uuid/v4') /** * Resourceful controller for interacting with cases */ class CaseController { - /** Show a list of all cases */ - async index({ request, response, }) { + async index ({ request, response }) { try { - let cases = await Case.all() + const cases = await Case.all() return response.json(cases) - } catch(e){ + } catch (e) { return response.status(500).json({ message: e.message }) } } @@ -34,16 +33,15 @@ class CaseController { * @param {Response} ctx.response * @param {View} ctx.view */ - async show({ params, response }) { + async show ({ params, response }) { try { + const c = await Case.find(params.id) - let c = await Case.find( params.id ) - - if (c != null){ - let versions = await CaseVersion.query() - .where('case_id', '=', params.id ) - .orderBy('created_at', 'asc') - .fetch() + if (c != null) { + const versions = await CaseVersion.query() + .where('case_id', '=', params.id) + .orderBy('created_at', 'asc') + .fetch() c.source = versions.last().source c.versions = versions @@ -54,13 +52,13 @@ class CaseController { } } - /** * Create/save a new case.*/ - async store({ request, auth, response }) { + /** * Create/save a new case. */ + async store ({ request, auth, response }) { try { // let c = await Case.findBy('title', request.input('title')) // if (c == null) { - let c = new Case() + const c = new Case() c.id = await uuidv4() c.title = request.input('title') c.description = request.input('description') @@ -70,7 +68,7 @@ class CaseController { c.keywords = request.input('keywords') c.original_date = request.input('original_date') - let cv = new CaseVersion() + const cv = new CaseVersion() cv.id = await uuidv4() cv.source = request.input('source') @@ -82,8 +80,7 @@ class CaseController { c.versions = await c.versions().fetch() c.users = await c.users().fetch() return response.json(c) - // } else return response.status(500).json('title already exists') - + // } else return response.status(500).json('title already exists') } catch (e) { console.log(e) return response.status(500).json({ message: e.message }) @@ -91,27 +88,26 @@ class CaseController { } /** * Update case details. PUT or PATCH case/:id */ - async update({ params, request, response }) { + async update ({ params, request, response }) { try { - let c = await Case.find(params.id) - - if (c != null){ - c.title = request.input('title') - c.description = request.input('description') - c.language = request.input('language') - c.domain = request.input('domain') - c.specialty = request.input('specialty') - c.keywords = request.input('keywords') - c.original_date = request.input('originalDate') - - let cv = new CaseVersion() - cv.source = request.input('source') - cv.id = await uuidv4() - await c.versions().save(cv) - await c.save() - return response.json(c) - } else return response.status(500).json('case not found') - + const c = await Case.find(params.id) + + if (c != null) { + c.title = request.input('title') + c.description = request.input('description') + c.language = request.input('language') + c.domain = request.input('domain') + c.specialty = request.input('specialty') + c.keywords = request.input('keywords') + c.original_date = request.input('originalDate') + + const cv = new CaseVersion() + cv.source = request.input('source') + cv.id = await uuidv4() + await c.versions().save(cv) + await c.save() + return response.json(c) + } else return response.status(500).json('case not found') } catch (e) { console.log(e) return response.status(500).json({ message: e }) @@ -126,13 +122,12 @@ class CaseController { * @param {Request} ctx.request * @param {Response} ctx.response */ - async destroy({ params, response }) { + async destroy ({ params, response }) { const trx = await Database.beginTransaction() try { + const c = await Case.findBy('id', params.id) - let c = await Case.findBy('id', params.id) - - if (c != null){ + if (c != null) { await c.versions().delete() await c.users().detach() await c.quests().detach() @@ -154,36 +149,33 @@ class CaseController { } } - async share({ request, auth, response }) { + async share ({ request, auth, response }) { try { - let logged_user = auth.user.id - let {user_id, case_id} = request.post() + const logged_user = auth.user.id + const { user_id, case_id } = request.post() - if (logged_user == user_id){ + if (logged_user == user_id) { return response.status(500).json('cannot share a case with herself') } - let user = await User.find(user_id) + const user = await User.find(user_id) // Check if target user is an author - let sql_return = await Database + const sql_return = await Database .select('slug') .from('roles') .where('slug', '=', 'author') .leftJoin('role_user', 'roles.id', 'role_user.role_id') - .where('role_user.user_id', '=' , user_id) + .where('role_user.user_id', '=', user_id) - if (sql_return[0] != undefined){ + if (sql_return[0] != undefined) { await user.cases().attach(case_id, (row) => { row.role = 1 }) return response.json('case successfully shared') - } else { return response.status(500).json('target user is not an author') } - - } catch (e) { console.log(e) return response.status(e.status).json({ message: e.toString() }) diff --git a/src/adonisjs/app/Controllers/Http/v1/InstitutionController.js b/src/adonisjs/app/Controllers/Http/v1/InstitutionController.js index 97bb86e..2bf94a9 100644 --- a/src/adonisjs/app/Controllers/Http/v1/InstitutionController.js +++ b/src/adonisjs/app/Controllers/Http/v1/InstitutionController.js @@ -1,15 +1,15 @@ 'use strict' -const Institution = use('App/Models/v1/Institution'); +const Institution = use('App/Models/v1/Institution') -const uuidv4 = require('uuid/v4'); +const uuidv4 = require('uuid/v4') class InstitutionController { - async store({ request, response }) { - try{ - let institution = new Institution() + async store ({ request, response }) { + try { + const institution = new Institution() - institution.id = await uuidv4() + institution.id = await uuidv4() institution.acronym = request.input('acronym') institution.title = request.input('title') institution.country = request.input('country') @@ -19,10 +19,9 @@ class InstitutionController { response.json('institution successfully created') } catch (e) { console.log(e) - return response.status(500).json({ message: e.message }) + return response.status(500).json({ message: e.message }) } - } - + } } module.exports = InstitutionController diff --git a/src/adonisjs/app/Controllers/Http/v1/UserController.js b/src/adonisjs/app/Controllers/Http/v1/UserController.js index 24c3b34..7bc8bd0 100644 --- a/src/adonisjs/app/Controllers/Http/v1/UserController.js +++ b/src/adonisjs/app/Controllers/Http/v1/UserController.js @@ -5,16 +5,16 @@ /** @typedef {import('@adonisjs/framework/src/View')} View */ const Database = use('Database') -const Helpers = use('Helpers') +const Helpers = use('Helpers') -const User = use('App/Models/v1/User'); -const Institution = use('App/Models/v1/Institution'); -const Artifact = use('App/Models/v1/Artifact'); -const Quest = use('App/Models/v1/Quest'); -const Property = use('App/Models/Property'); +const User = use('App/Models/v1/User') +const Institution = use('App/Models/v1/Institution') +const Artifact = use('App/Models/v1/Artifact') +const Quest = use('App/Models/v1/Quest') +const Property = use('App/Models/Property') -const uuidv4 = require('uuid/v4'); -const Env = use('Env') +const uuidv4 = require('uuid/v4') +const Env = use('Env') class UserController { /** @@ -26,12 +26,11 @@ class UserController { * @param {Response} ctx.response * @param {View} ctx.view */ - async index({ request, response, view, auth }) { - try{ - - let users = await User.all() + async index ({ request, response, view, auth }) { + try { + const users = await User.all() return response.json(users) - } catch(e){ + } catch (e) { return response.status(e.status).json({ message: e.message }) } } @@ -45,14 +44,12 @@ class UserController { * @param {Response} ctx.response * @param {View} ctx.view */ - async show({ params, request, response, view }) { - try{ - let user = await User.find(params.id) - - if (user != null) - return response.json(user) - else return response.status(500).json('user not found') - } catch(e){ + async show ({ params, request, response, view }) { + try { + const user = await User.find(params.id) + + if (user != null) { return response.json(user) } else return response.status(500).json('user not found') + } catch (e) { console.log(e) return response.status(e.status).json({ message: e.message }) } @@ -66,22 +63,22 @@ class UserController { * @param {Request} ctx.request * @param {Response} ctx.response */ - async store({ request, auth, response }) { + async store ({ request, auth, response }) { try { - let user = new User() + const user = new User() - user.id = await uuidv4() + user.id = await uuidv4() user.username = request.input('username') user.email = request.input('email') user.password = request.input('password') user.login = request.input('login') - let request_institution = request.input('institution') + const request_institution = request.input('institution') if (request_institution != null) { - let institution = await Institution.findBy('acronym',request.input('institution')) + const institution = await Institution.findBy('acronym', request.input('institution')) await user.institution().associate(institution) - } else{ + } else { await user.save() } @@ -105,18 +102,17 @@ class UserController { * @param {Response} ctx.response */ - async update({ params, request, response, auth }) { + async update ({ params, request, response, auth }) { try { - let newUser = request.all() + const newUser = request.all() - let storeduser = await User.find(params.id) + const storeduser = await User.find(params.id) - if (storeduser != null){ + if (storeduser != null) { await storeduser.merge(newUser) await storeduser.save() return response.json(storeduser) } else return response.status(500).json('user not found') - } catch (e) { return response.status(e.status).json({ message: e.message }) } @@ -124,48 +120,47 @@ class UserController { /** Delete a user with id. * DELETE user/:id */ - async destroy({ params, response, auth }) { - try{ - let user = await User.find(params.id) + async destroy ({ params, response, auth }) { + try { + const user = await User.find(params.id) if (user != null) { await user.delete() } else return response.json('user not found') return response.json(user) - }catch(e){ + } catch (e) { return response.status(e.status).json({ message: e.message }) } } - async list_quests({ request, response, auth }) { - try{ - - let user = await auth.user + async list_quests ({ request, response, auth }) { + try { + const user = await auth.user return response.json(await user.quests().fetch()) - } catch(e){ + } catch (e) { console.log(e) return response.status(500).json({ message: e.message }) } } - async list_cases({ params, response, auth }) { - try{ - let user = await auth.user + async list_cases ({ params, response, auth }) { + try { + const user = await auth.user - let cases = await user.cases().fetch() + const cases = await user.cases().fetch() return response.json(cases) - } catch(e){ + } catch (e) { console.log(e) return response.status(500).json({ message: e.message }) } } - async list_cases_by_quests({ params, response, auth }) { - try{ - let user = await auth.user + async list_cases_by_quests ({ params, response, auth }) { + try { + const user = await auth.user Database .select('*') @@ -173,23 +168,20 @@ class UserController { .where('user_id', user.id) .leftJoin('cases', 'quests.case_id', 'cases.id') - let quests = await user.quests().fetch() - - let cases = await user.cases().fetch() + const quests = await user.quests().fetch() - - } catch(e){ + const cases = await user.cases().fetch() + } catch (e) { console.log(e) return response.status(500).json({ message: e.message }) } } + async listContributingQuests ({ response, auth }) { + try { + const user = await auth.user - async listContributingQuests({ response, auth }) { - try{ - let user = await auth.user - - let resultQuest = await Database + const resultQuest = await Database .select('*') .from('quests_users') .where('user_id', user.id) @@ -197,35 +189,33 @@ class UserController { .leftJoin('quests', 'quests_users.quest_id', 'quests.id') const base_url = Env.getOrFail('APP_URL') - let quests = [] + const quests = [] for (var i = 0; i < resultQuest.length; i++) { - let questJSON = {} - + const questJSON = {} + questJSON.id = resultQuest[i].quest_id questJSON.title = resultQuest[i].title questJSON.color = resultQuest[i].color - let artifact = await Artifact.find(resultQuest[i].artifact_id) - questJSON.url = base_url+artifact.relative_path + const artifact = await Artifact.find(resultQuest[i].artifact_id) + questJSON.url = base_url + artifact.relative_path quests.push(questJSON) } return response.json(quests) - - } catch(e){ + } catch (e) { console.log(e) return response.status(500).json({ message: e.message }) } } - - async listPlayingQuests({ response, auth }) { - try{ - let user = await auth.user + async listPlayingQuests ({ response, auth }) { + try { + const user = await auth.user - let resultQuest = await Database + const resultQuest = await Database .select('*') .from('quests_users') .where('user_id', user.id) @@ -233,17 +223,17 @@ class UserController { .leftJoin('quests', 'quests_users.quest_id', 'quests.id') const base_url = Env.getOrFail('APP_URL') - let quests = [] + const quests = [] for (var i = 0; i < resultQuest.length; i++) { - let questJSON = {} - + const questJSON = {} + questJSON.id = resultQuest[i].quest_id questJSON.title = resultQuest[i].title questJSON.color = resultQuest[i].color - let artifact = await Artifact.find(resultQuest[i].artifact_id) - questJSON.url = base_url+artifact.relative_path + const artifact = await Artifact.find(resultQuest[i].artifact_id) + questJSON.url = base_url + artifact.relative_path // let properties = await artifact.properties().fetch() @@ -270,13 +260,11 @@ class UserController { } return response.json(quests) - - } catch(e){ + } catch (e) { console.log(e) return response.status(500).json({ message: e.message }) } } - } module.exports = UserController diff --git a/src/adonisjs/app/Middleware/CheckPermissionForGivenCase.js b/src/adonisjs/app/Middleware/CheckPermissionForGivenCase.js index 667089e..c3ab141 100644 --- a/src/adonisjs/app/Middleware/CheckPermissionForGivenCase.js +++ b/src/adonisjs/app/Middleware/CheckPermissionForGivenCase.js @@ -12,50 +12,43 @@ class CheckPermissionForGivenCase { * @param {Function} next */ async handle ({ params, request, response, auth }, next, properties) { - try{ - let logged_user = auth.user.id - let sqlQuery = "" - let case_id = "" - - if (Object.keys(params).length === 0){ - case_id = request.input('case_id') - } else { - case_id = params.id - } - + try { + const logged_user = auth.user.id + let sqlQuery = '' + let case_id = '' + + if (Object.keys(params).length === 0) { + case_id = request.input('case_id') + } else { + case_id = params.id + } + // verify if the loged user is owner of the case - if (properties[0] == 'author'){ - + if (properties[0] == 'author') { sqlQuery = 'select uc.user_id from users u ' + 'left join users_cases uc on u.id = uc.user_id ' + 'where uc.user_id = ? and uc.case_id = ? and uc.role = 0' - let author = await Database.raw(sqlQuery, [logged_user, case_id]) + const author = await Database.raw(sqlQuery, [logged_user, case_id]) - if (author != null) - await next() - else return response.status(500).json('you are not owner of this case') + if (author != null) { await next() } else return response.status(500).json('you are not owner of this case') } - if (properties[0] == 'contributor'){ - - let logged_user = auth.user.id + if (properties[0] == 'contributor') { + const logged_user = auth.user.id // verify if the loged user is a contributor of the given case sqlQuery = 'select uc.user_id from users u ' + 'left join users_cases uc on u.id = uc.user_id ' + 'where uc.user_id = ? and uc.case_id = ? and (uc.role = 1 or uc.role = 0)' - let contributor = await Database.raw(sqlQuery, [logged_user, case_id]) + const contributor = await Database.raw(sqlQuery, [logged_user, case_id]) - if (contributor != null) - await next() - else return response.status(500).json('you are not contributor of this case') - } - }catch(e){ + if (contributor != null) { await next() } else return response.status(500).json('you are not contributor of this case') + } + } catch (e) { console.log('quebrou') console.log(e) - return response.status(500).json( e ) + return response.status(500).json(e) } - } } diff --git a/src/adonisjs/app/Middleware/CheckUserQuestPermission.js b/src/adonisjs/app/Middleware/CheckUserQuestPermission.js index a8e41fa..c6610b8 100644 --- a/src/adonisjs/app/Middleware/CheckUserQuestPermission.js +++ b/src/adonisjs/app/Middleware/CheckUserQuestPermission.js @@ -14,51 +14,47 @@ class CheckUserQuestPermission { * @param {Function} next */ async handle ({ params, request, auth, response }, next, properties) { - console.log('dijsi') - try{ - let userId = auth.user.id - let questId = request.input('questId') + // console.log('checking user permission...') + try { + const userId = auth.user.id + const questId = request.input('questId') let query_result - if (properties[0] == null){ + if (properties[0] == null) { query_result = await Database - .from('quests_users') - .where('quests_users.user_id', userId) - .where('quests_users.quest_id', questId) - .count() + .from('quests_users') + .where('quests_users.user_id', userId) + .where('quests_users.quest_id', questId) + .count() } - - if (properties[0] == 'contributor'){ + if (properties[0] == 'contributor') { query_result = await Database - .from('quests_users') - .where('quests_users.user_id', userId) - .where('quests_users.quest_id', questId) - .whereIn('quests_users.role', [0, 1]) - .count() + .from('quests_users') + .where('quests_users.user_id', userId) + .where('quests_users.quest_id', questId) + .whereIn('quests_users.role', [0, 1]) + .count() } - if (properties[0] == 'player'){ + if (properties[0] == 'player') { query_result = await Database - .from('quests_users') - .where('quests_users.user_id', userId) - .where('quests_users.quest_id', questId) - .whereIn('quests_users.role', [2]) - .count() + .from('quests_users') + .where('quests_users.user_id', userId) + .where('quests_users.quest_id', questId) + .whereIn('quests_users.role', [2]) + .count() } - if (query_result[0]['count(*)'] === 0) - return response.status(500).json('user dont have ' + properties[0] + ' permissions for such quest or quest id is incorrect') - else { + if (query_result[0]['count(*)'] === 0) { return response.status(500).json('user dont have ' + properties[0] + ' permissions for such quest or quest id is incorrect') } else { // Logger.info('check user\'s quest permission - OK') await next() } - } catch(e){ + } catch (e) { console.log(e) return response.status(500).json(e) } - } } diff --git a/src/adonisjs/app/Models/CaseArtifact.js b/src/adonisjs/app/Models/CaseArtifact.js index 5a49986..bcecc5c 100644 --- a/src/adonisjs/app/Models/CaseArtifact.js +++ b/src/adonisjs/app/Models/CaseArtifact.js @@ -4,11 +4,9 @@ const Model = use('Model') class CaseArtifact extends Model { - - artifact() { + artifact () { return this.belongsTo('App/Models/v1/Artifact') - } - + } } module.exports = CaseArtifact diff --git a/src/adonisjs/app/Models/Hooks/UserHook.js b/src/adonisjs/app/Models/Hooks/UserHook.js index f36fbbe..b6751d0 100644 --- a/src/adonisjs/app/Models/Hooks/UserHook.js +++ b/src/adonisjs/app/Models/Hooks/UserHook.js @@ -5,5 +5,5 @@ const Hash = use('Hash') const UserHook = exports = module.exports = {} UserHook.hashPassword = async (user) => { - user.password = await Hash.make(user.password) + user.password = await Hash.make(user.password) } diff --git a/src/adonisjs/app/Models/Property.js b/src/adonisjs/app/Models/Property.js index 9249f31..8c8adb6 100644 --- a/src/adonisjs/app/Models/Property.js +++ b/src/adonisjs/app/Models/Property.js @@ -4,11 +4,9 @@ const Model = use('Model') class Property extends Model { - - static get incrementing () { - return false - } - + static get incrementing () { + return false + } } module.exports = Property diff --git a/src/adonisjs/app/Models/Token.js b/src/adonisjs/app/Models/Token.js index 25958ce..fa52ff3 100644 --- a/src/adonisjs/app/Models/Token.js +++ b/src/adonisjs/app/Models/Token.js @@ -4,9 +4,9 @@ const Model = use('Model') class Token extends Model { - user(){ - return this.belongsTo('App/Models/v1/User') - } + user () { + return this.belongsTo('App/Models/v1/User') + } } module.exports = Token diff --git a/src/adonisjs/app/Models/Traits/NoTimestamp.js b/src/adonisjs/app/Models/Traits/NoTimestamp.js index 58c9340..53bb390 100644 --- a/src/adonisjs/app/Models/Traits/NoTimestamp.js +++ b/src/adonisjs/app/Models/Traits/NoTimestamp.js @@ -4,11 +4,11 @@ class NoTimestamp { register (Model) { Object.defineProperties(Model, { createdAtColumn: { - get: () => null, + get: () => null }, updatedAtColumn: { - get: () => null, - }, + get: () => null + } }) } } diff --git a/src/adonisjs/app/Models/v1/Artifact.js b/src/adonisjs/app/Models/v1/Artifact.js index 55949c1..f214734 100644 --- a/src/adonisjs/app/Models/v1/Artifact.js +++ b/src/adonisjs/app/Models/v1/Artifact.js @@ -4,16 +4,13 @@ const Model = use('Model') class Artifact extends Model { + static get incrementing () { + return false + } - static get incrementing () { - return false - } - - - user() { - return this.belongsTo('App/Models/v1/User'); - } - + user () { + return this.belongsTo('App/Models/v1/User') + } } module.exports = Artifact diff --git a/src/adonisjs/app/Models/v1/Case.js b/src/adonisjs/app/Models/v1/Case.js index f79e218..7771448 100644 --- a/src/adonisjs/app/Models/v1/Case.js +++ b/src/adonisjs/app/Models/v1/Case.js @@ -4,32 +4,32 @@ const Model = use('Model') class Case extends Model { - static get incrementing () { - return false - } + static get incrementing () { + return false + } - versions(){ - return this.hasMany('App/Models/v1/CaseVersion') - } + versions () { + return this.hasMany('App/Models/v1/CaseVersion') + } - artifacts() { - return this.hasMany('App/Models/CaseArtifact') - } + artifacts () { + return this.hasMany('App/Models/CaseArtifact') + } - users(){ - return this.belongsToMany('App/Models/v1/User') - .pivotTable('users_cases') - .withPivot(['role']) - .withTimestamps() - } + users () { + return this.belongsToMany('App/Models/v1/User') + .pivotTable('users_cases') + .withPivot(['role']) + .withTimestamps() + } - quests () { - return this - .belongsToMany('App/Models/v1/Quest') - .pivotTable('quests_cases') - .withPivot(['order_position']) - .withTimestamps() - } -} + quests () { + return this + .belongsToMany('App/Models/v1/Quest') + .pivotTable('quests_cases') + .withPivot(['order_position']) + .withTimestamps() + } +} module.exports = Case diff --git a/src/adonisjs/app/Models/v1/CaseVersion.js b/src/adonisjs/app/Models/v1/CaseVersion.js index 01ed542..cd7d8e5 100644 --- a/src/adonisjs/app/Models/v1/CaseVersion.js +++ b/src/adonisjs/app/Models/v1/CaseVersion.js @@ -4,21 +4,21 @@ const Model = use('Model') class CaseVersion extends Model { - static get incrementing () { - return false - } + static get incrementing () { + return false + } - case() { - return this.belongsTo('App/Models/v1/Case'); - } + case () { + return this.belongsTo('App/Models/v1/Case') + } - executions(){ - return this.belongsToMany('App/Models/v1/User').pivotTable('executions').withTimestamps() - } + executions () { + return this.belongsToMany('App/Models/v1/User').pivotTable('executions').withTimestamps() + } - suggested_to(){ - return this.belongsToMany('App/Models/v1/User').pivotTable('suggestions').withTimestamps() - } + suggested_to () { + return this.belongsToMany('App/Models/v1/User').pivotTable('suggestions').withTimestamps() + } } -module.exports = CaseVersion \ No newline at end of file +module.exports = CaseVersion diff --git a/src/adonisjs/app/Models/v1/Institution.js b/src/adonisjs/app/Models/v1/Institution.js index 4c95506..96b3f50 100644 --- a/src/adonisjs/app/Models/v1/Institution.js +++ b/src/adonisjs/app/Models/v1/Institution.js @@ -4,9 +4,9 @@ const Model = use('Model') class Institution extends Model { - static get incrementing () { - return false - } + static get incrementing () { + return false + } } module.exports = Institution diff --git a/src/adonisjs/app/Models/v1/Permission.js b/src/adonisjs/app/Models/v1/Permission.js index 623aa16..90f70a6 100644 --- a/src/adonisjs/app/Models/v1/Permission.js +++ b/src/adonisjs/app/Models/v1/Permission.js @@ -4,9 +4,9 @@ const Model = use('Model') class Permission extends Model { - static get incrementing () { - return false - } + static get incrementing () { + return false + } } module.exports = Permission diff --git a/src/adonisjs/app/Models/v1/Quest.js b/src/adonisjs/app/Models/v1/Quest.js index 5cc8216..1e0a87d 100644 --- a/src/adonisjs/app/Models/v1/Quest.js +++ b/src/adonisjs/app/Models/v1/Quest.js @@ -3,34 +3,30 @@ /** @type {typeof import('@adonisjs/lucid/src/Lucid/Model')} */ const Model = use('Model') -const uuidv4 = require('uuid/v4'); +const uuidv4 = require('uuid/v4') class Quest extends Model { - - static get incrementing () { - return false - } - - - users(){ - return this.belongsToMany('App/Models/v1/User') - .pivotTable('quests_users') - .withPivot(['role']) - .withTimestamps() - } - - - cases(){ - return this.belongsToMany('App/Models/v1/Case') - .pivotTable('quests_cases') - .withPivot(['order_position']) - .withTimestamps() - } - - - artifact() { - return this.belongsTo('App/Models/v1/Artifact') - } + static get incrementing () { + return false + } + + users () { + return this.belongsToMany('App/Models/v1/User') + .pivotTable('quests_users') + .withPivot(['role']) + .withTimestamps() + } + + cases () { + return this.belongsToMany('App/Models/v1/Case') + .pivotTable('quests_cases') + .withPivot(['order_position']) + .withTimestamps() + } + + artifact () { + return this.belongsTo('App/Models/v1/Artifact') + } } module.exports = Quest diff --git a/src/adonisjs/app/Models/v1/Role.js b/src/adonisjs/app/Models/v1/Role.js index aef0338..80f4639 100644 --- a/src/adonisjs/app/Models/v1/Role.js +++ b/src/adonisjs/app/Models/v1/Role.js @@ -4,37 +4,37 @@ const Model = use('Model') class Role extends Model { - static get incrementing () { - return false - } + static get incrementing () { + return false + } - users() { - return this - .belongsToMany('App/Models/v1/User') - .pivotTable('role_user') - .withTimestamps() - } + users () { + return this + .belongsToMany('App/Models/v1/User') + .pivotTable('role_user') + .withTimestamps() + } - permissions() { - return this - .belongsToMany('App/Models/v1/Permission') - .pivotTable('permission_role') - .withTimestamps() - } + permissions () { + return this + .belongsToMany('App/Models/v1/Permission') + .pivotTable('permission_role') + .withTimestamps() + } - // quests() { - // return this - // .belongsToMany('App/Models/v1/Quest') - // .pivotTable('quests_users') - // .withPivot(['role']) - // .withTimestamps() - // } + // quests() { + // return this + // .belongsToMany('App/Models/v1/Quest') + // .pivotTable('quests_users') + // .withPivot(['role']) + // .withTimestamps() + // } - static get traits () { - return [ - '@provider:Adonis/Acl/HasPermission' - ] - } + static get traits () { + return [ + '@provider:Adonis/Acl/HasPermission' + ] + } } module.exports = Role diff --git a/src/adonisjs/app/Models/v1/Token.js b/src/adonisjs/app/Models/v1/Token.js index 25958ce..fa52ff3 100644 --- a/src/adonisjs/app/Models/v1/Token.js +++ b/src/adonisjs/app/Models/v1/Token.js @@ -4,9 +4,9 @@ const Model = use('Model') class Token extends Model { - user(){ - return this.belongsTo('App/Models/v1/User') - } + user () { + return this.belongsTo('App/Models/v1/User') + } } module.exports = Token diff --git a/src/adonisjs/app/Models/v1/User.js b/src/adonisjs/app/Models/v1/User.js index a8bbf16..a847da6 100644 --- a/src/adonisjs/app/Models/v1/User.js +++ b/src/adonisjs/app/Models/v1/User.js @@ -8,78 +8,74 @@ const Model = use('Model') const Database = use('Database') class User extends Model { - static get incrementing () { - return false - } - - cases(){ - return this.belongsToMany('App/Models/v1/Case') - .pivotTable('users_cases') - .withPivot(['role']) - .withTimestamps() - } - - quests() { - return this - .belongsToMany('App/Models/v1/Quest') - .pivotTable('quests_users') - .withPivot(['role']) - .withTimestamps() - } - - artifacts() { - return this.hasMany('App/Models/v1/Artifact') - } - - institution(){ - return this.belongsTo('App/Models/v1/Institution') - } - - roles(){ - return this.belongsToMany('App/Models/v1/Role') - .pivotTable('role_user') - .withTimestamps() - } - - tokens() { - return this.hasMany('App/Models/Token') - } - - static get hidden () { - return ['password'] - } - - async checkRole(role) { - let query_result = await Database - .from('roles') - .where('roles.slug', role) - .leftJoin('role_user', 'roles.id', 'role_user.role_id') - .where('role_user.user_id', this.id) - .count() - - if (query_result[0]['count(*)'] === 0) - return 0 - else - return 1 - } - - static boot() { - super.boot() - - /** + static get incrementing () { + return false + } + + cases () { + return this.belongsToMany('App/Models/v1/Case') + .pivotTable('users_cases') + .withPivot(['role']) + .withTimestamps() + } + + quests () { + return this + .belongsToMany('App/Models/v1/Quest') + .pivotTable('quests_users') + .withPivot(['role']) + .withTimestamps() + } + + artifacts () { + return this.hasMany('App/Models/v1/Artifact') + } + + institution () { + return this.belongsTo('App/Models/v1/Institution') + } + + roles () { + return this.belongsToMany('App/Models/v1/Role') + .pivotTable('role_user') + .withTimestamps() + } + + tokens () { + return this.hasMany('App/Models/Token') + } + + static get hidden () { + return ['password'] + } + + async checkRole (role) { + const query_result = await Database + .from('roles') + .where('roles.slug', role) + .leftJoin('role_user', 'roles.id', 'role_user.role_id') + .where('role_user.user_id', this.id) + .count() + + if (query_result[0]['count(*)'] === 0) { return 0 } else { return 1 } + } + + static boot () { + super.boot() + + /** * A hook to hash the user password before saving * it to the database. */ - this.addHook('beforeCreate', 'UserHook.hashPassword') - } - - - // Attach role and permissions of a user - static get traits () { - return [ - '@provider:Adonis/Acl/HasRole' - ] - } + this.addHook('beforeCreate', 'UserHook.hashPassword') + } + + // Attach role and permissions of a user + static get traits () { + return [ + '@provider:Adonis/Acl/HasRole' + ] + } } module.exports = User diff --git a/src/adonisjs/app/Services/CloudinaryService.js b/src/adonisjs/app/Services/CloudinaryService.js index 10a69fa..b9da59d 100644 --- a/src/adonisjs/app/Services/CloudinaryService.js +++ b/src/adonisjs/app/Services/CloudinaryService.js @@ -1,10 +1,10 @@ -const cloudinary = require('cloudinary'); -const Env = use('Env'); +const cloudinary = require('cloudinary') +const Env = use('Env') cloudinary.config({ cloud_name: Env.get('CLOUDINARY_CLOUD_NAME'), api_key: Env.get('CLOUDINARY_API_KEY'), api_secret: Env.get('CLOUDINARY_API_SECRET') -}); +}) -module.exports = cloudinary; \ No newline at end of file +module.exports = cloudinary diff --git a/src/adonisjs/config/app.js b/src/adonisjs/config/app.js index 909e2e2..8c2d18b 100644 --- a/src/adonisjs/config/app.js +++ b/src/adonisjs/config/app.js @@ -82,7 +82,6 @@ module.exports = { */ jsonpCallback: 'callback', - /* |-------------------------------------------------------------------------- | Etag diff --git a/src/adonisjs/config/auth.js b/src/adonisjs/config/auth.js index 3bf1b38..0ad4dd9 100644 --- a/src/adonisjs/config/auth.js +++ b/src/adonisjs/config/auth.js @@ -54,7 +54,7 @@ module.exports = { scheme: 'basic', uid: 'email', password: 'password' - }, + }, /* |-------------------------------------------------------------------------- @@ -75,7 +75,7 @@ module.exports = { secret: Env.get('APP_KEY'), // expiresIn: 300 expiresIn: 86400 - // algorithm: + // algorithm: } }, diff --git a/src/adonisjs/config/cors.js b/src/adonisjs/config/cors.js index 1e62d3c..ce5c8da 100644 --- a/src/adonisjs/config/cors.js +++ b/src/adonisjs/config/cors.js @@ -16,7 +16,7 @@ module.exports = { | Function - Receives the current origin and should return one of the above values. | */ - origin: "*", + origin: '*', /* |-------------------------------------------------------------------------- diff --git a/src/adonisjs/config/session.js b/src/adonisjs/config/session.js index 37c9f40..d3ec27c 100644 --- a/src/adonisjs/config/session.js +++ b/src/adonisjs/config/session.js @@ -66,7 +66,7 @@ module.exports = { cookie: { httpOnly: true, sameSite: false, - path: '/', + path: '/' // domain: 'harena.com' // domain: Env.get('COOKIE_DOMAIN', null) }, diff --git a/src/adonisjs/database/factory.js b/src/adonisjs/database/factory.js index b559a03..879c9cd 100644 --- a/src/adonisjs/database/factory.js +++ b/src/adonisjs/database/factory.js @@ -15,14 +15,13 @@ const Factory = use('Factory') const Hash = use('Hash') -const uuidv4 = require('uuid/v4'); - +const uuidv4 = require('uuid/v4') Factory.blueprint('App/Models/v1/User', async (faker, i, data) => { - let username = faker.username() + const username = faker.username() return { - username: username, - login: username, + username: username, + login: username, email: data[i].email, password: username, @@ -45,31 +44,31 @@ Factory.blueprint('App/Models/v1/CaseVersion', async (faker, i, data) => { } }) -Factory.blueprint('App/Models/v1/Role', async (faker, i, data ) => { +Factory.blueprint('App/Models/v1/Role', async (faker, i, data) => { return { - name: data[i].name, - slug: data[i].slug, - description: data[i].description, + name: data[i].name, + slug: data[i].slug, + description: data[i].description, - // password: faker.password(), - id: await uuidv4() - } + // password: faker.password(), + id: await uuidv4() + } }) - // data = Object.assign({ - // name: 'Administrator' || data[i].name, - // slug: 'administrator' || data[i].slug, - // description: 'manage administration privileges' || data[i].description - // }, data) - // return data +// data = Object.assign({ +// name: 'Administrator' || data[i].name, +// slug: 'administrator' || data[i].slug, +// description: 'manage administration privileges' || data[i].description +// }, data) +// return data -Factory.blueprint('App/Models/v1/Permission', async (faker, i, data ) => { +Factory.blueprint('App/Models/v1/Permission', async (faker, i, data) => { return { name: data[i].name, slug: data[i].slug, description: data[i].description, - // password: faker.password(), + // password: faker.password(), id: await uuidv4() } -}) \ No newline at end of file +}) diff --git a/src/adonisjs/database/insertions/1593995817552_create_new_permissions_schema.js b/src/adonisjs/database/insertions/1593995817552_create_new_permissions_schema.js index e620a10..7b22b17 100644 --- a/src/adonisjs/database/insertions/1593995817552_create_new_permissions_schema.js +++ b/src/adonisjs/database/insertions/1593995817552_create_new_permissions_schema.js @@ -5,42 +5,40 @@ const Schema = use('Schema') const Factory = use('Factory') -const User = use('App/Models/v1/User'); -const Role = use('App/Models/v1/Role'); -const Permission = use('App/Models/v1/Permission'); - +const User = use('App/Models/v1/User') +const Role = use('App/Models/v1/Role') +const Permission = use('App/Models/v1/Permission') class CreateNewPermissionsSchema extends Schema { async up () { - let user = await User.findBy('username', 'jacinto') - - const contributor = await Factory.model('Adonis/Acl/Role').make({ name: 'case contributor', slug: 'contributor', description: 'permissions of a contributor'}) - await contributor.save() - const read = await Factory.model('Adonis/Acl/Permission').make({ name: 'read cases', slug: 'read', description: 'read cases'}) - await read.save() - await contributor.permissions().attach([read.id]) - await user.roles().attach([contributor.id]) - - const editor = await Factory.model('Adonis/Acl/Role').make({ name: 'case editor', slug: 'editor', description: 'permissions of a editor'}) - await editor.save() - const edit = await Factory.model('Adonis/Acl/Permission').make({ name: 'edit cases', slug: 'edit', description: 'edit cases'}) - await edit.save() - await editor.permissions().attach([edit.id]) + const user = await User.findBy('username', 'jacinto') + + const contributor = await Factory.model('Adonis/Acl/Role').make({ name: 'case contributor', slug: 'contributor', description: 'permissions of a contributor' }) + await contributor.save() + const read = await Factory.model('Adonis/Acl/Permission').make({ name: 'read cases', slug: 'read', description: 'read cases' }) + await read.save() + await contributor.permissions().attach([read.id]) + await user.roles().attach([contributor.id]) + + const editor = await Factory.model('Adonis/Acl/Role').make({ name: 'case editor', slug: 'editor', description: 'permissions of a editor' }) + await editor.save() + const edit = await Factory.model('Adonis/Acl/Permission').make({ name: 'edit cases', slug: 'edit', description: 'edit cases' }) + await edit.save() + await editor.permissions().attach([edit.id]) } async down () { - let contributor = await Role.findBy('slug', 'contributor') + const contributor = await Role.findBy('slug', 'contributor') await contributor.delete() - let read = await Permission.findBy('slug', 'read') + const read = await Permission.findBy('slug', 'read') await read.delete() - let editor = await Role.findBy('slug', 'editor') + const editor = await Role.findBy('slug', 'editor') await editor.delete() - let edit = await Permission.findBy('slug', 'edit') + const edit = await Permission.findBy('slug', 'edit') await edit.delete() - } } diff --git a/src/adonisjs/database/migrations/1593910551912_course_schema.js b/src/adonisjs/database/migrations/1593910551912_course_schema.js index 5f19f09..c58d84e 100644 --- a/src/adonisjs/database/migrations/1593910551912_course_schema.js +++ b/src/adonisjs/database/migrations/1593910551912_course_schema.js @@ -1,17 +1,17 @@ - 'use strict' +'use strict' /** @type {import('@adonisjs/lucid/src/Schema')} */ const Schema = use('Schema') class CourseSchema extends Schema { up () { - this.dropIfExists('courses') + this.dropIfExists('courses') this.create('courses', (table) => { table.uuid('id') table.primary('id') - table.string('title',100) + table.string('title', 100) table.timestamps() }) } diff --git a/src/adonisjs/database/migrations/1594004809130_kos_schema.js b/src/adonisjs/database/migrations/1594004809130_kos_schema.js index c2cf863..4c3700c 100644 --- a/src/adonisjs/database/migrations/1594004809130_kos_schema.js +++ b/src/adonisjs/database/migrations/1594004809130_kos_schema.js @@ -13,7 +13,7 @@ class KosSchema extends Schema { table.string('title', 100) table.string('description') - + table.timestamps() }) } diff --git a/src/adonisjs/database/migrations/1594005111091_type_schema.js b/src/adonisjs/database/migrations/1594005111091_type_schema.js index e2b7dbc..ec2a362 100644 --- a/src/adonisjs/database/migrations/1594005111091_type_schema.js +++ b/src/adonisjs/database/migrations/1594005111091_type_schema.js @@ -14,7 +14,7 @@ class TypeSchema extends Schema { table.string('title', 100) table.string('description') - table.uuid('kos_id').references('id').inTable('kos').index('kos_id'); + table.uuid('kos_id').references('id').inTable('kos').index('kos_id') table.timestamps() }) diff --git a/src/adonisjs/database/migrations/1594005305846_property_schema.js b/src/adonisjs/database/migrations/1594005305846_property_schema.js index 1e89666..7f3d9d0 100644 --- a/src/adonisjs/database/migrations/1594005305846_property_schema.js +++ b/src/adonisjs/database/migrations/1594005305846_property_schema.js @@ -13,8 +13,8 @@ class PropertySchema extends Schema { table.string('title', 100) table.string('description') - - table.uuid('type_id').references('id').inTable('types').index('type_id'); + + table.uuid('type_id').references('id').inTable('types').index('type_id') table.timestamps() }) diff --git a/src/adonisjs/database/migrations/1594005431781_term_schema.js b/src/adonisjs/database/migrations/1594005431781_term_schema.js index 044e599..d8a2059 100644 --- a/src/adonisjs/database/migrations/1594005431781_term_schema.js +++ b/src/adonisjs/database/migrations/1594005431781_term_schema.js @@ -13,7 +13,7 @@ class TermSchema extends Schema { table.string('value', 255) - table.uuid('property_id').references('id').inTable('properties').index('property_id'); + table.uuid('property_id').references('id').inTable('properties').index('property_id') table.timestamps() }) diff --git a/src/adonisjs/database/migrations/1594036153079_course_institution_schema.js b/src/adonisjs/database/migrations/1594036153079_course_institution_schema.js index 13356cf..c863aa2 100644 --- a/src/adonisjs/database/migrations/1594036153079_course_institution_schema.js +++ b/src/adonisjs/database/migrations/1594036153079_course_institution_schema.js @@ -5,17 +5,15 @@ const Schema = use('Schema') class CourseInstitutionSchema extends Schema { up () { - this.dropIfExists('course_institutions') this.create('course_institutions', (table) => { - table.uuid('institution_id').references('id').inTable('institutions').index('institution_id'); - table.uuid('course_id').references('id').inTable('courses').index('course_id'); + table.uuid('institution_id').references('id').inTable('institutions').index('institution_id') + table.uuid('course_id').references('id').inTable('courses').index('course_id') table.primary(['institution_id', 'course_id']) table.integer('access') table.timestamps() - }) } diff --git a/src/adonisjs/database/migrations/1594320151218_user_schema.js b/src/adonisjs/database/migrations/1594320151218_user_schema.js index 98ebb04..007d9a5 100644 --- a/src/adonisjs/database/migrations/1594320151218_user_schema.js +++ b/src/adonisjs/database/migrations/1594320151218_user_schema.js @@ -16,8 +16,8 @@ class UserSchema extends Schema { table.string('email', 254).notNullable().unique() table.string('password', 60).notNullable() - table.uuid('institution_id').references('id').inTable('institutions').index('institution_id'); - table.uuid('course_id').references('id').inTable('courses').index('course_id'); + table.uuid('institution_id').references('id').inTable('institutions').index('institution_id') + table.uuid('course_id').references('id').inTable('courses').index('course_id') table.timestamps() }) diff --git a/src/adonisjs/database/migrations/1594320921120_case_version_schema.js b/src/adonisjs/database/migrations/1594320921120_case_version_schema.js index b3e9138..71a78bb 100644 --- a/src/adonisjs/database/migrations/1594320921120_case_version_schema.js +++ b/src/adonisjs/database/migrations/1594320921120_case_version_schema.js @@ -13,7 +13,7 @@ class CaseVersionSchema extends Schema { table.text('source') - table.uuid('case_id').references('id').inTable('cases').index('case_id'); + table.uuid('case_id').references('id').inTable('cases').index('case_id') table.timestamps() }) diff --git a/src/adonisjs/database/migrations/1594320979254_artifact_schema.js b/src/adonisjs/database/migrations/1594320979254_artifact_schema.js index 6babdef..2e3dbb3 100644 --- a/src/adonisjs/database/migrations/1594320979254_artifact_schema.js +++ b/src/adonisjs/database/migrations/1594320979254_artifact_schema.js @@ -11,11 +11,11 @@ class ArtifactSchema extends Schema { table.uuid('id') table.primary('id') - table.string( 'fs_path', 300).notNullable() - table.string( 'relative_path', 300).notNullable() + table.string('fs_path', 300).notNullable() + table.string('relative_path', 300).notNullable() - table.uuid('user_id').references('id').inTable('users').index('user_id'); - table.uuid('case_id').references('id').inTable('cases').index('case_id'); + table.uuid('user_id').references('id').inTable('users').index('user_id') + table.uuid('case_id').references('id').inTable('cases').index('case_id') table.timestamps() }) diff --git a/src/adonisjs/database/migrations/1594321032600_quests_cases_schema.js b/src/adonisjs/database/migrations/1594321032600_quests_cases_schema.js index 9bd5ff2..b33c1d8 100644 --- a/src/adonisjs/database/migrations/1594321032600_quests_cases_schema.js +++ b/src/adonisjs/database/migrations/1594321032600_quests_cases_schema.js @@ -8,8 +8,8 @@ class QuestCaseSchema extends Schema { this.dropIfExists('quests_cases') this.create('quests_cases', (table) => { - table.uuid('quest_id').references('id').inTable('quests').index('quest_id'); - table.uuid('case_id').references('id').inTable('cases').index('case_id'); + table.uuid('quest_id').references('id').inTable('quests').index('quest_id') + table.uuid('case_id').references('id').inTable('cases').index('case_id') table.primary(['case_id', 'quest_id']) table.integer('order_position') diff --git a/src/adonisjs/database/migrations/1594321554864_user_property_schema.js b/src/adonisjs/database/migrations/1594321554864_user_property_schema.js index 0aba4a3..75be28c 100644 --- a/src/adonisjs/database/migrations/1594321554864_user_property_schema.js +++ b/src/adonisjs/database/migrations/1594321554864_user_property_schema.js @@ -5,18 +5,16 @@ const Schema = use('Schema') class UserPropertySchema extends Schema { up () { - - this.dropIfExists('user_properties') + this.dropIfExists('user_properties') this.create('user_properties', (table) => { - table.uuid('user_id').references('id').inTable('users').index('user_id'); - table.uuid('property_id').references('id').inTable('properties').index('property_id'); + table.uuid('user_id').references('id').inTable('users').index('user_id') + table.uuid('property_id').references('id').inTable('properties').index('property_id') table.primary(['user_id', 'property_id']) - + table.string('value', 255) table.timestamps() - }) } diff --git a/src/adonisjs/database/migrations/1594321623172_case_property_schema.js b/src/adonisjs/database/migrations/1594321623172_case_property_schema.js index 26d5ead..36d4c47 100644 --- a/src/adonisjs/database/migrations/1594321623172_case_property_schema.js +++ b/src/adonisjs/database/migrations/1594321623172_case_property_schema.js @@ -8,8 +8,8 @@ class CasePropertySchema extends Schema { this.dropIfExists('case_properties') this.create('case_properties', (table) => { - table.uuid('case_id').references('id').inTable('cases').index('case_id'); - table.uuid('property_id').references('id').inTable('properties').index('property_id'); + table.uuid('case_id').references('id').inTable('cases').index('case_id') + table.uuid('property_id').references('id').inTable('properties').index('property_id') table.primary(['case_id', 'property_id']) table.string('value', 255) diff --git a/src/adonisjs/database/migrations/1594321905326_create_role_user_schema.js b/src/adonisjs/database/migrations/1594321905326_create_role_user_schema.js index 1f3ddbf..95c7479 100644 --- a/src/adonisjs/database/migrations/1594321905326_create_role_user_schema.js +++ b/src/adonisjs/database/migrations/1594321905326_create_role_user_schema.js @@ -7,8 +7,8 @@ class RoleUserTableSchema extends Schema { this.dropIfExists('role_user') this.create('role_user', table => { - table.uuid('role_id').references('id').inTable('roles').index('role_id'); - table.uuid('user_id').references('id').inTable('users').index('user_id'); + table.uuid('role_id').references('id').inTable('roles').index('role_id') + table.uuid('user_id').references('id').inTable('users').index('user_id') table.primary(['user_id', 'role_id']) table.timestamps() diff --git a/src/adonisjs/database/migrations/1595525775363_token_schema.js b/src/adonisjs/database/migrations/1595525775363_token_schema.js index 8a09ada..f1983f9 100644 --- a/src/adonisjs/database/migrations/1595525775363_token_schema.js +++ b/src/adonisjs/database/migrations/1595525775363_token_schema.js @@ -14,7 +14,7 @@ class TokenSchema extends Schema { table.string('type', 80).notNullable() table.boolean('is_revoked').defaultTo(false) - table.uuid('user_id').references('id').inTable('users').index('user_id'); + table.uuid('user_id').references('id').inTable('users').index('user_id') table.timestamps() }) diff --git a/src/adonisjs/database/migrations/1595939263063_quests_users_schema.js b/src/adonisjs/database/migrations/1595939263063_quests_users_schema.js index 266cdbb..c6f2a28 100644 --- a/src/adonisjs/database/migrations/1595939263063_quests_users_schema.js +++ b/src/adonisjs/database/migrations/1595939263063_quests_users_schema.js @@ -8,8 +8,8 @@ class QuestsUsersSchema extends Schema { this.dropIfExists('quests_users') this.create('quests_users', (table) => { - table.uuid('user_id').references('id').inTable('users').index('user_id'); - table.uuid('quest_id').references('id').inTable('quests').index('quest_id'); + table.uuid('user_id').references('id').inTable('users').index('user_id') + table.uuid('quest_id').references('id').inTable('quests').index('quest_id') table.integer('role') table.primary(['quest_id', 'user_id', 'role']) diff --git a/src/adonisjs/database/migrations/1595940026109_users_cases_schema.js b/src/adonisjs/database/migrations/1595940026109_users_cases_schema.js index 581a3ad..44207e7 100644 --- a/src/adonisjs/database/migrations/1595940026109_users_cases_schema.js +++ b/src/adonisjs/database/migrations/1595940026109_users_cases_schema.js @@ -8,8 +8,8 @@ class UsersCasesSchema extends Schema { this.dropIfExists('users_cases') this.create('users_cases', (table) => { - table.uuid('user_id').references('id').inTable('users').index('user_id'); - table.uuid('case_id').references('id').inTable('cases').index('case_id'); + table.uuid('user_id').references('id').inTable('users').index('user_id') + table.uuid('case_id').references('id').inTable('cases').index('case_id') table.primary(['case_id', 'user_id']) table.integer('role') diff --git a/src/adonisjs/database/migrations/1598918164871_artifact_update_add_drop_attributes.js b/src/adonisjs/database/migrations/1598918164871_artifact_update_add_drop_attributes.js index 69a8006..99fcd0b 100644 --- a/src/adonisjs/database/migrations/1598918164871_artifact_update_add_drop_attributes.js +++ b/src/adonisjs/database/migrations/1598918164871_artifact_update_add_drop_attributes.js @@ -16,8 +16,8 @@ class ArtifactUpdateAddPropertyAndQuestRelationshipsSchema extends Schema { down () { this.table('artifacts', (table) => { table.string('fs_path', 300).notNullable() - - table.uuid('case_id').references('id').inTable('cases').index('case_id'); + + table.uuid('case_id').references('id').inTable('cases').index('case_id') }) } } diff --git a/src/adonisjs/database/migrations/1598996196411_case_artifacts_schema.js b/src/adonisjs/database/migrations/1598996196411_case_artifacts_schema.js index f75df91..9a391cd 100644 --- a/src/adonisjs/database/migrations/1598996196411_case_artifacts_schema.js +++ b/src/adonisjs/database/migrations/1598996196411_case_artifacts_schema.js @@ -8,8 +8,8 @@ class CaseArtifactsSchema extends Schema { this.dropIfExists('case_artifacts') this.create('case_artifacts', (table) => { - table.uuid('case_id').references('id').inTable('cases').index('case_id'); - table.uuid('artifact_id').references('id').inTable('artifacts').index('artifact_id'); + table.uuid('case_id').references('id').inTable('cases').index('case_id') + table.uuid('artifact_id').references('id').inTable('artifacts').index('artifact_id') table.primary(['case_id', 'artifact_id']) diff --git a/src/adonisjs/database/migrations/1599000104430_quest_update_add_artifact_relationship_schema.js b/src/adonisjs/database/migrations/1599000104430_quest_update_add_artifact_relationship_schema.js index c31aa31..a693d0b 100644 --- a/src/adonisjs/database/migrations/1599000104430_quest_update_add_artifact_relationship_schema.js +++ b/src/adonisjs/database/migrations/1599000104430_quest_update_add_artifact_relationship_schema.js @@ -8,8 +8,7 @@ class QuestUpdateAddArtifactRelationshipSchema extends Schema { this.table('quests', (table) => { // alter table table.string('color', 7) - table.uuid('artifact_id').references('id').inTable('artifacts').index('artifact_id'); - + table.uuid('artifact_id').references('id').inTable('artifacts').index('artifact_id') }) } @@ -20,7 +19,6 @@ class QuestUpdateAddArtifactRelationshipSchema extends Schema { table.dropColumn('artifact_id') table.dropColumn('color') - }) } } diff --git a/src/adonisjs/database/seeds/RollbackInitialSeeder.js b/src/adonisjs/database/seeds/RollbackInitialSeeder.js index 236fb2f..66f3970 100644 --- a/src/adonisjs/database/seeds/RollbackInitialSeeder.js +++ b/src/adonisjs/database/seeds/RollbackInitialSeeder.js @@ -13,37 +13,34 @@ /** @type {import('@adonisjs/lucid/src/Factory')} */ const Factory = use('Factory') -const CaseVersion = use('App/Models/v1/CaseVersion'); -const Case = use('App/Models/v1/Case'); -const User = use('App/Models/v1/User'); -const Role = use('App/Models/v1/Role'); -const Quest = use('App/Models/v1/Quest'); -const Token = use('App/Models/v1/Token'); +const CaseVersion = use('App/Models/v1/CaseVersion') +const Case = use('App/Models/v1/Case') +const User = use('App/Models/v1/User') +const Role = use('App/Models/v1/Role') +const Quest = use('App/Models/v1/Quest') +const Token = use('App/Models/v1/Token') const Database = use('Database') -const Helpers = use('Helpers') -const Drive = use('Drive'); - - +const Helpers = use('Helpers') +const Drive = use('Drive') class RollbackInitialSeeder { async run () { - let trx = await Database.beginTransaction() - - try{ - let c = await Case.findBy('title', 'default-case') - let versions = await c.versions().fetch() - let cvs = versions.rows + const trx = await Database.beginTransaction() + + try { + const c = await Case.findBy('title', 'default-case') + const versions = await c.versions().fetch() + const cvs = versions.rows await c.versions().delete() await c.users().detach() - let caseArtifacts = await c.artifacts().fetch() + const caseArtifacts = await c.artifacts().fetch() console.log(caseArtifacts) console.log(caseArtifacts[0]) for (var i = 0; i < caseArtifacts.length; i++) { - console.log('iiii') artifacts[i].users().dissociate(trx) console.log('jjjj') @@ -53,14 +50,14 @@ class RollbackInitialSeeder { await c.delete(trx) - let artifactPath = Helpers.publicPath('/resources/artifacts/cases/') + c.id + '/' + const artifactPath = Helpers.publicPath('/resources/artifacts/cases/') + c.id + '/' await Drive.delete(artifactPath) - let slug_roles = ['admin', 'author', 'player'] + const slug_roles = ['admin', 'author', 'player'] for (var i = 0; i < slug_roles.length; i++) { - let role = await Role.findBy('slug', slug_roles[i]) + const role = await Role.findBy('slug', slug_roles[i]) await role.users().detach() await role.delete(trx) @@ -72,12 +69,12 @@ class RollbackInitialSeeder { await quest.delete(trx) - let user = await User.findBy('username', 'jacinto') + const user = await User.findBy('username', 'jacinto') await user.delete(trx) trx.commit() - } catch(e){ + } catch (e) { console.log('Error on seed process. Transactions rolled back. Log:') console.log(e) diff --git a/src/adonisjs/database/seeds/UniversidadeDoMinhoRollbackSeeder.js b/src/adonisjs/database/seeds/UniversidadeDoMinhoRollbackSeeder.js index 521da97..635c47f 100644 --- a/src/adonisjs/database/seeds/UniversidadeDoMinhoRollbackSeeder.js +++ b/src/adonisjs/database/seeds/UniversidadeDoMinhoRollbackSeeder.js @@ -14,53 +14,46 @@ const Factory = use('Factory') const Database = use('Database') -const uuidv4 = require('uuid/v4'); +const uuidv4 = require('uuid/v4') - -const User = use('App/Models/v1/User'); -const Quest = use('App/Models/v1/Quest'); +const User = use('App/Models/v1/User') +const Quest = use('App/Models/v1/Quest') class UniversidadeDoMinhoRollbackSeeder { - - async run () { - let trx = await Database.beginTransaction() - - try{ - - let users = [{email: 'minho1@mail.com'}, {email: 'minho2@mail.com'}, {email: 'minho3@mail.com'}] - - for (var i = 0; i < users.length; i++) { - const user = await User.findBy('email', users[i].email) - console.log(users[i].email) - console.log(user) - await user.quests().detach() - await user.roles().detach() - let tokens = await user.tokens().fetch() + const trx = await Database.beginTransaction() - let tokens_rows = tokens.rows - for (var j = 0; j < tokens_rows.length; j++) { - console.log('vi deletar') - tokens_rows[j].delete(trx) - } + try { + const users = [{ email: 'minho1@mail.com' }, { email: 'minho2@mail.com' }, { email: 'minho3@mail.com' }] + for (var i = 0; i < users.length; i++) { + const user = await User.findBy('email', users[i].email) + console.log(users[i].email) + console.log(user) + await user.quests().detach() + await user.roles().detach() + const tokens = await user.tokens().fetch() - await user.delete(trx) + const tokens_rows = tokens.rows + for (var j = 0; j < tokens_rows.length; j++) { + console.log('vi deletar') + tokens_rows[j].delete(trx) + } - } + await user.delete(trx) + } - const quest = await Quest.findBy('title', 'Decisões Extremas') - await quest.cases().detach() - await quest.delete(trx) + const quest = await Quest.findBy('title', 'Decisões Extremas') + await quest.cases().detach() + await quest.delete(trx) trx.commit() - } catch(e){ - console.log('Error on rollback-seed process. Transactions rolled back. Log:') + } catch (e) { + console.log('Error on rollback-seed process. Transactions rolled back. Log:') console.log(e) trx.rollback() } - } } diff --git a/src/adonisjs/database/seeds/UniversidadeDoMinhoSeeder.js b/src/adonisjs/database/seeds/UniversidadeDoMinhoSeeder.js index bced284..12bd5b2 100644 --- a/src/adonisjs/database/seeds/UniversidadeDoMinhoSeeder.js +++ b/src/adonisjs/database/seeds/UniversidadeDoMinhoSeeder.js @@ -14,62 +14,52 @@ const Factory = use('Factory') const Database = use('Database') -const uuidv4 = require('uuid/v4'); +const uuidv4 = require('uuid/v4') +const User = use('App/Models/v1/User') +const Quest = use('App/Models/v1/Quest') +const Case = use('App/Models/v1/Case') -const User = use('App/Models/v1/User'); -const Quest = use('App/Models/v1/Quest'); -const Case = use('App/Models/v1/Case'); - -const Role = use('App/Models/v1/Role'); -const Permission = use('App/Models/v1/Permission'); +const Role = use('App/Models/v1/Role') +const Permission = use('App/Models/v1/Permission') class UniversidadeDoMinhoSeeder { - - async run () { - let trx = await Database.beginTransaction() + const trx = await Database.beginTransaction() - try{ - let emails = [{email: 'minho1@mail.com'}, {email: 'minho2@mail.com'}, {email: 'minho3@mail.com'}] - - let quest = new Quest() + try { + const emails = [{ email: 'minho1@mail.com' }, { email: 'minho2@mail.com' }, { email: 'minho3@mail.com' }] + + const quest = new Quest() quest.title = 'Decisões Extremas' - quest.id = await uuidv4() - await quest.save(trx) + quest.id = await uuidv4() + await quest.save(trx) - let users = await Factory.model('App/Models/v1/User').createMany(3, emails, trx) + const users = await Factory.model('App/Models/v1/User').createMany(3, emails, trx) - let role_player = await Role.findBy('slug', 'player') - - for (var i = 0; i < users.length; i++) { + const role_player = await Role.findBy('slug', 'player') - await quest.users().attach(users[i].id, (row) => { + for (var i = 0; i < users.length; i++) { + await quest.users().attach(users[i].id, (row) => { const PLAYER = 2 row.role = PLAYER }, trx) - await users[i].roles().attach([role_player.id], trx) + await users[i].roles().attach([role_player.id], trx) } - let c = await Case.findBy('title', 'default-case') - await quest.cases().attach(c.id, (row) => { - row.order_position = 0 - }, trx) - - - - - + const c = await Case.findBy('title', 'default-case') + await quest.cases().attach(c.id, (row) => { + row.order_position = 0 + }, trx) trx.commit() - }catch(e){ + } catch (e) { trx.rollback() - console.log('Error on seed process. Transactions rolled back. Log:') + console.log('Error on seed process. Transactions rolled back. Log:') console.log(e) - } - + } } } diff --git a/src/adonisjs/database/seeds/defaultQuests.json b/src/adonisjs/database/seeds/defaultQuests.json new file mode 100644 index 0000000..59e0b98 --- /dev/null +++ b/src/adonisjs/database/seeds/defaultQuests.json @@ -0,0 +1,38 @@ +[ + { + "id": "68eeb917-0638-4f7c-a25d-44428980d97b", + "title": "Quiz da Emergência", + "color": "#e64e31", + "url": "imgs/quiz-emergencia.png" + }, + { + "id": "74ae85f1-8b5b-444d-8039-061f99fec333", + "title": "Desafio de Eletrocardiograma", + "color": "#ae9e00", + "url": "desafio-eletro.png" + }, + { + "id": "7f835ce4-d221-4fe8-ae3a-c48e3a0382fc", + "title": "Desafio Radiológico", + "color": "#348f00", + "url": "desafio-radio.png" + }, + { + "id": "ab31e7e1-117c-4e3a-b3c0-192d8efa885c", + "title": "default-quest", + "color": "#505050", + "url": "default-image.png" + }, + { + "id": "c0a4e21c-570b-47e2-8a08-f6bb60a49dcc", + "title": "Visita Virtual", + "color": "#245797", + "url": "visita-virtual.png" + }, + { + "id": "df0e0655-3b16-41fb-884c-e9248ba9a964", + "title": "Decisões Extremas", + "color": "#a34fa3", + "url": "decisoes-extremas.png" + } +] diff --git a/src/adonisjs/package-lock.json b/src/adonisjs/package-lock.json index 5b9d8e4..21e38aa 100644 --- a/src/adonisjs/package-lock.json +++ b/src/adonisjs/package-lock.json @@ -152,12 +152,62 @@ "@adonisjs/generic-exceptions": "^2.0.1", "chance": "^1.0.16", "debug": "^4.0.1", - "knex": "^0.19.5", + "knex": "^0.15.2", "lodash": "^4.17.11", "moment": "^2.22.2", "pluralize": "^7.0.0", "pretty-hrtime": "^1.0.3", "require-all": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "knex": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/knex/-/knex-0.15.2.tgz", + "integrity": "sha1-YFm4dIlgX0zIdZmm0qnSZXCek0A=", + "requires": { + "babel-runtime": "^6.26.0", + "bluebird": "^3.5.1", + "chalk": "2.3.2", + "commander": "^2.16.0", + "debug": "3.1.0", + "inherits": "~2.0.3", + "interpret": "^1.1.0", + "liftoff": "2.5.0", + "lodash": "^4.17.10", + "minimist": "1.2.0", + "mkdirp": "^0.5.1", + "pg-connection-string": "2.0.0", + "tarn": "^1.1.4", + "tildify": "1.2.0", + "uuid": "^3.3.2", + "v8flags": "^3.1.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } } }, "@adonisjs/middleware-base": { @@ -210,6 +260,32 @@ "uuid": "^3.3.2" } }, + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, "@slynova/flydrive": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/@slynova/flydrive/-/flydrive-0.3.1.tgz", @@ -233,6 +309,12 @@ } } }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -257,6 +339,12 @@ "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==" }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true + }, "acorn-node": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.7.0.tgz", @@ -290,6 +378,18 @@ } } }, + "ajv": { + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "ansi-bgblack": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-bgblack/-/ansi-bgblack-0.1.1.tgz", @@ -428,6 +528,23 @@ "ansi-wrap": "0.1.0" } }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, "ansi-gray": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", @@ -555,6 +672,15 @@ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-0.1.0.tgz", "integrity": "sha1-gwtoCqflbzNFHUsEnzvYBESY7ic=" }, + "argparse": { + "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" + } + }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -593,6 +719,17 @@ "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=" }, + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + } + }, "array-slice": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", @@ -608,6 +745,12 @@ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "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 + }, "async": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", @@ -630,6 +773,12 @@ "regenerator-runtime": "^0.11.0" } }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, "base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", @@ -667,6 +816,16 @@ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==" }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "braces": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", @@ -709,7 +868,7 @@ "get-value": "^2.0.6", "has-value": "^1.0.0", "isobject": "^3.0.1", - "set-value": "^2.0.1", + "set-value": "^2.0.0", "to-object-path": "^0.3.0", "union-value": "^1.0.0", "unset-value": "^1.0.0" @@ -761,6 +920,12 @@ "resolved": "https://registry.npmjs.org/chance/-/chance-1.0.18.tgz", "integrity": "sha512-g9YLQVHVZS/3F+zIicfB58vjcxopvYQRp7xHzvyDFDhXH1aRZI/JhwSAO0X5qYiQluoGnaNAU6wByD2KTxJN1A==" }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, "choices-separator": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/choices-separator/-/choices-separator-2.0.0.tgz", @@ -858,6 +1023,15 @@ } } }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, "cli-table": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", @@ -866,6 +1040,12 @@ "colors": "1.0.3" } }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, "clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", @@ -986,6 +1166,18 @@ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, "content-disposition": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", @@ -1010,9 +1202,9 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, "core-js": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", - "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==" + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" }, "core-util-is": { "version": "1.0.2", @@ -1071,11 +1263,32 @@ "ms": "^2.1.1" } }, + "debug-log": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", + "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", + "dev": true + }, "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=" }, + "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 + }, + "define-properties": { + "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" + } + }, "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", @@ -1084,6 +1297,28 @@ "is-descriptor": "^1.0.0" } }, + "deglob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/deglob/-/deglob-4.0.1.tgz", + "integrity": "sha512-/g+RDZ7yf2HvoW+E5Cy+K94YhgcFgr6C8LuHZD1O5HoNPkf3KY6RfXJ0DBGlB/NkLi5gml+G9zqRzk9S0mHZCg==", + "dev": true, + "requires": { + "find-root": "^1.0.0", + "glob": "^7.0.5", + "ignore": "^5.0.0", + "pkg-config": "^1.1.0", + "run-parallel": "^1.1.2", + "uniq": "^1.0.1" + }, + "dependencies": { + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + } + } + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -1109,6 +1344,15 @@ "kuler": "1.0.x" } }, + "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" + } + }, "dotenv": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", @@ -1153,6 +1397,12 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "enabled": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", @@ -1190,7 +1440,7 @@ "prompt-input": "^3.0.0", "prompt-question": "^3.0.3", "readline-ui": "^2.2.2", - "set-value": "^2.0.1" + "set-value": "^1.0.0" }, "dependencies": { "debug": { @@ -1205,6 +1455,17 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "set-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-1.0.0.tgz", + "integrity": "sha1-vMdvcaDx4HokuYfQoCr+yfZlME8=", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } } } }, @@ -1213,11 +1474,66 @@ "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.5.tgz", "integrity": "sha512-zoB603vQReOFvTg5xMl9I1P2PnHsHQQKTEowsKKD7nseUfJq6UWzK+4YtlWUO1nhiQUxe6XMkk+JleSZD1NZFA==" }, + "error-ex": { + "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" + }, + "dependencies": { + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + } + } + }, "error-symbol": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/error-symbol/-/error-symbol-0.1.0.tgz", "integrity": "sha1-Ck2uN9YA0VopukU9jvkg8YRDM/Y=" }, + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "dependencies": { + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true + } + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -1228,11 +1544,376 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "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==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "eslint-config-standard": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz", + "integrity": "sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg==", + "dev": true + }, + "eslint-config-standard-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-8.1.0.tgz", + "integrity": "sha512-ULVC8qH8qCqbU792ZOO6DaiaZyHNS/5CZt3hKqHkEhVlhPEPN3nfBqqxJCyp59XrjIBZPu1chMYe9T2DXZ7TMw==", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + }, + "dependencies": { + "debug": { + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-plugin-es": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-2.0.0.tgz", + "integrity": "sha512-f6fceVtg27BR02EYnBhgWLFQfK6bN4Ll0nQFrBHOlCsAyxeZkn0NHns5O0YZOPrV1B3ramd6cgFwaoFLcSkwEQ==", + "dev": true, + "requires": { + "eslint-utils": "^1.4.2", + "regexpp": "^3.0.0" + }, + "dependencies": { + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + } + } + }, + "eslint-plugin-import": { + "version": "2.18.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz", + "integrity": "sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.0", + "read-pkg-up": "^2.0.0", + "resolve": "^1.11.0" + }, + "dependencies": { + "debug": { + "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" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-plugin-node": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-10.0.0.tgz", + "integrity": "sha512-1CSyM/QCjs6PXaT18+zuAXsjXGIGo5Rw630rSKwokSs2jrYURQc4R5JZpoanNCqwNmepg+0eZ9L7YiRUJb8jiQ==", + "dev": true, + "requires": { + "eslint-plugin-es": "^2.0.0", + "eslint-utils": "^1.4.2", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "dependencies": { + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "eslint-plugin-promise": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz", + "integrity": "sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==", + "dev": true + }, + "eslint-plugin-react": { + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.14.3.tgz", + "integrity": "sha512-EzdyyBWC4Uz2hPYBiEJrKCUi2Fn+BJ9B/pJQcjw5X+x/H2Nm59S4MJIvL4O5NEE0+WbnQwEBxWY03oUk+Bc3FA==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.1.0", + "object.entries": "^1.1.0", + "object.fromentries": "^2.0.0", + "object.values": "^1.1.0", + "prop-types": "^15.7.2", + "resolve": "^1.10.1" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + } + } + }, + "eslint-plugin-standard": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz", + "integrity": "sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==", + "dev": true + }, + "eslint-scope": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", + "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", + "dev": true + } + } + }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -1352,6 +2033,17 @@ "is-extendable": "^0.1.0" } }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", @@ -1367,6 +2059,18 @@ "to-regex": "^3.0.1" } }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", @@ -1390,6 +2094,24 @@ "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==" }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -1411,6 +2133,21 @@ } } }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, "findup-sync": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", @@ -1439,6 +2176,23 @@ "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==" }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -1480,6 +2234,30 @@ "universalify": "^0.1.0" } }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-stdin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz", + "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==", + "dev": true + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -1493,6 +2271,40 @@ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + }, + "dependencies": { + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + } + } + }, "global-modules": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", @@ -1515,16 +2327,40 @@ "which": "^1.2.14" } }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, "graceful-fs": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.1.tgz", "integrity": "sha512-b9usnbDGnD928gJB3LrCmxoibr3VE4U2SMo5PBuBnokWyDADTqDPXg4YpwKF1trpH+UbGp7QLicO3+aWEy0+mw==" }, + "has": { + "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" + } + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -1585,6 +2421,12 @@ "parse-passwd": "^1.0.0" } }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, "http-errors": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", @@ -1605,6 +2447,36 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, "indent-string": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", @@ -1615,6 +2487,16 @@ "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", "integrity": "sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8=" }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "info-symbol": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/info-symbol/-/info-symbol-0.1.0.tgz", @@ -1630,6 +2512,123 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, + "inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "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==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "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==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "interpret": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", @@ -1702,6 +2701,12 @@ } } }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", @@ -1755,6 +2760,15 @@ "isobject": "^3.0.1" } }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, "is-relative": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", @@ -1768,6 +2782,21 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, "is-unc-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", @@ -1796,6 +2825,40 @@ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" }, + "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 + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "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 + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -1821,6 +2884,16 @@ "semver": "^5.6.0" } }, + "jsx-ast-utils": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", + "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", + "dev": true, + "requires": { + "array-includes": "^3.1.1", + "object.assign": "^4.1.0" + } + }, "jwa": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", @@ -1853,59 +2926,6 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-2.0.2.tgz", "integrity": "sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ==" }, - "knex": { - "version": "0.19.5", - "resolved": "https://registry.yarnpkg.com/knex/-/knex-0.19.5.tgz#3597ebecf88a5942f18c3e6d91af53bda59eeb5d", - "integrity": "sha512-Hy258avCVircQq+oj3WBqPzl8jDIte438Qlq+8pt1i/TyLYVA4zPh2uKc7Bx0t+qOpa6D42HJ2jjtl2vagzilw==", - "requires": { - "babel-runtime": "^6.26.0", - "bluebird": "^3.5.1", - "chalk": "2.3.2", - "commander": "^2.16.0", - "debug": "3.1.0", - "inherits": "~2.0.3", - "interpret": "^1.1.0", - "liftoff": "2.5.0", - "lodash": "^4.17.10", - "minimist": "1.2.0", - "mkdirp": "^0.5.1", - "pg-connection-string": "2.0.0", - "tarn": "^1.1.4", - "tildify": "1.2.0", - "uuid": "^3.3.2", - "v8flags": "^3.1.1" - }, - "dependencies": { - "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, "koalas": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/koalas/-/koalas-1.0.2.tgz", @@ -1927,6 +2947,16 @@ "set-getter": "^0.1.0" } }, + "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" + } + }, "liftoff": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", @@ -1942,6 +2972,36 @@ "resolve": "^1.1.7" } }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", @@ -2024,6 +3084,15 @@ } } }, + "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==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, "lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", @@ -2152,6 +3221,21 @@ "mime-db": "1.40.0" } }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", @@ -2197,7 +3281,14 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { - "minimist": "1.2.0" + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } } }, "moment": { @@ -2317,6 +3408,12 @@ } } }, + "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 + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -2390,10 +3487,22 @@ "vary": "^1.1.2" } }, + "normalize-package-data": { + "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", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, "npm": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/npm/-/npm-6.10.3.tgz", - "integrity": "sha512-AH2uhSRaIMll7xz1JuLA6XbZu5k6DMSc77U6uWfuyBch4EzwpEc5dd54/OsX4Njioi7fSL7YmuPQbqKE2qiklw==", + "version": "6.14.8", + "resolved": "https://registry.npmjs.org/npm/-/npm-6.14.8.tgz", + "integrity": "sha512-HBZVBMYs5blsj94GTeQZel7s9odVuuSUHy1+AlZh7rPVux1os2ashvEGLy/STNK7vUjbrCg5Kq9/GXisJgdf6A==", "requires": { "JSONStream": "^1.3.5", "abbrev": "~1.1.1", @@ -2401,16 +3510,16 @@ "ansistyles": "~0.1.3", "aproba": "^2.0.0", "archy": "~1.0.0", - "bin-links": "^1.1.2", + "bin-links": "^1.1.8", "bluebird": "^3.5.5", "byte-size": "^5.0.1", - "cacache": "^12.0.2", + "cacache": "^12.0.3", "call-limit": "^1.1.1", - "chownr": "^1.1.2", + "chownr": "^1.1.4", "ci-info": "^2.0.0", "cli-columns": "^3.1.2", "cli-table3": "^0.5.1", - "cmd-shim": "~2.0.2", + "cmd-shim": "^3.0.3", "columnify": "~1.5.4", "config-chain": "^1.1.12", "debuglog": "*", @@ -2422,11 +3531,11 @@ "find-npm-prefix": "^1.0.2", "fs-vacuum": "~1.2.10", "fs-write-stream-atomic": "~1.0.10", - "gentle-fs": "^2.0.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", + "gentle-fs": "^2.3.1", + "glob": "^7.1.6", + "graceful-fs": "^4.2.4", "has-unicode": "~2.0.1", - "hosted-git-info": "^2.8.2", + "hosted-git-info": "^2.8.8", "iferr": "^1.0.2", "imurmurhash": "*", "infer-owner": "^1.0.4", @@ -2437,14 +3546,14 @@ "is-cidr": "^3.0.0", "json-parse-better-errors": "^1.0.2", "lazy-property": "~1.0.0", - "libcipm": "^4.0.0", + "libcipm": "^4.0.8", "libnpm": "^3.0.1", "libnpmaccess": "^3.0.2", "libnpmhook": "^5.0.3", "libnpmorg": "^1.0.1", "libnpmsearch": "^2.0.2", "libnpmteam": "^1.0.2", - "libnpx": "^10.2.0", + "libnpx": "^10.2.4", "lock-verify": "^2.1.0", "lockfile": "^1.0.4", "lodash._baseindexof": "*", @@ -2459,52 +3568,52 @@ "lodash.uniq": "~4.5.0", "lodash.without": "~4.4.0", "lru-cache": "^5.1.1", - "meant": "~1.0.1", + "meant": "^1.0.2", "mississippi": "^3.0.0", - "mkdirp": "~0.5.1", + "mkdirp": "^0.5.5", "move-concurrently": "^1.0.1", - "node-gyp": "^5.0.3", - "nopt": "~4.0.1", + "node-gyp": "^5.1.0", + "nopt": "^4.0.3", "normalize-package-data": "^2.5.0", - "npm-audit-report": "^1.3.2", + "npm-audit-report": "^1.3.3", "npm-cache-filename": "~1.0.2", - "npm-install-checks": "~3.0.0", - "npm-lifecycle": "^3.1.2", - "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.4.4", - "npm-pick-manifest": "^2.2.3", - "npm-profile": "^4.0.2", - "npm-registry-fetch": "^4.0.0", + "npm-install-checks": "^3.0.2", + "npm-lifecycle": "^3.1.5", + "npm-package-arg": "^6.1.1", + "npm-packlist": "^1.4.8", + "npm-pick-manifest": "^3.0.2", + "npm-profile": "^4.0.4", + "npm-registry-fetch": "^4.0.7", "npm-user-validate": "~1.0.0", "npmlog": "~4.1.2", "once": "~1.4.0", "opener": "^1.5.1", "osenv": "^0.1.5", - "pacote": "^9.5.4", + "pacote": "^9.5.12", "path-is-inside": "~1.0.2", "promise-inflight": "~1.0.1", "qrcode-terminal": "^0.12.0", "query-string": "^6.8.2", "qw": "~1.0.1", "read": "~1.0.7", - "read-cmd-shim": "~1.0.1", + "read-cmd-shim": "^1.0.5", "read-installed": "~4.0.3", - "read-package-json": "^2.0.13", + "read-package-json": "^2.1.1", "read-package-tree": "^5.3.1", - "readable-stream": "^3.4.0", + "readable-stream": "^3.6.0", "readdir-scoped-modules": "^1.1.0", "request": "^2.88.0", "retry": "^0.12.0", - "rimraf": "^2.6.3", + "rimraf": "^2.7.1", "safe-buffer": "^5.1.2", - "semver": "^5.7.0", + "semver": "^5.7.1", "sha": "^3.0.0", "slide": "~1.1.6", "sorted-object": "~2.0.1", "sorted-union-stream": "~2.1.3", "ssri": "^6.0.1", - "stringify-package": "^1.0.0", - "tar": "^4.4.10", + "stringify-package": "^1.0.1", + "tar": "^4.4.13", "text-table": "~0.2.0", "tiny-relative-date": "^1.3.0", "uid-number": "0.0.6", @@ -2512,7 +3621,7 @@ "unique-filename": "^1.1.1", "unpipe": "~1.0.0", "update-notifier": "^2.5.0", - "uuid": "^3.3.2", + "uuid": "^3.3.3", "validate-npm-package-license": "^3.0.4", "validate-npm-package-name": "~3.0.0", "which": "^1.3.1", @@ -2660,13 +3769,14 @@ } }, "bin-links": { - "version": "1.1.2", + "version": "1.1.8", "bundled": true, "requires": { - "bluebird": "^3.5.0", - "cmd-shim": "^2.0.2", - "gentle-fs": "^2.0.0", - "graceful-fs": "^4.1.11", + "bluebird": "^3.5.3", + "cmd-shim": "^3.0.0", + "gentle-fs": "^2.3.0", + "graceful-fs": "^4.1.15", + "npm-normalize-package-bin": "^1.0.0", "write-file-atomic": "^2.3.0" } }, @@ -2712,7 +3822,7 @@ "bundled": true }, "cacache": { - "version": "12.0.2", + "version": "12.0.3", "bundled": true, "requires": { "bluebird": "^3.5.5", @@ -2758,7 +3868,7 @@ } }, "chownr": { - "version": "1.1.2", + "version": "1.1.4", "bundled": true }, "ci-info": { @@ -2794,23 +3904,36 @@ } }, "cliui": { - "version": "4.1.0", + "version": "5.0.0", "bundled": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", + "version": "4.1.0", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", "bundled": true }, + "string-width": { + "version": "3.1.0", + "bundled": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, "strip-ansi": { - "version": "4.0.0", + "version": "5.2.0", "bundled": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.1.0" } } } @@ -2820,7 +3943,7 @@ "bundled": true }, "cmd-shim": { - "version": "2.0.2", + "version": "3.0.3", "bundled": true, "requires": { "graceful-fs": "^4.1.2", @@ -2911,10 +4034,10 @@ } }, "configstore": { - "version": "3.1.2", + "version": "3.1.5", "bundled": true, "requires": { - "dot-prop": "^4.1.0", + "dot-prop": "^4.2.1", "graceful-fs": "^4.1.2", "make-dir": "^1.0.0", "unique-string": "^1.0.0", @@ -3023,7 +4146,7 @@ "bundled": true }, "deep-extend": { - "version": "0.5.1", + "version": "0.6.0", "bundled": true }, "defaults": { @@ -3065,7 +4188,7 @@ } }, "dot-prop": { - "version": "4.2.0", + "version": "4.2.1", "bundled": true, "requires": { "is-obj": "^1.0.0" @@ -3124,6 +4247,10 @@ "version": "1.0.0", "bundled": true }, + "emoji-regex": { + "version": "7.0.3", + "bundled": true + }, "encoding": { "version": "0.1.12", "bundled": true, @@ -3139,7 +4266,7 @@ } }, "env-paths": { - "version": "1.0.0", + "version": "2.2.0", "bundled": true }, "err-code": { @@ -3231,13 +4358,6 @@ "version": "1.0.2", "bundled": true }, - "find-up": { - "version": "2.1.0", - "bundled": true, - "requires": { - "locate-path": "^2.0.0" - } - }, "flush-write-stream": { "version": "1.0.3", "bundled": true, @@ -3306,18 +4426,28 @@ "version": "1.1.1", "bundled": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "requires": { + "minipass": "^2.6.0" + }, + "dependencies": { + "minipass": { + "version": "2.9.0", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" } } } }, - "fs-minipass": { - "version": "1.2.6", - "bundled": true, - "requires": { - "minipass": "^2.2.1" - } - }, "fs-vacuum": { "version": "1.2.10", "bundled": true, @@ -3405,13 +4535,16 @@ "bundled": true }, "gentle-fs": { - "version": "2.0.1", + "version": "2.3.1", "bundled": true, "requires": { "aproba": "^1.1.2", + "chownr": "^1.1.2", + "cmd-shim": "^3.0.3", "fs-vacuum": "^1.2.10", "graceful-fs": "^4.1.11", "iferr": "^0.1.5", + "infer-owner": "^1.0.4", "mkdirp": "^0.5.1", "path-is-inside": "^1.0.2", "read-cmd-shim": "^1.0.1", @@ -3429,7 +4562,7 @@ } }, "get-caller-file": { - "version": "1.0.2", + "version": "2.0.5", "bundled": true }, "get-stream": { @@ -3447,7 +4580,7 @@ } }, "glob": { - "version": "7.1.4", + "version": "7.1.6", "bundled": true, "requires": { "fs.realpath": "^1.0.0", @@ -3489,7 +4622,7 @@ } }, "graceful-fs": { - "version": "4.2.0", + "version": "4.2.4", "bundled": true }, "har-schema": { @@ -3524,11 +4657,8 @@ "bundled": true }, "hosted-git-info": { - "version": "2.8.2", - "bundled": true, - "requires": { - "lru-cache": "^5.1.1" - } + "version": "2.8.8", + "bundled": true }, "http-cache-semantics": { "version": "3.8.1", @@ -3552,7 +4682,7 @@ } }, "https-proxy-agent": { - "version": "2.2.2", + "version": "2.2.4", "bundled": true, "requires": { "agent-base": "^4.3.0", @@ -3578,7 +4708,7 @@ "bundled": true }, "ignore-walk": { - "version": "3.0.1", + "version": "3.0.3", "bundled": true, "requires": { "minimatch": "^3.0.4" @@ -3626,10 +4756,6 @@ "validate-npm-package-name": "^3.0.0" } }, - "invert-kv": { - "version": "1.0.0", - "bundled": true - }, "ip": { "version": "1.1.5", "bundled": true @@ -3643,10 +4769,10 @@ "bundled": true }, "is-ci": { - "version": "1.1.0", + "version": "1.2.1", "bundled": true, "requires": { - "ci-info": "^1.0.0" + "ci-info": "^1.5.0" }, "dependencies": { "ci-info": { @@ -3708,7 +4834,7 @@ } }, "is-retry-allowed": { - "version": "1.1.0", + "version": "1.2.0", "bundled": true }, "is-stream": { @@ -3784,15 +4910,8 @@ "version": "1.0.0", "bundled": true }, - "lcid": { - "version": "1.0.0", - "bundled": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, "libcipm": { - "version": "4.0.0", + "version": "4.0.8", "bundled": true, "requires": { "bin-links": "^1.1.2", @@ -3801,7 +4920,7 @@ "find-npm-prefix": "^1.0.2", "graceful-fs": "^4.1.11", "ini": "^1.3.5", - "lock-verify": "^2.0.2", + "lock-verify": "^2.1.0", "mkdirp": "^0.5.1", "npm-lifecycle": "^3.0.0", "npm-logical-tree": "^1.2.1", @@ -3947,7 +5066,7 @@ } }, "libnpx": { - "version": "10.2.0", + "version": "10.2.4", "bundled": true, "requires": { "dotenv": "^5.0.1", @@ -3957,15 +5076,7 @@ "update-notifier": "^2.3.0", "which": "^1.3.0", "y18n": "^4.0.0", - "yargs": "^11.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "bundled": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "yargs": "^14.2.3" } }, "lock-verify": { @@ -4061,14 +5172,14 @@ } }, "make-fetch-happen": { - "version": "5.0.0", + "version": "5.0.2", "bundled": true, "requires": { "agentkeepalive": "^3.4.1", "cacache": "^12.0.0", "http-cache-semantics": "^3.8.1", "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1", + "https-proxy-agent": "^2.2.3", "lru-cache": "^5.1.1", "mississippi": "^3.0.0", "node-fetch-npm": "^2.0.2", @@ -4078,16 +5189,9 @@ } }, "meant": { - "version": "1.0.1", + "version": "1.0.2", "bundled": true }, - "mem": { - "version": "1.1.0", - "bundled": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, "mime-db": { "version": "1.35.0", "bundled": true @@ -4099,10 +5203,6 @@ "mime-db": "~1.35.0" } }, - "mimic-fn": { - "version": "1.2.0", - "bundled": true - }, "minimatch": { "version": "3.0.4", "bundled": true, @@ -4111,30 +5211,26 @@ } }, "minimist": { - "version": "1.2.0", + "version": "1.2.5", "bundled": true }, - "minipass": { - "version": "2.3.3", + "minizlib": { + "version": "1.3.3", "bundled": true, "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "minipass": "^2.9.0" }, "dependencies": { - "yallist": { - "version": "3.0.2", - "bundled": true + "minipass": { + "version": "2.9.0", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } } } }, - "minizlib": { - "version": "1.2.1", - "bundled": true, - "requires": { - "minipass": "^2.2.1" - } - }, "mississippi": { "version": "3.0.0", "bundled": true, @@ -4152,10 +5248,16 @@ } }, "mkdirp": { - "version": "0.5.1", + "version": "0.5.5", "bundled": true, "requires": { - "minimist": "1.2.0" + "minimist": "^1.2.5" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "bundled": true + } } }, "move-concurrently": { @@ -4194,37 +5296,24 @@ } }, "node-gyp": { - "version": "5.0.3", + "version": "5.1.0", "bundled": true, "requires": { - "env-paths": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^4.4.8", - "which": "1" - }, - "dependencies": { - "nopt": { - "version": "3.0.6", - "bundled": true, - "requires": { - "abbrev": "1" - } - }, - "semver": { - "version": "5.3.0", - "bundled": true - } + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.2", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "npmlog": "^4.1.2", + "request": "^2.88.0", + "rimraf": "^2.6.3", + "semver": "^5.7.1", + "tar": "^4.4.12", + "which": "^1.3.1" } }, "nopt": { - "version": "4.0.1", + "version": "4.0.3", "bundled": true, "requires": { "abbrev": "1", @@ -4251,7 +5340,7 @@ } }, "npm-audit-report": { - "version": "1.3.2", + "version": "1.3.3", "bundled": true, "requires": { "cli-table3": "^0.5.0", @@ -4259,22 +5348,25 @@ } }, "npm-bundled": { - "version": "1.0.6", - "bundled": true + "version": "1.1.1", + "bundled": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } }, "npm-cache-filename": { "version": "1.0.2", "bundled": true }, "npm-install-checks": { - "version": "3.0.0", + "version": "3.0.2", "bundled": true, "requires": { "semver": "^2.3.0 || 3.x || 4 || 5" } }, "npm-lifecycle": { - "version": "3.1.2", + "version": "3.1.5", "bundled": true, "requires": { "byline": "^5.0.0", @@ -4291,26 +5383,31 @@ "version": "1.2.1", "bundled": true }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true + }, "npm-package-arg": { - "version": "6.1.0", + "version": "6.1.1", "bundled": true, "requires": { - "hosted-git-info": "^2.6.0", + "hosted-git-info": "^2.7.1", "osenv": "^0.1.5", - "semver": "^5.5.0", + "semver": "^5.6.0", "validate-npm-package-name": "^3.0.0" } }, "npm-packlist": { - "version": "1.4.4", + "version": "1.4.8", "bundled": true, "requires": { "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" } }, "npm-pick-manifest": { - "version": "2.2.3", + "version": "3.0.2", "bundled": true, "requires": { "figgy-pudding": "^3.5.1", @@ -4319,7 +5416,7 @@ } }, "npm-profile": { - "version": "4.0.2", + "version": "4.0.4", "bundled": true, "requires": { "aproba": "^1.1.2 || 2", @@ -4328,7 +5425,7 @@ } }, "npm-registry-fetch": { - "version": "4.0.0", + "version": "4.0.7", "bundled": true, "requires": { "JSONStream": "^1.3.4", @@ -4336,7 +5433,14 @@ "figgy-pudding": "^3.4.1", "lru-cache": "^5.1.1", "make-fetch-happen": "^5.0.0", - "npm-package-arg": "^6.1.0" + "npm-package-arg": "^6.1.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "bundled": true + } } }, "npm-run-path": { @@ -4399,15 +5503,6 @@ "version": "1.0.2", "bundled": true }, - "os-locale": { - "version": "2.1.0", - "bundled": true, - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - } - }, "os-tmpdir": { "version": "1.0.2", "bundled": true @@ -4424,24 +5519,6 @@ "version": "1.0.0", "bundled": true }, - "p-limit": { - "version": "1.2.0", - "bundled": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "bundled": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "bundled": true - }, "package-json": { "version": "4.0.1", "bundled": true, @@ -4453,14 +5530,16 @@ } }, "pacote": { - "version": "9.5.4", + "version": "9.5.12", "bundled": true, "requires": { "bluebird": "^3.5.3", - "cacache": "^12.0.0", + "cacache": "^12.0.2", + "chownr": "^1.1.2", "figgy-pudding": "^3.5.1", "get-stream": "^4.1.0", "glob": "^7.1.3", + "infer-owner": "^1.0.4", "lru-cache": "^5.1.1", "make-fetch-happen": "^5.0.0", "minimatch": "^3.0.4", @@ -4468,9 +5547,10 @@ "mississippi": "^3.0.0", "mkdirp": "^0.5.1", "normalize-package-data": "^2.4.0", + "npm-normalize-package-bin": "^1.0.0", "npm-package-arg": "^6.1.0", "npm-packlist": "^1.1.12", - "npm-pick-manifest": "^2.2.3", + "npm-pick-manifest": "^3.0.0", "npm-registry-fetch": "^4.0.0", "osenv": "^0.1.5", "promise-inflight": "^1.0.1", @@ -4480,13 +5560,13 @@ "safe-buffer": "^5.1.2", "semver": "^5.6.0", "ssri": "^6.0.1", - "tar": "^4.4.8", + "tar": "^4.4.10", "unique-filename": "^1.1.1", "which": "^1.3.1" }, "dependencies": { "minipass": { - "version": "2.3.5", + "version": "2.9.0", "bundled": true, "requires": { "safe-buffer": "^5.1.2", @@ -4663,19 +5743,13 @@ "bundled": true }, "rc": { - "version": "1.2.7", + "version": "1.2.8", "bundled": true, "requires": { - "deep-extend": "^0.5.1", + "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true - } } }, "read": { @@ -4686,7 +5760,7 @@ } }, "read-cmd-shim": { - "version": "1.0.1", + "version": "1.0.5", "bundled": true, "requires": { "graceful-fs": "^4.1.2" @@ -4706,14 +5780,14 @@ } }, "read-package-json": { - "version": "2.0.13", + "version": "2.1.1", "bundled": true, "requires": { "glob": "^7.1.1", "graceful-fs": "^4.1.2", "json-parse-better-errors": "^1.0.1", "normalize-package-data": "^2.0.0", - "slash": "^1.0.0" + "npm-normalize-package-bin": "^1.0.0" } }, "read-package-tree": { @@ -4726,7 +5800,7 @@ } }, "readable-stream": { - "version": "3.4.0", + "version": "3.6.0", "bundled": true, "requires": { "inherits": "^2.0.3", @@ -4745,7 +5819,7 @@ } }, "registry-auth-token": { - "version": "3.3.2", + "version": "3.4.0", "bundled": true, "requires": { "rc": "^1.1.6", @@ -4790,7 +5864,7 @@ "bundled": true }, "require-main-filename": { - "version": "1.0.1", + "version": "2.0.0", "bundled": true }, "resolve-from": { @@ -4802,7 +5876,7 @@ "bundled": true }, "rimraf": { - "version": "2.6.3", + "version": "2.7.1", "bundled": true, "requires": { "glob": "^7.1.3" @@ -4830,7 +5904,7 @@ "bundled": true }, "semver": { - "version": "5.7.0", + "version": "5.7.1", "bundled": true }, "semver-diff": { @@ -4866,24 +5940,20 @@ "version": "3.0.2", "bundled": true }, - "slash": { - "version": "1.0.0", - "bundled": true - }, "slide": { "version": "1.1.6", "bundled": true }, "smart-buffer": { - "version": "4.0.2", + "version": "4.1.0", "bundled": true }, "socks": { - "version": "2.3.2", + "version": "2.3.3", "bundled": true, "requires": { - "ip": "^1.1.5", - "smart-buffer": "4.0.2" + "ip": "1.1.5", + "smart-buffer": "^4.1.0" } }, "socks-proxy-agent": { @@ -4964,7 +6034,7 @@ } }, "spdx-license-ids": { - "version": "3.0.3", + "version": "3.0.5", "bundled": true }, "split-on-first": { @@ -5065,14 +6135,20 @@ } }, "string_decoder": { - "version": "1.2.0", + "version": "1.3.0", "bundled": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.0", + "bundled": true + } } }, "stringify-package": { - "version": "1.0.0", + "version": "1.0.1", "bundled": true }, "strip-ansi": { @@ -5098,12 +6174,12 @@ } }, "tar": { - "version": "4.4.10", + "version": "4.4.13", "bundled": true, "requires": { "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.3.5", + "minipass": "^2.8.6", "minizlib": "^1.2.1", "mkdirp": "^0.5.0", "safe-buffer": "^5.1.2", @@ -5111,16 +6187,12 @@ }, "dependencies": { "minipass": { - "version": "2.3.5", + "version": "2.9.0", "bundled": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" } - }, - "yallist": { - "version": "3.0.3", - "bundled": true } } }, @@ -5277,7 +6349,7 @@ } }, "uuid": { - "version": "3.3.2", + "version": "3.3.3", "bundled": true }, "validate-npm-package-license": { @@ -5341,7 +6413,7 @@ } }, "widest-line": { - "version": "2.0.0", + "version": "2.0.1", "bundled": true, "requires": { "string-width": "^2.1.1" @@ -5355,20 +6427,36 @@ } }, "wrap-ansi": { - "version": "2.1.0", + "version": "5.1.0", "bundled": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true + }, "string-width": { - "version": "1.0.2", + "version": "3.1.0", "bundled": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "bundled": true, + "requires": { + "ansi-regex": "^4.1.0" } } } @@ -5402,39 +6490,104 @@ "version": "3.0.3", "bundled": true }, - "yargs": { - "version": "11.0.0", + "yargs": { + "version": "14.2.3", + "bundled": true, + "requires": { + "cliui": "^5.0.0", + "decamelize": "^1.2.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": "^15.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "bundled": true + }, + "find-up": { + "version": "3.0.0", + "bundled": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true + }, + "locate-path": { + "version": "3.0.0", + "bundled": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "bundled": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "bundled": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "bundled": true + }, + "string-width": { + "version": "3.1.0", + "bundled": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "bundled": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "15.0.1", "bundled": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" }, "dependencies": { - "y18n": { - "version": "3.2.1", + "camelcase": { + "version": "5.3.1", "bundled": true } } - }, - "yargs-parser": { - "version": "9.0.2", - "bundled": true, - "requires": { - "camelcase": "^4.1.0" - } } } }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -5488,6 +6641,18 @@ } } }, + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + }, + "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 + }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -5496,6 +6661,18 @@ "isobject": "^3.0.0" } }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, "object.defaults": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", @@ -5507,6 +6684,29 @@ "isobject": "^3.0.0" } }, + "object.entries": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz", + "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "has": "^1.0.3" + } + }, + "object.fromentries": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", + "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, "object.map": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", @@ -5524,6 +6724,18 @@ "isobject": "^3.0.1" } }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -5545,6 +6757,29 @@ "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=" }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -5555,6 +6790,47 @@ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + } + } + }, "parse-filepath": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", @@ -5565,6 +6841,15 @@ "path-root": "^0.1.1" } }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, "parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", @@ -5580,6 +6865,18 @@ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", @@ -5608,6 +6905,23 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.4.0.tgz", "integrity": "sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w==" }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -5623,6 +6937,110 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" }, + "pkg-conf": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", + "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "load-json-file": "^5.2.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==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "load-json-file": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", + "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "parse-json": "^4.0.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0", + "type-fest": "^0.3.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "dev": true + } + } + }, + "pkg-config": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pkg-config/-/pkg-config-1.1.1.tgz", + "integrity": "sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q=", + "dev": true, + "requires": { + "debug-log": "^1.0.0", + "find-root": "^1.0.0", + "xtend": "^4.0.1" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, "platform": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.5.tgz", @@ -5643,6 +7061,12 @@ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, + "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 + }, "pretty-hrtime": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", @@ -5653,6 +7077,12 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, "promise-reduce": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/promise-reduce/-/promise-reduce-2.1.0.tgz", @@ -6002,7 +7432,7 @@ "log-utils": "^0.2.1", "pointer-symbol": "^1.0.0", "radio-symbol": "^2.0.0", - "set-value": "^2.0.1", + "set-value": "^1.0.0", "strip-color": "^0.1.0", "terminal-paginator": "^2.0.0", "toggle-array": "^1.0.1" @@ -6018,6 +7448,17 @@ } } }, + "set-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-1.0.0.tgz", + "integrity": "sha1-vMdvcaDx4HokuYfQoCr+yfZlME8=", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + }, "shallow-clone": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", @@ -6106,6 +7547,17 @@ } } }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dev": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, "proxy-addr": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", @@ -6129,6 +7581,12 @@ "once": "^1.3.1" } }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -6170,6 +7628,33 @@ "unpipe": "1.0.0" } }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, "readable-stream": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", @@ -6273,6 +7758,12 @@ } } }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", @@ -6314,9 +7805,9 @@ } }, "resolve": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", - "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "requires": { "path-parse": "^1.0.6" } @@ -6340,16 +7831,56 @@ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, "rndm": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz", "integrity": "sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w=" }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", + "dev": true + }, + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -6505,17 +8036,6 @@ "to-object-path": "^0.3.0" } }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== ", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "to-object-path": "^0.3.0" - } - }, "setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", @@ -6551,6 +8071,12 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, "simple-encryptor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/simple-encryptor/-/simple-encryptor-2.0.0.tgz", @@ -6567,6 +8093,17 @@ "is-arrayish": "^0.3.1" } }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -6696,6 +8233,38 @@ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "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 + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -6723,6 +8292,12 @@ } } }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, "sqlstring": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", @@ -6733,6 +8308,43 @@ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" }, + "standard": { + "version": "14.3.4", + "resolved": "https://registry.npmjs.org/standard/-/standard-14.3.4.tgz", + "integrity": "sha512-+lpOkFssMkljJ6eaILmqxHQ2n4csuEABmcubLTb9almFi1ElDzXb1819fjf/5ygSyePCq4kU2wMdb2fBfb9P9Q==", + "dev": true, + "requires": { + "eslint": "~6.8.0", + "eslint-config-standard": "14.1.1", + "eslint-config-standard-jsx": "8.1.0", + "eslint-plugin-import": "~2.18.0", + "eslint-plugin-node": "~10.0.0", + "eslint-plugin-promise": "~4.2.1", + "eslint-plugin-react": "~7.14.2", + "eslint-plugin-standard": "~4.0.0", + "standard-engine": "^12.0.0" + } + }, + "standard-engine": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-12.1.0.tgz", + "integrity": "sha512-DVJnWM1CGkag4ucFLGdiYWa5/kJURPONmMmk17p8FT5NE4UnPZB1vxWnXnRo2sPSL78pWJG8xEM+1Tu19z0deg==", + "dev": true, + "requires": { + "deglob": "^4.0.1", + "get-stdin": "^7.0.0", + "minimist": "^1.2.5", + "pkg-conf": "^3.1.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + } + } + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -6817,6 +8429,26 @@ "strip-ansi": "^4.0.0" } }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -6840,11 +8472,23 @@ "ansi-regex": "^3.0.0" } }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, "strip-color": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/strip-color/-/strip-color-0.1.0.tgz", "integrity": "sha1-EG9l09PmotlAHKwOsM6LinArT3s=" }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, "success-symbol": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/success-symbol/-/success-symbol-0.1.0.tgz", @@ -6866,6 +8510,52 @@ "acorn-node": "^1.2.0" } }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "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==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "tarn": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/tarn/-/tarn-1.1.5.tgz", @@ -6901,6 +8591,18 @@ "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, "tildify": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", @@ -7006,11 +8708,32 @@ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" }, + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + }, "tsscmp": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==" }, + "type-check": { + "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" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -7062,6 +8785,12 @@ } } }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -7116,6 +8845,15 @@ "cross-env": "^5.1.0" } }, + "uri-js": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", @@ -7145,6 +8883,12 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" }, + "v8-compile-cache": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "dev": true + }, "v8flags": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", @@ -7153,6 +8897,16 @@ "homedir-polyfill": "^1.0.1" } }, + "validate-npm-package-license": { + "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" + } + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -7239,11 +8993,26 @@ } } }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/src/adonisjs/package.json b/src/adonisjs/package.json index d12fb51..97ba7a4 100644 --- a/src/adonisjs/package.json +++ b/src/adonisjs/package.json @@ -35,8 +35,18 @@ "npm": "^6.13.4", "uuid": "^3.3.2" }, - "devDependencies": {}, + "devDependencies": { + "standard": "^14.3.4" + }, "autoload": { "App": "./app" + }, + "standard": { + "globals": [ + "use" + ], + "ignore": [ + "start/routes.js" + ] } } diff --git a/src/adonisjs/start/routes.js b/src/adonisjs/start/routes.js index 63f5916..595e286 100644 --- a/src/adonisjs/start/routes.js +++ b/src/adonisjs/start/routes.js @@ -20,11 +20,11 @@ Route.get('/', () => { return 'Hello from Harena Manager'} ) Route.group(() => { Route.post( '', 'v1/UserController.store') - Route.get( 'cases', 'v1/UserController.list_cases').middleware(['auth']) - Route.get( 'quests', 'v1/UserController.list_quests').middleware(['auth']) - Route.get( 'cases_by_quest', 'v1/UserController.list_cases_by_quests').middleware(['auth']) + Route.get('cases', 'v1/UserController.list_cases').middleware(['auth']) + Route.get( 'quests', 'v1/UserController.list_quests').middleware(['auth']) + Route.get( 'cases_by_quest', 'v1/UserController.list_cases_by_quests').middleware(['auth']) - Route.get( ':id', 'v1/UserController.show').middleware(['auth']) + Route.get( ':id', 'v1/UserController.show').middleware(['auth']) Route.put( ':id', 'v1/UserController.update').middleware(['auth']) Route.delete(':id', 'v1/UserController.destroy').middleware(['auth']) }).prefix('/api/v1/user') @@ -50,7 +50,7 @@ Route.group(() => { |---------------------------------------------------------------------------------------------- */ Route.group(() => { - Route.post('login', 'AuthController.login') + Route.post('login', 'AuthController.login') Route.post('logout', 'AuthController.logout').middleware(['auth']) }).prefix('/api/v2/auth') @@ -65,7 +65,7 @@ Route.group(() => { Route.group(() => { Route.get( '', 'v1/CaseController.index') Route.get( ':id', 'v1/CaseController.show') - Route.post( '', 'v1/CaseController.store') + Route.post( '', 'v1/CaseController.store') Route.put( ':id', 'v1/CaseController.update').middleware(['check_permission:contributor']) Route.post( 'share', 'v1/CaseController.share').middleware(['check_permission:author']) Route.delete(':id', 'v1/CaseController.destroy').middleware(['check_permission:author']) @@ -79,7 +79,7 @@ Route.group(() => { |---------------------------------------------------------------------------------------------- */ Route.group(() => { - Route.post( '', 'v1/ArtifactController.store') + Route.post( '', 'v1/ArtifactController.store') }).prefix('/api/v1/artifact/').middleware(['auth', 'is:author']) @@ -114,7 +114,7 @@ Route.group(() => { |---------------------------------------------------------------------------------------------- */ Route.group(() => { - Route.get( 'users', 'v1/QuestController.listUsers').middleware('quest_permission:contributor') + Route.get( 'users', 'v1/QuestController.listUsers').middleware('quest_permission:contributor') Route.post( '', 'v1/QuestController.store') @@ -130,24 +130,25 @@ Route.group(() => { |---------------------------------------------------------------------------------------------- */ Route.group(() => { - Route.get( 'users', 'v1/UserController.index') + Route.get( 'users', 'v1/UserController.index') Route.get( 'roles', 'v1/AdminController.list_roles') - Route.post( 'role', 'v1/AdminController.create_role') + Route.post( 'role', 'v1/AdminController.create_role') Route.post( 'role/link/permission', 'v1/AdminController.link_role_permission') - Route.get( 'user/:id/roles', 'v1/AdminController.list_roles_by_user') - Route.post( 'user/link/role', 'v1/AdminController.linkRoleUser') + Route.get( 'user/:id/roles', 'v1/AdminController.list_roles_by_user') + Route.post( 'user/link/role', 'v1/AdminController.linkRoleUser') - Route.get( 'quests', 'v1/QuestController.index') - Route.post( 'quest/link/user', 'v1/QuestController.linkUser') + Route.get( 'quests', 'v1/QuestController.index') + Route.post( 'quest/link/user', 'v1/QuestController.linkUser') + Route.delete('quest/:id', 'QuestController.destroy') - Route.post( 'institution', 'v1/InstitutionController.store') + Route.post( 'institution', 'v1/InstitutionController.store') - Route.post( 'revoke_tokens', 'v1/AdminController.revoke_tokens') + Route.post( 'revoke_tokens', 'v1/AdminController.revoke_tokens') }).prefix('/api/v1/admin').middleware(['auth', 'is:admin']) /* Test route */ Route.get('/api/imagetest', 'TestController.index') -Route.post('/', 'TestController.create').as('profile'); +Route.post('/', 'TestController.create').as('profile');