From 3bfcbafc84312e5dabf3818ed8502fecd4938e55 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Tue, 26 May 2020 10:09:10 +0200 Subject: [PATCH 001/163] Separate development and testing configuration --- app.js | 2 +- config/config.js | 41 +++++++++++++++++++++++++++++++++++++---- routes/dbconn.js | 2 +- routes/mailer.js | 2 +- 4 files changed, 40 insertions(+), 7 deletions(-) diff --git a/app.js b/app.js index 68d3e944..3e4b3a6f 100644 --- a/app.js +++ b/app.js @@ -16,7 +16,7 @@ i18n.configure({ directory: './locales' }); -var env = process.env.NODE_ENV || 'development'; +var env = process.env.NODE_ENV || 'testing'; const config = require('./config/config')[env]; var app = express(); diff --git a/config/config.js b/config/config.js index b4c47761..201291a1 100644 --- a/config/config.js +++ b/config/config.js @@ -2,14 +2,48 @@ module.exports = { development: { app: { name: 'User Account Management', - port: process.env.PORT || 9989 + port: process.env.PORT || 9989, + host: 'http://localhost:9989' + }, + passport: { + strategy: 'saml', + saml: { + path: process.env.SAML_PATH || '/saml/SSO', + entryPoint: process.env.SAML_ENTRY_POINT || 'https://m4lab.hft-stuttgart.de/idp/saml2/idp/SSOService.php', + issuer: 'sp-account.m4lab.hft-stuttgart.de', //local metadata + logoutUrl: 'https://m4lab.hft-stuttgart.de/idp/saml2/idp/SingleLogoutService.php' + } + }, + database: { + host: 'localhost', // DB host + user: 'DBManager', // DB username + password: 'Stuttgart2019', // DB password + port: 3306, // MySQL port + dbUser: 'userdb', // User DB + host_project: 'localhost', // DB host project db + dbProject: 'projectDB' // Project DB + }, + mailer: { + host: 'mail.hft-stuttgart.de', // hostname + secureConnection: false, // TLS requires secureConnection to be false + port: 587, // port for secure SMTP + authUser: 'ad\\support-transfer', + authPass: '6laumri2', + tlsCiphers: 'SSLv3', + from: 'support-transfer@hft-stuttgart.de', + } + }, + testing: { + app: { + name: 'User Account Management', + port: process.env.PORT || 9989, + host: 'https://m4lab.hft-stuttgart.de/account' }, passport: { strategy: 'saml', saml: { path: process.env.SAML_PATH || '/saml/SSO', entryPoint: process.env.SAML_ENTRY_POINT || 'https://m4lab.hft-stuttgart.de/idp/saml2/idp/SSOService.php', - //issuer: 'sp-account.m4lab.hft-stuttgart.de', //local metadata issuer: 'sp-account-testing.m4lab.hft-stuttgart.de', //testing metadata //issuer: 'sp-account-prod.m4lab.hft-stuttgart.de', //production metadata logoutUrl: 'https://m4lab.hft-stuttgart.de/idp/saml2/idp/SingleLogoutService.php' @@ -22,7 +56,6 @@ module.exports = { port: 3306, // MySQL port dbUser: 'userdb', // User DB host_project: 'm4lab.hft-stuttgart.de', // DB host project db - //host_project: 'localhost', // local dbProject: 'projectDB' // Project DB }, mailer: { @@ -35,4 +68,4 @@ module.exports = { from: 'support-transfer@hft-stuttgart.de', } } -} +} \ No newline at end of file diff --git a/routes/dbconn.js b/routes/dbconn.js index 834eb1aa..a39f7368 100644 --- a/routes/dbconn.js +++ b/routes/dbconn.js @@ -1,6 +1,6 @@ const mysql = require('mysql') -var env = process.env.NODE_ENV || 'development'; +var env = process.env.NODE_ENV || 'testing'; const config = require('../config/config')[env] // ==== USER ACOOUNT DB CONNECTION ==== diff --git a/routes/mailer.js b/routes/mailer.js index 510b5bb1..2c51bd7d 100644 --- a/routes/mailer.js +++ b/routes/mailer.js @@ -1,6 +1,6 @@ const nodemailer = require('nodemailer') -var env = process.env.NODE_ENV || 'development'; +var env = process.env.NODE_ENV || 'testing'; const config = require('../config/config')[env] var smtpTransport = nodemailer.createTransport({ -- GitLab From e7931881df484091d562e0dcd8e978d8ce530263 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Tue, 26 May 2020 13:45:25 +0200 Subject: [PATCH 002/163] MLAB-129: add user verification mechanism --- routes/methods.js | 102 +++++++++-- routes/routes-account.js | 291 ++++++++++++++++++++++-------- views/DE/account/home.pug | 90 ++++++--- views/DE/account/profile.pug | 18 +- views/DE/account/registration.pug | 22 +-- views/DE/account/security.pug | 18 +- views/DE/account/services.pug | 16 +- views/DE/account/verification.pug | 35 ++++ 8 files changed, 415 insertions(+), 177 deletions(-) create mode 100644 views/DE/account/verification.pug diff --git a/routes/methods.js b/routes/methods.js index 9864273b..2ba550d3 100644 --- a/routes/methods.js +++ b/routes/methods.js @@ -42,14 +42,26 @@ var methods = { throw err }); } - // COMMIT - dbconn.user.commit(function(err) { + // MLAB-129: INSERT verification token + let verificationData = { + user_id: newUserId, + token: data.verificationToken + } + dbconn.user.query('INSERT INTO verification SET ?', verificationData, function (err, results, fields) { if (err) { return dbconn.user.rollback(function() { throw err }); } - }); + // COMMIT + dbconn.user.commit(function(err) { + if (err) { + return dbconn.user.rollback(function() { + throw err + }) + } + }) + }) }) }); }); @@ -57,7 +69,7 @@ var methods = { }) }, getUserByEmail: function(email, callback) { - dbconn.user.query('SELECT salutation, title, firstname, lastname, industry, organisation, speciality FROM user WHERE email = "' +email+'"', function (err, rows, fields) { + dbconn.user.query('SELECT verificationStatus, salutation, title, firstname, lastname, industry, organisation, speciality FROM user WHERE email = "' +email+'"', function (err, rows, fields) { if (err) { throw err; } @@ -70,7 +82,7 @@ var methods = { }); }, checkUserEmail: function(email, callback) { - var user; + let user dbconn.user.query('SELECT id, email FROM user WHERE email = "' +email+'"', function (err, rows, fields) { if (err) { throw err; @@ -84,7 +96,7 @@ var methods = { }); }, getUserByToken: function(token, callback) { - var user; + let user dbconn.user.query('SELECT t1.user_id, t2.email FROM userdb.credential AS t1 INNER JOIN userdb.user AS t2 ON t1.user_id = t2.id AND t1.resetPasswordToken = "' +token+'" and resetPasswordExpires > '+Date.now(), function (err, rows, fields) { if (err) { @@ -100,42 +112,92 @@ var methods = { } ); }, - updateUser: function(userData, callback) { - dbconn.user.query('UPDATE user SET ? WHERE email = "' +userData.email+'"', userData, function (err, rows, fields) { - if (err) throw err; - callback(err); + updateUserById: function(userData, callback) { + dbconn.user.query('UPDATE user SET ? WHERE id = ' +userData.id, userData, function (err, rows, fields) { + if (err) throw err + callback(err) }) }, updateCredential: function(data, callback) { dbconn.user.query('UPDATE credential SET ? WHERE user_id = ' +data.user_id, data, function (err, rows, fields) { - if (err) throw err; - callback(err); + if (err) throw err + callback(err) }) }, getUserIdByEmail: function(email, callback) { - var userId + let userId dbconn.user.query('SELECT id FROM user WHERE email = "' +email+'"', function (err, rows, fields) { if (err) { - throw err; + throw err } else { if ( rows.length > 0) { - userId = rows[0].id; + userId = rows[0].id } } - callback(userId, err); + callback(userId, err) }); }, getUserProjectRole: function(userId, callback) { dbconn.user.query('SELECT project_id, role_id FROM user_project_role WHERE user_id = "' +userId+'"', function (err, rows, fields) { - if (err) throw err; - callback(rows, err); + if (err) throw err + callback(rows, err) }); }, addUserProjectRole: function(data, callback) { dbconn.user.query('INSERT INTO user_project_role SET ?', data, function (err, results, fields){ - if (err) throw err; - callback(err); + if (err) throw err + callback(err) + }) + }, + getVerificationTokenByUserId: function(userId, callback) { + let token + dbconn.user.query('SELECT token FROM verification WHERE user_id = "' +userId+'"', function (err, rows, fields) { + if (err) { + throw err + } + else { + if (rows.length > 0) { + token = rows[0].token + } + } + callback(token, err) + }) + }, + getUserIdByVerificationToken: function(token, callback) { + let userId + dbconn.user.query('SELECT user_id FROM verification WHERE token = "' +token+'"', function (err, rows, fields) { + if (err) { + throw err + } + else if(rows[0]) { + userId = rows[0].user_id + } + callback(userId, err) + }) + }, + verifyUserAccount: function(userData, callback) { + dbconn.user.beginTransaction(function(err) { // START TRANSACTION + if (err) { throw err } + // update user status + dbconn.user.query('UPDATE user SET ? WHERE id =' +userData.id, userData, function (err, rows, fields) { + if (err) { + return dbconn.user.rollback(function() { throw err }) + } + // delete verification token + dbconn.user.query('DELETE FROM verification WHERE user_id = '+userData.id, function (err, rows, fields) { + if (err) { + return dbconn.user.rollback(function() { throw err }) + } + // COMMIT + dbconn.user.commit(function(err) { + if (err) { + return dbconn.user.rollback(function() { throw err }) + } + }) + }) + }) + callback(err) }) }, // ======================= project db ======================= diff --git a/routes/routes-account.js b/routes/routes-account.js index 43394cac..fa97820f 100644 --- a/routes/routes-account.js +++ b/routes/routes-account.js @@ -142,10 +142,18 @@ module.exports = function (app, config, passport, i18n) { if (req.isAuthenticated()) { methods.getUserByEmail(req.user.email, function(data, err){ if (!err) { - res.render(lang+'/account/profile', { - user: data, - email: req.user.email - }); + if (data.verificationStatus == 1) { + console.log(data) + res.render(lang+'/account/profile', { + user: data, + email: req.user.email + }) + } + else { + res.render(lang+'/account/home', { + user: data + }); + } } }) } else { @@ -155,63 +163,74 @@ module.exports = function (app, config, passport, i18n) { app.get('/services', function (req, res) { if (req.isAuthenticated()) { - async.waterfall([ - // get userId by email from userdb - function(done) { - methods.getUserIdByEmail(req.user.email, function(userId, err) { - if (!err) { - done(err, userId) - } - }) - }, - // get user-project-role from userdb - function(userId, done) { - methods.getUserProjectRole(userId, function(userProjects, err) { - if (!err) { - done(err, userProjects) - } - }) - }, - // get all projects from projectdb - function(userProjects, done) { - methods.getAllProjects(function(projectsOverview, err) { - if (!err) { - done(err, userProjects, projectsOverview) - } - }) - }, - // create JSON object of projects and user status for front-end - function(userProjects, projectsOverview, done) { - var allProjects = [] // JSON object - - var userProjectId = [] // array of user's project_id - for (var i = 0; i < userProjects.length; i++) { - userProjectId.push(userProjects[i].project_id) + methods.getUserByEmail(req.user.email, function(data, err){ + if (!err) { + if (data.verificationStatus == 1) { + async.waterfall([ + // get userId by email from userdb + function(done) { + methods.getUserIdByEmail(req.user.email, function(userId, err) { + if (!err) { + done(err, userId) + } + }) + }, + // get user-project-role from userdb + function(userId, done) { + methods.getUserProjectRole(userId, function(userProjects, err) { + if (!err) { + done(err, userProjects) + } + }) + }, + // get all projects from projectdb + function(userProjects, done) { + methods.getAllProjects(function(projectsOverview, err) { + if (!err) { + done(err, userProjects, projectsOverview) + } + }) + }, + // create JSON object of projects and user status for front-end + function(userProjects, projectsOverview, done) { + var allProjects = [] // JSON object + + var userProjectId = [] // array of user's project_id + for (var i = 0; i < userProjects.length; i++) { + userProjectId.push(userProjects[i].project_id) + } + + for (var i = 0; i < projectsOverview.length; i++) { + // check if projectId is exist in userProjectId[] + var status = false + if (userProjectId.indexOf(projectsOverview[i].id) > -1) { + status = true + } + // add data to JSON object + allProjects.push({ + id: projectsOverview[i].id, + title: projectsOverview[i].title, + summary: projectsOverview[i].onelinesummary, + cp: projectsOverview[i].contact_email, + userStatus: status + }); + } + + // render the page + res.render(lang+'/account/services', { + user: data, + project: allProjects + }); + } + ]) } - - for (var i = 0; i < projectsOverview.length; i++) { - // check if projectId is exist in userProjectId[] - var status = false - if (userProjectId.indexOf(projectsOverview[i].id) > -1) { - status = true - } - // add data to JSON object - allProjects.push({ - id: projectsOverview[i].id, - title: projectsOverview[i].title, - summary: projectsOverview[i].onelinesummary, - cp: projectsOverview[i].contact_email, - userStatus: status + else { + res.render(lang+'/account/home', { + user: data }); } - - // render the page - res.render(lang+'/account/services', { - user: req.user, - project: allProjects - }); } - ]) + }) } else { res.redirect('/login'); } @@ -219,9 +238,21 @@ module.exports = function (app, config, passport, i18n) { app.get('/security', function (req, res) { if (req.isAuthenticated()) { - res.render(lang+'/account/security', { - user: req.user // useful for view engine, useless for HTML - }); + methods.getUserByEmail(req.user.email, function(data, err){ + if (!err) { + if (data.verificationStatus == 1) { + console.log(data) + res.render(lang+'/account/security', { + user: data + }) + } + else { + res.render(lang+'/account/home', { + user: data + }); + } + } + }) } else { res.redirect('/login'); } @@ -474,16 +505,11 @@ module.exports = function (app, config, passport, i18n) { }); - // todo: user registration with captcha + // ============= NEW USERS REGISTRATION =========================== app.get('/registration', function(req, res) { res.render(lang+'/account/registration') }) - app.post('/registration', function(req, res) { - // TODO: - // create gitlab account? - // send email to activate profile? - // user data var curDate = new Date() var userData = { @@ -497,27 +523,132 @@ module.exports = function (app, config, passport, i18n) { speciality: req.body.inputSpeciality, createdDate: curDate.toISOString().slice(0,10) } - // encrypt password - bcrypt.genSalt(saltRounds, function(err, salt) { - bcrypt.hash(req.body.inputPassword, salt, function(err, hash) { - // create account - var newAccount = { - profile: userData, - password: hash - } + + let token + async.waterfall([ + function(done) { + crypto.randomBytes(20, function(err, buf) { + token = buf.toString('hex'); + done(err, token); + }); + }, + // encrypt password + function(token, done) { + bcrypt.genSalt(saltRounds, function(err, salt) { + bcrypt.hash(req.body.inputPassword, salt, function(err, hash) { + var newAccount = { + profile: userData, + password: hash, + verificationToken: token + } + done(err, newAccount) + }); + }); + }, + // save data + function(newAccount, err) { methods.registerNewUser(newAccount, function(err){ if (err) { - //req.flash('error', "Failed") req.flash('error', "Fehlgeschlagen") } else { - //req.flash('success', 'Your account has been created. Please log in.') - req.flash('success', 'Ihr Benutzerkonto wurde angelegt. Bitte melden Sie sich an.') + // send email + var emailSubject = "Bitte bestätigen Sie Ihr M4_LAB Benutzerkonto" + var emailContent = "Lieber Nutzer,\n\n"+ + "vielen Dank für Ihre Anmeldung am Transferportal der HFT Stuttgart. "+ + "\nUm Ihre Anmeldung zu bestätigen, klicken Sie bitte diesen Link: "+config.app.host+"/verifyAccount?token="+token+ + "\n\nOhne Bestätigung Ihres Kontos müssen wir Ihr Konto leider nach 7 Tagen löschen.\n\n"+mailSignature + + mailer.options.to = req.body.inputEmail; + mailer.options.subject = emailSubject; + mailer.options.text = emailContent; + mailer.transport.sendMail(mailer.options, function(err) { + if (err) { + console.log('cannot send email') + throw err + } + }) + // user feedback + req.flash('success', 'Wir haben Ihnen eine E-Mail an Ihre verwendete Adresse gesendet. Diese enthält einen Link zur Bestätigung Ihres Accounts.\r\n' + + 'Wenn Sie die Mail nicht in ihrem Postfach vorfinden, prüfen Sie bitte auch Ihren Spam-Ordner.\r\n \r\n'+ + 'Ohne Bestätigung Ihres Kontos müssen wir Ihr Konto leider nach 7 Tagen löschen.') } - res.redirect('/account/registration'); + res.redirect('/account/registration') }) - }); - }); + } + ]) + }) + + // ============= USER VERIFICATION ================================ + app.get("/verifyAccount", function(req, res){ + methods.getUserIdByVerificationToken(req.query.token, function(userId, err){ + console.log(err) + console.log(userId) + if (userId) { + let userData = { + id: userId, + verificationStatus: 1 + } + methods.verifyUserAccount(userData, function(err){ + if (err) { + console.log("Error: "+err) + res.render(lang+'/account/verification', { + status: false + }); + } + else { + res.render(lang+'/account/verification', { + status: true + }); + } + }) + } + else { + res.render(lang+'/account/verification', { + status: null + }); + } + }) + }) + app.get("/resendVerificationEmail", function(req, res){ + if (req.isAuthenticated()) { + var emailAddress = req.user.email + + methods.getUserIdByEmail(req.user.email, function(userId, err) { + if (!err) { + // get token + methods.getVerificationTokenByUserId(userId, function(token, err){ + if (!err) { + if (token) { + // send email + var emailSubject = "Bitte bestätigen Sie Ihr M4_LAB Benutzerkonto" + var emailContent = "Lieber Nutzer,\n\n"+ + "vielen Dank für Ihre Anmeldung am Transferportal der HFT Stuttgart. "+ + "\nUm Ihre Anmeldung zu bestätigen, klicken Sie bitte diesen Link: "+config.app.host+"/verifyAccount?token="+token+ + "\n\nOhne Bestätigung Ihres Kontos müssen wir Ihr Konto leider nach 7 Tagen löschen.\n\n"+mailSignature + + mailer.options.to = emailAddress; + mailer.options.subject = emailSubject; + mailer.options.text = emailContent; + mailer.transport.sendMail(mailer.options, function(err) { + if (err) { + console.log('cannot send email') + throw err + } + }) + res.send(true) + } + else { + res.send(false) + } + } + else { + console.log(err) + } + }) + } + }) + } }) app.get('/email/:email', function(req, res) { diff --git a/views/DE/account/home.pug b/views/DE/account/home.pug index fa11d3f7..cf284f1a 100644 --- a/views/DE/account/home.pug +++ b/views/DE/account/home.pug @@ -7,35 +7,44 @@ html(lang="de") link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") body - div(class="container-fluid") - div(class="row min-vh-100 flex-column flex-md-row") - aside(class="col-12 col-md-2 p-0 flex-shrink-1") - nav(class="navbar navbar-expand flex-md-column flex-row align-items-start py-2") - div(class="collapse navbar-collapse") - ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") - li(class="nav-item") - a(class="nav-link pl-0 text-nowrap" href="#") - span(class="font-weight-bold" style="color:black;") #{user.firstname} #{user.lastname} - li(class="nav-item") - a(class="nav-link pl-0" href="/account/profile") - i(class="fa fa-user fa-fw") - span(class="d-none d-md-inline") Benutzerprofil - li(class="nav-item") - a(class="nav-link pl-0" href="/account/security") - i(class="fa fa-lock fa-fw") - span(class="d-none d-md-inline") Sicherheitseinstellungen - li(class="nav-item") - a(class="nav-link pl-0" href="/account/services") - i(class="fa fa-tasks fa-fw") - span(class="d-none d-md-inline") Projekte und Dienste - li(class="nav-item") - a(class="nav-link pl-0" href="/logout") - i(class="fa fa-sign-out-alt fa-fw") - span(class="d-none d-md-inline") Logout - main(class="col bg-faded py-3 flex-grow-1") - p Willkommen im Benutzerkonto-Bereich des HFT Transferportals - p In diesem Bereich können Sie Ihr Benutzerkonto pflegen.
Dazu finden Sie auf der linken Seite verschiedene Menüs. - p Bei Rückfragen kontaktieren Sie uns bitte unter: support-transfer@hft-stuttgart.de + div(class="container") + if user.verificationStatus == 0 + div.alert.alert-warning.alert-dismissible + | Willkommen im Benutzerkonto-Bereich des HFT Transferportals + |

+ | Wir haben Ihnen eine E-Mail an Ihre verwendete Adresse gesendet. Diese enthält einen Link zur Bestätigung Ihres Accounts. + | Wenn Sie die Mail nicht in ihrem Postfach vorfinden, prüfen Sie bitte auch Ihren Spam-Ordner. + |
Falls Sie keine E-Mail von uns erhalten haben, können Sie diese hier erneut anfordern. + div(class="spinner-border text-secondary", role="status", style="display: none") + else + div(class="row min-vh-100 flex-column flex-md-row") + aside(class="col-12 col-md-3 p-0 flex-shrink-1") + nav(class="navbar navbar-expand flex-md-column flex-row align-items-start py-2") + div(class="collapse navbar-collapse") + ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") + li(class="nav-item") + a(class="nav-link pl-0 text-nowrap" href="#") + span(class="font-weight-bold" style="color:black;") #{user.firstname} #{user.lastname} + li(class="nav-item") + a(class="nav-link pl-0" href="/profile") + i(class="fa fa-user fa-fw") + span(class="d-none d-md-inline") Benutzerprofil + li(class="nav-item") + a(class="nav-link pl-0" href="/security") + i(class="fa fa-lock fa-fw") + span(class="d-none d-md-inline") Sicherheitseinstellungen + li(class="nav-item") + a(class="nav-link pl-0" href="/services") + i(class="fa fa-tasks fa-fw") + span(class="d-none d-md-inline") Projekte und Dienste + li(class="nav-item") + a(class="nav-link pl-0" href="/logout" style="color:red;") + i(class="fa fa-sign-out-alt fa-fw") + span(class="d-none d-md-inline") Logout + main(class="col bg-faded py-3 flex-grow-1") + p Willkommen im Benutzerkonto-Bereich des HFT Transferportals + p In diesem Bereich können Sie Ihr Benutzerkonto pflegen.
Dazu finden Sie auf der linken Seite verschiedene Menüs. + p Bei Rückfragen kontaktieren Sie uns bitte unter: support-transfer@hft-stuttgart.de // jQuery script(src="https://code.jquery.com/jquery-3.3.1.min.js") @@ -43,4 +52,25 @@ html(lang="de") // Bootstrap script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") // M4_LAB - script(src="/js/headfoot.js") \ No newline at end of file + script(src="https://m4lab.hft-stuttgart.de/js/headfoot.js") + script. + // call verifyAccount + function verify() { + $(".spinner-border").show() + $.get( "/resendVerificationEmail", function( data ) { + console.log(data) + if (data) { + alert( "Email sent!" ) + } + else { + alert("Please contact support-transfer@hft-stuttgart.de to verify your account.") + } + }) + .fail(function() { + alert( "Something went wrong. Please try again." ) // todo: to DE + }) + .always(function() { + $(".spinner-border").hide() + }) + + } \ No newline at end of file diff --git a/views/DE/account/profile.pug b/views/DE/account/profile.pug index 12f78989..c69b3479 100644 --- a/views/DE/account/profile.pug +++ b/views/DE/account/profile.pug @@ -7,29 +7,29 @@ html(lang="de") link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") body - div(class="container-fluid") + div(class="container") div(class="row min-vh-100 flex-column flex-md-row") - aside(class="col-12 col-md-2 p-0 flex-shrink-1") + aside(class="col-12 col-md-3 p-0 flex-shrink-1") nav(class="navbar navbar-expand flex-md-column flex-row align-items-start py-2") div(class="collapse navbar-collapse") ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") li(class="nav-item") - a(class="nav-link pl-0 text-nowrap" href="#") + a(class="nav-link pl-0 text-nowrap" href="/") span(class="font-weight-bold" style="color:black;") #{user.firstname} #{user.lastname} li(class="nav-item") - a(class="nav-link pl-0" href="/account/profile") + a(class="nav-link pl-0" href="/profile") i(class="fa fa-user fa-fw" style="color:black;") span(class="d-none d-md-inline" style="color:black;") Benutzerprofil li(class="nav-item") - a(class="nav-link pl-0" href="/account/security") + a(class="nav-link pl-0" href="/security") i(class="fa fa-lock fa-fw") span(class="d-none d-md-inline") Sicherheitseinstellungen li(class="nav-item") - a(class="nav-link pl-0" href="/account/services") + a(class="nav-link pl-0" href="/services") i(class="fa fa-tasks fa-fw") span(class="d-none d-md-inline") Projekte und Dienste li(class="nav-item") - a(class="nav-link pl-0" href="/logout") + a(class="nav-link pl-0" href="/logout" style="color:red;") i(class="fa fa-sign-out-alt fa-fw") span(class="d-none d-md-inline") Logout main(class="col bg-faded py-3 flex-grow-1") @@ -45,7 +45,7 @@ html(lang="de") div(class="form-row") div(class='form-group col-md-2') label(for="title") Anrede - select#inputSalutation(name="inputSalutation", class="form-control", , value=user.salutation) + select#inputSalutation(name="inputSalutation", class="form-control", value=user.salutation) option(value="") - Anrede - option(value="Herr") Herr option(value="Frau") Frau @@ -99,4 +99,4 @@ html(lang="de") // Bootstrap script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") // M4_LAB - script(src="/js/headfoot.js") \ No newline at end of file + script(src="https://m4lab.hft-stuttgart.de/js/headfoot.js") \ No newline at end of file diff --git a/views/DE/account/registration.pug b/views/DE/account/registration.pug index 3de3ed5a..64c796ea 100644 --- a/views/DE/account/registration.pug +++ b/views/DE/account/registration.pug @@ -7,26 +7,6 @@ html(lang="de") link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. - .collapse { - display: none; - } - .collapse.in { - display: block; - } - .collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition-timing-function: ease; - -o-transition-timing-function: ease; - transition-timing-function: ease; - -webkit-transition-duration: .35s; - -o-transition-duration: .35s; - transition-duration: .35s; - -webkit-transition-property: height,visibility; - -o-transition-property: height,visibility; - transition-property: height,visibility; - } .warning { color: red; font-size: 11px; @@ -94,4 +74,4 @@ html(lang="de") // M4_LAB script(src="/js/generalFunction.js") script(src="/js/registration.js") - script(src="/js/headfoot.js") \ No newline at end of file + script(src="https://m4lab.hft-stuttgart.de/js/headfoot.js") \ No newline at end of file diff --git a/views/DE/account/security.pug b/views/DE/account/security.pug index 15c43887..16b9458a 100644 --- a/views/DE/account/security.pug +++ b/views/DE/account/security.pug @@ -11,29 +11,29 @@ html(lang="de") font-size: 11px; } body - div(class="container-fluid") + div(class="container") div(class="row min-vh-100 flex-column flex-md-row") - aside(class="col-12 col-md-2 p-0 flex-shrink-1") + aside(class="col-12 col-md-3 p-0 flex-shrink-1") nav(class="navbar navbar-expand flex-md-column flex-row align-items-start py-2") div(class="collapse navbar-collapse") ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") li(class="nav-item") - a(class="nav-link pl-0 text-nowrap" href="#") + a(class="nav-link pl-0 text-nowrap" href="/") span(class="font-weight-bold" style="color:black;") #{user.firstname} #{user.lastname} li(class="nav-item") - a(class="nav-link pl-0" href="/account/profile") + a(class="nav-link pl-0" href="/profile") i(class="fa fa-user fa-fw") span(class="d-none d-md-inline") Benutzerprofil li(class="nav-item") - a(class="nav-link pl-0" href="/account/security") + a(class="nav-link pl-0" href="/security") i(class="fa fa-lock fa-fw" style="color:black;") span(class="d-none d-md-inline" style="color:black;") Sicherheitseinstellungen li(class="nav-item") - a(class="nav-link pl-0" href="/account/services") + a(class="nav-link pl-0" href="/services") i(class="fa fa-tasks fa-fw") span(class="d-none d-md-inline") Projekte und Dienste li(class="nav-item") - a(class="nav-link pl-0" href="/logout") + a(class="nav-link pl-0" href="/logout" style="color:red;") i(class="fa fa-sign-out-alt fa-fw") span(class="d-none d-md-inline") Logout main(class="col bg-faded py-3 flex-grow-1") @@ -64,7 +64,7 @@ html(lang="de") span#message div(class="invalid-feedback") Bitte füllen Sie dieses Feld aus. input#updateBtn(type="submit", class="btn btn-primary", value="Passwort ändern" disabled) - + // jQuery script(src="https://code.jquery.com/jquery-3.3.1.min.js") script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous") @@ -73,7 +73,7 @@ html(lang="de") // M4_LAB script(src="/js/security.js") script(src="/js/generalFunction.js") - script(src="/js/headfoot.js") + script(src="https://m4lab.hft-stuttgart.de/js/headfoot.js") script. // check input fields 'use strict'; diff --git a/views/DE/account/services.pug b/views/DE/account/services.pug index 8b99f630..e1b65887 100644 --- a/views/DE/account/services.pug +++ b/views/DE/account/services.pug @@ -7,29 +7,29 @@ html(lang="de") link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") body - div(class="container-fluid") + div(class="container") div(class="row min-vh-100 flex-column flex-md-row") - aside(class="col-12 col-md-2 p-0 flex-shrink-1") + aside(class="col-12 col-md-3 p-0 flex-shrink-1") nav(class="navbar navbar-expand flex-md-column flex-row align-items-start py-2") div(class="collapse navbar-collapse") ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") li(class="nav-item") - a(class="nav-link pl-0 text-nowrap" href="#") + a(class="nav-link pl-0 text-nowrap" href="/") span(class="font-weight-bold" style="color:black;") #{user.firstname} #{user.lastname} li(class="nav-item") - a(class="nav-link pl-0" href="/account/profile") + a(class="nav-link pl-0" href="/profile") i(class="fa fa-user fa-fw") span(class="d-none d-md-inline") Benutzerprofil li(class="nav-item") - a(class="nav-link pl-0" href="/account/security") + a(class="nav-link pl-0" href="/security") i(class="fa fa-lock fa-fw") span(class="d-none d-md-inline") Sicherheitseinstellungen li(class="nav-item") - a(class="nav-link pl-0" href="/account/services") + a(class="nav-link pl-0" href="/services") i(class="fa fa-tasks fa-fw" style="color:black;") span(class="d-none d-md-inline" style="color:black;") Projekte und Dienste li(class="nav-item") - a(class="nav-link pl-0" href="/logout") + a(class="nav-link pl-0" href="/logout" style="color:red;") i(class="fa fa-sign-out-alt fa-fw") span(class="d-none d-md-inline") Logout main(class="col bg-faded py-3 flex-grow-1") @@ -41,4 +41,4 @@ html(lang="de") // Bootstrap script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") // M4_LAB - script(src="/js/headfoot.js") \ No newline at end of file + script(src="https://m4lab.hft-stuttgart.de/js/headfoot.js") \ No newline at end of file diff --git a/views/DE/account/verification.pug b/views/DE/account/verification.pug new file mode 100644 index 00000000..575e8e74 --- /dev/null +++ b/views/DE/account/verification.pug @@ -0,0 +1,35 @@ +doctype html +html(lang="de") + head + title= "User Verification" + meta(charset="UTF-8") + meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") + link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") + style. + .container { + height: 400px; + position: relative; + } + .center { + margin: 0; + position: absolute; + top: 50%; + left: 50%; + -ms-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + } + body + div(class="container") + div(class="center", align="center") + a(href="https://m4lab.hft-stuttgart.de") + img(src="https://transfer.hft-stuttgart.de/images/demo/m4lab_logo.jpg", class="img-responsive center-block", width="185", height="192") + br + br + if status == true + p(class="h5") Ihr Benutzerkonto wurde bestätigt. Bitte melden Sie sich an. + else if status == false + p(class="h5") Ihr Benutzerkonto konnte nicht bestätigt werden, bitte versuchen Sie es erneut. + else + p(class="h5") Ihr Benutzerkonto wude nicht gefunden. + // Bootstrap + script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") \ No newline at end of file -- GitLab From 424fc8a462acd2f5e92e9ecce476ed114d6a53ed Mon Sep 17 00:00:00 2001 From: Rosanny Date: Tue, 26 May 2020 14:18:52 +0200 Subject: [PATCH 003/163] MLAB-129: add welcome email after successful verification --- routes/methods.js | 13 +++++++++++++ routes/routes-account.js | 27 +++++++++++++++++++++++++-- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/routes/methods.js b/routes/methods.js index 2ba550d3..2bafb470 100644 --- a/routes/methods.js +++ b/routes/methods.js @@ -80,6 +80,19 @@ var methods = { } callback(user, err); }); + }, + getUserById: function(userId, callback) { + dbconn.user.query('SELECT verificationStatus, email, salutation, title, firstname, lastname, industry, organisation, speciality FROM user WHERE id = ' +userId, function (err, rows, fields) { + if (err) { + throw err; + } + else { + if ( rows.length > 0) { + user = rows[0]; + } + } + callback(user, err); + }); }, checkUserEmail: function(email, callback) { let user diff --git a/routes/routes-account.js b/routes/routes-account.js index fa97820f..9b6c9ae8 100644 --- a/routes/routes-account.js +++ b/routes/routes-account.js @@ -581,9 +581,8 @@ module.exports = function (app, config, passport, i18n) { // ============= USER VERIFICATION ================================ app.get("/verifyAccount", function(req, res){ + console.log(req.query) methods.getUserIdByVerificationToken(req.query.token, function(userId, err){ - console.log(err) - console.log(userId) if (userId) { let userData = { id: userId, @@ -597,6 +596,30 @@ module.exports = function (app, config, passport, i18n) { }); } else { + // send welcome email after successful account verification + methods.getUserById(userId, function(data, err){ + if (err) { + console.log("Error: "+err) + } + else { + // send email + var emailSubject = "Herzlich willkommen" + var emailContent = "Lieber Nutzer,\n\n"+ + "herzlich willkommen beim Transferportal der HFT Stuttgart!\n"+ + "Sie können nun alle Dienste des Portals nutzen.\n\n"+mailSignature + + mailer.options.to = data.email; + mailer.options.subject = emailSubject; + mailer.options.text = emailContent; + mailer.transport.sendMail(mailer.options, function(err) { + if (err) { + console.log('cannot send email') + throw err + } + }) + } + }) + res.render(lang+'/account/verification', { status: true }); -- GitLab From 2560776afdc973aba12eafe94b0c4a5fb2d67c0e Mon Sep 17 00:00:00 2001 From: Rosanny Date: Tue, 26 May 2020 14:31:22 +0200 Subject: [PATCH 004/163] MLAB-129: correcting user feedback and email content upon registration --- routes/routes-account.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/routes/routes-account.js b/routes/routes-account.js index 9b6c9ae8..676796ba 100644 --- a/routes/routes-account.js +++ b/routes/routes-account.js @@ -555,9 +555,10 @@ module.exports = function (app, config, passport, i18n) { // send email var emailSubject = "Bitte bestätigen Sie Ihr M4_LAB Benutzerkonto" var emailContent = "Lieber Nutzer,\n\n"+ - "vielen Dank für Ihre Anmeldung am Transferportal der HFT Stuttgart. "+ - "\nUm Ihre Anmeldung zu bestätigen, klicken Sie bitte diesen Link: "+config.app.host+"/verifyAccount?token="+token+ - "\n\nOhne Bestätigung Ihres Kontos müssen wir Ihr Konto leider nach 7 Tagen löschen.\n\n"+mailSignature + "vielen Dank für Ihre Anmeldung am Transferportal der HFT Stuttgart.\n"+ + "Um Ihre Anmeldung zu bestätigen, klicken Sie bitte diesen Link: "+config.app.host+"/verifyAccount?token="+token+"\n"+ + "Ohne Bestätigung Ihres Kontos müssen wir Ihr Konto leider nach 7 Tagen löschen.\n\n"+ + "Sollten Sie sich selbst nicht mit Ihren Daten am Transferportal registriert haben, ignorieren Sie diese E-Mail bitte.\n\n"+mailSignature mailer.options.to = req.body.inputEmail; mailer.options.subject = emailSubject; @@ -569,9 +570,9 @@ module.exports = function (app, config, passport, i18n) { } }) // user feedback - req.flash('success', 'Wir haben Ihnen eine E-Mail an Ihre verwendete Adresse gesendet. Diese enthält einen Link zur Bestätigung Ihres Accounts.\r\n' + - 'Wenn Sie die Mail nicht in ihrem Postfach vorfinden, prüfen Sie bitte auch Ihren Spam-Ordner.\r\n \r\n'+ - 'Ohne Bestätigung Ihres Kontos müssen wir Ihr Konto leider nach 7 Tagen löschen.') + req.flash('success', 'Vielen Dank für Ihre Registrierung!'+'\r\n\r\n'+ + 'Wir haben Ihnen eine E-Mail an Ihre verwendete Adresse gesendet. Diese enthält einen Link zur Bestätigung Ihres Accounts.'+'\r\n'+ + 'Wenn Sie die Mail nicht in ihrem Postfach vorfinden, prüfen Sie bitte auch Ihren Spam-Ordner.') } res.redirect('/account/registration') }) -- GitLab From 1a5ef222b098e4b38e1b46d55bbeba1508da6f53 Mon Sep 17 00:00:00 2001 From: Wolfgang Knopki Date: Tue, 26 May 2020 15:01:30 +0200 Subject: [PATCH 005/163] fixed sidebar links --- views/DE/account/profile.pug | 8 ++++---- views/DE/account/security.pug | 8 ++++---- views/DE/account/services.pug | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/views/DE/account/profile.pug b/views/DE/account/profile.pug index c69b3479..ae666c9d 100644 --- a/views/DE/account/profile.pug +++ b/views/DE/account/profile.pug @@ -14,18 +14,18 @@ html(lang="de") div(class="collapse navbar-collapse") ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") li(class="nav-item") - a(class="nav-link pl-0 text-nowrap" href="/") + a(class="nav-link pl-0 text-nowrap" href="/account/") span(class="font-weight-bold" style="color:black;") #{user.firstname} #{user.lastname} li(class="nav-item") - a(class="nav-link pl-0" href="/profile") + a(class="nav-link pl-0" href="/account/profile") i(class="fa fa-user fa-fw" style="color:black;") span(class="d-none d-md-inline" style="color:black;") Benutzerprofil li(class="nav-item") - a(class="nav-link pl-0" href="/security") + a(class="nav-link pl-0" href="/account/security") i(class="fa fa-lock fa-fw") span(class="d-none d-md-inline") Sicherheitseinstellungen li(class="nav-item") - a(class="nav-link pl-0" href="/services") + a(class="nav-link pl-0" href="/account/services") i(class="fa fa-tasks fa-fw") span(class="d-none d-md-inline") Projekte und Dienste li(class="nav-item") diff --git a/views/DE/account/security.pug b/views/DE/account/security.pug index 16b9458a..e768359c 100644 --- a/views/DE/account/security.pug +++ b/views/DE/account/security.pug @@ -18,18 +18,18 @@ html(lang="de") div(class="collapse navbar-collapse") ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") li(class="nav-item") - a(class="nav-link pl-0 text-nowrap" href="/") + a(class="nav-link pl-0 text-nowrap" href="/account/") span(class="font-weight-bold" style="color:black;") #{user.firstname} #{user.lastname} li(class="nav-item") - a(class="nav-link pl-0" href="/profile") + a(class="nav-link pl-0" href="/account/profile") i(class="fa fa-user fa-fw") span(class="d-none d-md-inline") Benutzerprofil li(class="nav-item") - a(class="nav-link pl-0" href="/security") + a(class="nav-link pl-0" href="/account/security") i(class="fa fa-lock fa-fw" style="color:black;") span(class="d-none d-md-inline" style="color:black;") Sicherheitseinstellungen li(class="nav-item") - a(class="nav-link pl-0" href="/services") + a(class="nav-link pl-0" href="/account/services") i(class="fa fa-tasks fa-fw") span(class="d-none d-md-inline") Projekte und Dienste li(class="nav-item") diff --git a/views/DE/account/services.pug b/views/DE/account/services.pug index e1b65887..49497ca1 100644 --- a/views/DE/account/services.pug +++ b/views/DE/account/services.pug @@ -17,15 +17,15 @@ html(lang="de") a(class="nav-link pl-0 text-nowrap" href="/") span(class="font-weight-bold" style="color:black;") #{user.firstname} #{user.lastname} li(class="nav-item") - a(class="nav-link pl-0" href="/profile") + a(class="nav-link pl-0" href="/account/profile") i(class="fa fa-user fa-fw") span(class="d-none d-md-inline") Benutzerprofil li(class="nav-item") - a(class="nav-link pl-0" href="/security") + a(class="nav-link pl-0" href="/account/security") i(class="fa fa-lock fa-fw") span(class="d-none d-md-inline") Sicherheitseinstellungen li(class="nav-item") - a(class="nav-link pl-0" href="/services") + a(class="nav-link pl-0" href="/account/services") i(class="fa fa-tasks fa-fw" style="color:black;") span(class="d-none d-md-inline" style="color:black;") Projekte und Dienste li(class="nav-item") -- GitLab From 21807ab9bf58f08f4c515fbda6661a3c0401d7eb Mon Sep 17 00:00:00 2001 From: Wolfgang Knopki Date: Tue, 26 May 2020 15:05:56 +0200 Subject: [PATCH 006/163] fixed sidebar links home.pug --- views/DE/account/home.pug | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/views/DE/account/home.pug b/views/DE/account/home.pug index cf284f1a..68004228 100644 --- a/views/DE/account/home.pug +++ b/views/DE/account/home.pug @@ -26,15 +26,15 @@ html(lang="de") a(class="nav-link pl-0 text-nowrap" href="#") span(class="font-weight-bold" style="color:black;") #{user.firstname} #{user.lastname} li(class="nav-item") - a(class="nav-link pl-0" href="/profile") + a(class="nav-link pl-0" href="/account/profile") i(class="fa fa-user fa-fw") span(class="d-none d-md-inline") Benutzerprofil li(class="nav-item") - a(class="nav-link pl-0" href="/security") + a(class="nav-link pl-0" href="/account/security") i(class="fa fa-lock fa-fw") span(class="d-none d-md-inline") Sicherheitseinstellungen li(class="nav-item") - a(class="nav-link pl-0" href="/services") + a(class="nav-link pl-0" href="/account/services") i(class="fa fa-tasks fa-fw") span(class="d-none d-md-inline") Projekte und Dienste li(class="nav-item") -- GitLab From 2d63274c3ab811fcf9c81b22ac2f4ef0ad8fad50 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Tue, 26 May 2020 15:49:24 +0200 Subject: [PATCH 007/163] MLAB-227: prevent HFT account to access "security" page --- routes/methods.js | 2 +- routes/routes-account.js | 3 +-- views/DE/account/home.pug | 9 +++++---- views/DE/account/profile.pug | 9 +++++---- views/DE/account/services.pug | 9 +++++---- 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/routes/methods.js b/routes/methods.js index 2bafb470..7b34268a 100644 --- a/routes/methods.js +++ b/routes/methods.js @@ -69,7 +69,7 @@ var methods = { }) }, getUserByEmail: function(email, callback) { - dbconn.user.query('SELECT verificationStatus, salutation, title, firstname, lastname, industry, organisation, speciality FROM user WHERE email = "' +email+'"', function (err, rows, fields) { + dbconn.user.query('SELECT verificationStatus, salutation, title, firstname, lastname, industry, organisation, speciality, m4lab_idp FROM user WHERE email = "' +email+'"', function (err, rows, fields) { if (err) { throw err; } diff --git a/routes/routes-account.js b/routes/routes-account.js index 676796ba..10f9ae7e 100644 --- a/routes/routes-account.js +++ b/routes/routes-account.js @@ -240,8 +240,7 @@ module.exports = function (app, config, passport, i18n) { if (req.isAuthenticated()) { methods.getUserByEmail(req.user.email, function(data, err){ if (!err) { - if (data.verificationStatus == 1) { - console.log(data) + if (data.verificationStatus == 1 && data.m4lab_idp == 1) { res.render(lang+'/account/security', { user: data }) diff --git a/views/DE/account/home.pug b/views/DE/account/home.pug index 68004228..f20eafc9 100644 --- a/views/DE/account/home.pug +++ b/views/DE/account/home.pug @@ -29,10 +29,11 @@ html(lang="de") a(class="nav-link pl-0" href="/account/profile") i(class="fa fa-user fa-fw") span(class="d-none d-md-inline") Benutzerprofil - li(class="nav-item") - a(class="nav-link pl-0" href="/account/security") - i(class="fa fa-lock fa-fw") - span(class="d-none d-md-inline") Sicherheitseinstellungen + if user.m4lab_idp == 1 + li(class="nav-item") + a(class="nav-link pl-0" href="/account/security") + i(class="fa fa-lock fa-fw") + span(class="d-none d-md-inline") Sicherheitseinstellungen li(class="nav-item") a(class="nav-link pl-0" href="/account/services") i(class="fa fa-tasks fa-fw") diff --git a/views/DE/account/profile.pug b/views/DE/account/profile.pug index ae666c9d..e66e4eca 100644 --- a/views/DE/account/profile.pug +++ b/views/DE/account/profile.pug @@ -20,10 +20,11 @@ html(lang="de") a(class="nav-link pl-0" href="/account/profile") i(class="fa fa-user fa-fw" style="color:black;") span(class="d-none d-md-inline" style="color:black;") Benutzerprofil - li(class="nav-item") - a(class="nav-link pl-0" href="/account/security") - i(class="fa fa-lock fa-fw") - span(class="d-none d-md-inline") Sicherheitseinstellungen + if user.m4lab_idp == 1 + li(class="nav-item") + a(class="nav-link pl-0" href="/account/security") + i(class="fa fa-lock fa-fw") + span(class="d-none d-md-inline") Sicherheitseinstellungen li(class="nav-item") a(class="nav-link pl-0" href="/account/services") i(class="fa fa-tasks fa-fw") diff --git a/views/DE/account/services.pug b/views/DE/account/services.pug index 49497ca1..cb911250 100644 --- a/views/DE/account/services.pug +++ b/views/DE/account/services.pug @@ -20,10 +20,11 @@ html(lang="de") a(class="nav-link pl-0" href="/account/profile") i(class="fa fa-user fa-fw") span(class="d-none d-md-inline") Benutzerprofil - li(class="nav-item") - a(class="nav-link pl-0" href="/account/security") - i(class="fa fa-lock fa-fw") - span(class="d-none d-md-inline") Sicherheitseinstellungen + if user.m4lab_idp == 1 + li(class="nav-item") + a(class="nav-link pl-0" href="/account/security") + i(class="fa fa-lock fa-fw") + span(class="d-none d-md-inline") Sicherheitseinstellungen li(class="nav-item") a(class="nav-link pl-0" href="/account/services") i(class="fa fa-tasks fa-fw" style="color:black;") -- GitLab From 354419d8cfe80f5abf8b4c6477a08089345919e5 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Fri, 19 Jun 2020 16:30:24 +0200 Subject: [PATCH 008/163] MLAB 249: Prevent HFT accounts to create an account from the registration page. --- routes/routes-account.js | 115 ++++++++++++++++-------------- views/DE/account/registration.pug | 9 ++- 2 files changed, 69 insertions(+), 55 deletions(-) diff --git a/routes/routes-account.js b/routes/routes-account.js index 10f9ae7e..40c54b58 100644 --- a/routes/routes-account.js +++ b/routes/routes-account.js @@ -523,60 +523,71 @@ module.exports = function (app, config, passport, i18n) { createdDate: curDate.toISOString().slice(0,10) } - let token - async.waterfall([ - function(done) { - crypto.randomBytes(20, function(err, buf) { - token = buf.toString('hex'); - done(err, token); - }); - }, - // encrypt password - function(token, done) { - bcrypt.genSalt(saltRounds, function(err, salt) { - bcrypt.hash(req.body.inputPassword, salt, function(err, hash) { - var newAccount = { - profile: userData, - password: hash, - verificationToken: token - } - done(err, newAccount) + var userEmail = userData.email + var pos = userEmail.indexOf('@') + var emailLength = userEmail.length + var emailDomain = userEmail.slice(pos, emailLength); + + if ( emailDomain.toLowerCase() == "@hft-stuttgart.de") { + req.flash('error', "Fehlgeschlagen: HFT-Account") + res.redirect('/account/registration'); + } + else { + let token + async.waterfall([ + function(done) { + crypto.randomBytes(20, function(err, buf) { + token = buf.toString('hex'); + done(err, token); }); - }); - }, - // save data - function(newAccount, err) { - methods.registerNewUser(newAccount, function(err){ - if (err) { - req.flash('error', "Fehlgeschlagen") - } - else { - // send email - var emailSubject = "Bitte bestätigen Sie Ihr M4_LAB Benutzerkonto" - var emailContent = "Lieber Nutzer,\n\n"+ - "vielen Dank für Ihre Anmeldung am Transferportal der HFT Stuttgart.\n"+ - "Um Ihre Anmeldung zu bestätigen, klicken Sie bitte diesen Link: "+config.app.host+"/verifyAccount?token="+token+"\n"+ - "Ohne Bestätigung Ihres Kontos müssen wir Ihr Konto leider nach 7 Tagen löschen.\n\n"+ - "Sollten Sie sich selbst nicht mit Ihren Daten am Transferportal registriert haben, ignorieren Sie diese E-Mail bitte.\n\n"+mailSignature - - mailer.options.to = req.body.inputEmail; - mailer.options.subject = emailSubject; - mailer.options.text = emailContent; - mailer.transport.sendMail(mailer.options, function(err) { - if (err) { - console.log('cannot send email') - throw err + }, + // encrypt password + function(token, done) { + bcrypt.genSalt(saltRounds, function(err, salt) { + bcrypt.hash(req.body.inputPassword, salt, function(err, hash) { + var newAccount = { + profile: userData, + password: hash, + verificationToken: token } - }) - // user feedback - req.flash('success', 'Vielen Dank für Ihre Registrierung!'+'\r\n\r\n'+ - 'Wir haben Ihnen eine E-Mail an Ihre verwendete Adresse gesendet. Diese enthält einen Link zur Bestätigung Ihres Accounts.'+'\r\n'+ - 'Wenn Sie die Mail nicht in ihrem Postfach vorfinden, prüfen Sie bitte auch Ihren Spam-Ordner.') - } - res.redirect('/account/registration') - }) - } - ]) + done(err, newAccount) + }); + }); + }, + // save data + function(newAccount, err) { + methods.registerNewUser(newAccount, function(err){ + if (err) { + req.flash('error', "Fehlgeschlagen") + } + else { + // send email + var emailSubject = "Bitte bestätigen Sie Ihr M4_LAB Benutzerkonto" + var emailContent = "Lieber Nutzer,\n\n"+ + "vielen Dank für Ihre Anmeldung am Transferportal der HFT Stuttgart.\n"+ + "Um Ihre Anmeldung zu bestätigen, klicken Sie bitte diesen Link: "+config.app.host+"/verifyAccount?token="+token+"\n"+ + "Ohne Bestätigung Ihres Kontos müssen wir Ihr Konto leider nach 7 Tagen löschen.\n\n"+ + "Sollten Sie sich selbst nicht mit Ihren Daten am Transferportal registriert haben, ignorieren Sie diese E-Mail bitte.\n\n"+mailSignature + + mailer.options.to = req.body.inputEmail; + mailer.options.subject = emailSubject; + mailer.options.text = emailContent; + mailer.transport.sendMail(mailer.options, function(err) { + if (err) { + console.log('cannot send email') + throw err + } + }) + // user feedback + req.flash('success', 'Vielen Dank für Ihre Registrierung!'+'\r\n\r\n'+ + 'Wir haben Ihnen eine E-Mail an Ihre verwendete Adresse gesendet. Diese enthält einen Link zur Bestätigung Ihres Accounts.'+'\r\n'+ + 'Wenn Sie die Mail nicht in ihrem Postfach vorfinden, prüfen Sie bitte auch Ihren Spam-Ordner.') + } + res.redirect('/account/registration') + }) + } + ]) + } }) // ============= USER VERIFICATION ================================ diff --git a/views/DE/account/registration.pug b/views/DE/account/registration.pug index 64c796ea..dc42f50c 100644 --- a/views/DE/account/registration.pug +++ b/views/DE/account/registration.pug @@ -14,9 +14,12 @@ html(lang="de") body div(class="container-fluid") div(class="row") - div(class="col-md-6 offset-md-2") + div(class="pt-4 pb-4 col-md-6 offset-md-2") h3(class="mb-3 font-weight-bold") Neues Benutzerkonto anlegen div(class="col-md-6 offset-md-3") + div(class="alert alert-info" role="alert") + | Auf dieser Seite können sich Benutzer, die keinen Account an der HFT haben, registrieren.
+ | Um sich mit ihrem HFT-Account anzumelden, klicken Sie hier. if successes for success in successes div.alert.alert-success.alert-dismissible #{ success } @@ -26,7 +29,7 @@ html(lang="de") div.alert.alert-danger.alert-dismissible.fade.show #{ error } a(class="close", href="#", data-dismiss="alert", aria-label="close") × form(method="POST") - h5(class="mb-3 font-weight-bold") Anmeldedaten + h5(class="pt-2 mb-3 font-weight-bold") Anmeldedaten div(class='form-row') div(class='form-group col-md-6') input#inputEmail(name="inputEmail", type="email", class="form-control", placeholder="E-Mail-Adresse*", maxlength="45" required) @@ -34,7 +37,7 @@ html(lang="de") div(class="form-group col-md-6") input#inputPassword(name="inputPassword", type="password", class="form-control", data-toggle="password", placeholder="Passwort*", maxlength="45" required) span#passwordWarning(class='warning') - h5(class="mb-3 font-weight-bold") Benutzerprofil + h5(class="pt-2 mb-3 font-weight-bold") Benutzerprofil div(class="form-row") div(class='form-group col-md-2') select#inputSalutation(name="inputSalutation", class="form-control") -- GitLab From eccdf3f41b2e7d51eedb9118a8d597a58400bb32 Mon Sep 17 00:00:00 2001 From: Wolfgang Knopki Date: Mon, 22 Jun 2020 11:15:50 +0000 Subject: [PATCH 009/163] Update projects.pug, adjusted bootstrap.css link --- views/DE/project/projects.pug | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/DE/project/projects.pug b/views/DE/project/projects.pug index c2730b80..09d3a93b 100644 --- a/views/DE/project/projects.pug +++ b/views/DE/project/projects.pug @@ -4,7 +4,7 @@ html(lang="de") title= "Project List" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") + link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .collapse { -- GitLab From 62d0f795dc0d8e2a191d5fdf2c6cca8c77bab07a Mon Sep 17 00:00:00 2001 From: Wolfgang Knopki Date: Mon, 22 Jun 2020 11:17:17 +0000 Subject: [PATCH 010/163] Update projectOverview.pug, adjusted bootstrap.css link --- views/DE/project/projectOverview.pug | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/DE/project/projectOverview.pug b/views/DE/project/projectOverview.pug index e015d1e6..b7d9c9ee 100644 --- a/views/DE/project/projectOverview.pug +++ b/views/DE/project/projectOverview.pug @@ -4,7 +4,7 @@ html(lang="de") title= "Project List" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") + link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .collapse { -- GitLab From 555d339121d2db408febc4c040d2b21d2dbb62e0 Mon Sep 17 00:00:00 2001 From: Wolfgang Knopki Date: Mon, 22 Jun 2020 11:18:04 +0000 Subject: [PATCH 011/163] Update addProjectOverview.pug, adjusted /css/bootstrap.css link --- views/DE/project/addProjectOverview.pug | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/DE/project/addProjectOverview.pug b/views/DE/project/addProjectOverview.pug index f6517d29..6894c88f 100644 --- a/views/DE/project/addProjectOverview.pug +++ b/views/DE/project/addProjectOverview.pug @@ -4,7 +4,7 @@ html(lang="de") title= "Add Project Overview" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") + link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") // jQuery UI - Datepicker link(rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css") -- GitLab From be0d94e84178ae67b048867fa8c3b678ea56f54a Mon Sep 17 00:00:00 2001 From: Wolfgang Knopki Date: Mon, 22 Jun 2020 13:23:25 +0200 Subject: [PATCH 012/163] replaced /css/booststrap/bootstrap.css with /css/bootstrap.css --- views/DE/404.pug | 2 +- views/DE/500.pug | 2 +- views/DE/account/contact.pug | 2 +- views/DE/account/forgotPwd.pug | 2 +- views/DE/account/home.pug | 2 +- views/DE/account/profile.pug | 2 +- views/DE/account/registration.pug | 2 +- views/DE/account/reset.pug | 2 +- views/DE/account/security.pug | 2 +- views/DE/account/services.pug | 2 +- views/DE/account/verification.pug | 2 +- views/DE/project/landingpage.pug | 2 +- views/DE/project/mailinglists.pug | 2 +- views/DE/project/project-simplified.pug | 2 +- views/DE/project/videoconferences.pug | 2 +- views/EN/account/forgotPwd.pug | 2 +- views/EN/account/home.pug | 2 +- views/EN/account/profile.pug | 2 +- views/EN/account/registration.pug | 2 +- views/EN/account/reset.pug | 2 +- views/EN/account/security.pug | 2 +- views/EN/account/services.pug | 2 +- views/EN/project/addProjectOverview.pug | 2 +- views/EN/project/mailinglists.pug | 2 +- views/EN/project/projects.pug | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/views/DE/404.pug b/views/DE/404.pug index c4178253..575cfc99 100644 --- a/views/DE/404.pug +++ b/views/DE/404.pug @@ -4,7 +4,7 @@ html(lang="de") title= "404 - Page not found" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") + link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") style. .container { height: 400px; diff --git a/views/DE/500.pug b/views/DE/500.pug index 70457339..5f19f51a 100644 --- a/views/DE/500.pug +++ b/views/DE/500.pug @@ -4,7 +4,7 @@ html(lang="de") title= "500 - Internal Server Error" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") + link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") style. .container { height: 400px; diff --git a/views/DE/account/contact.pug b/views/DE/account/contact.pug index 25e4dc9c..508ca7af 100644 --- a/views/DE/account/contact.pug +++ b/views/DE/account/contact.pug @@ -4,7 +4,7 @@ html(lang="de") title= "Kontakt" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") + link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") link(rel="stylesheet", type="text/css", href="/fonts/ionicons.min.css") link(rel="stylesheet", type="text/css", href="/css/Contact-Form-Clean.css") diff --git a/views/DE/account/forgotPwd.pug b/views/DE/account/forgotPwd.pug index 46210a02..292572a4 100644 --- a/views/DE/account/forgotPwd.pug +++ b/views/DE/account/forgotPwd.pug @@ -4,7 +4,7 @@ html(lang="de") title= "Forgot Password" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") + link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/custom/login.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. diff --git a/views/DE/account/home.pug b/views/DE/account/home.pug index f20eafc9..1b3729c7 100644 --- a/views/DE/account/home.pug +++ b/views/DE/account/home.pug @@ -4,7 +4,7 @@ html(lang="de") title= "User Account" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") + link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") body div(class="container") diff --git a/views/DE/account/profile.pug b/views/DE/account/profile.pug index e66e4eca..fb114770 100644 --- a/views/DE/account/profile.pug +++ b/views/DE/account/profile.pug @@ -4,7 +4,7 @@ html(lang="de") title= "User Profile" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") + link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") body div(class="container") diff --git a/views/DE/account/registration.pug b/views/DE/account/registration.pug index dc42f50c..2e0a1eee 100644 --- a/views/DE/account/registration.pug +++ b/views/DE/account/registration.pug @@ -4,7 +4,7 @@ html(lang="de") title= "Create New Account" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") + link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .warning { diff --git a/views/DE/account/reset.pug b/views/DE/account/reset.pug index 56aa2d92..ef8693e5 100644 --- a/views/DE/account/reset.pug +++ b/views/DE/account/reset.pug @@ -4,7 +4,7 @@ html(lang="de") title= "Reset Password" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") + link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/custom/login.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. diff --git a/views/DE/account/security.pug b/views/DE/account/security.pug index e768359c..523ee199 100644 --- a/views/DE/account/security.pug +++ b/views/DE/account/security.pug @@ -4,7 +4,7 @@ html(lang="de") title= "User Profile" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") + link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .warning { diff --git a/views/DE/account/services.pug b/views/DE/account/services.pug index cb911250..1a525556 100644 --- a/views/DE/account/services.pug +++ b/views/DE/account/services.pug @@ -4,7 +4,7 @@ html(lang="de") title= "User Profile" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") + link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") body div(class="container") diff --git a/views/DE/account/verification.pug b/views/DE/account/verification.pug index 575e8e74..34250834 100644 --- a/views/DE/account/verification.pug +++ b/views/DE/account/verification.pug @@ -4,7 +4,7 @@ html(lang="de") title= "User Verification" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") + link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") style. .container { height: 400px; diff --git a/views/DE/project/landingpage.pug b/views/DE/project/landingpage.pug index a835ec04..5ff093f2 100644 --- a/views/DE/project/landingpage.pug +++ b/views/DE/project/landingpage.pug @@ -4,7 +4,7 @@ html(lang="de") title= "Project List" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") + link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .collapse { diff --git a/views/DE/project/mailinglists.pug b/views/DE/project/mailinglists.pug index c38c8042..16df2b40 100644 --- a/views/DE/project/mailinglists.pug +++ b/views/DE/project/mailinglists.pug @@ -3,7 +3,7 @@ html(lang="de") title= "Mailinglisten" meta(charset="UTF-8") meta(name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") + link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") link(rel="stylesheet" href="/fonts/ionicons.min.css") link(rel="stylesheet" href="assets/css/Testimonials.css") diff --git a/views/DE/project/project-simplified.pug b/views/DE/project/project-simplified.pug index cb868f9a..fdda3403 100644 --- a/views/DE/project/project-simplified.pug +++ b/views/DE/project/project-simplified.pug @@ -4,7 +4,7 @@ html(lang="de") title= "Project List" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") + link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .help .card-title > a:before { diff --git a/views/DE/project/videoconferences.pug b/views/DE/project/videoconferences.pug index e6ee7b69..91ba82c2 100644 --- a/views/DE/project/videoconferences.pug +++ b/views/DE/project/videoconferences.pug @@ -4,7 +4,7 @@ html(lang="de") title= "Project List" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") + link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .collapse { diff --git a/views/EN/account/forgotPwd.pug b/views/EN/account/forgotPwd.pug index 1cde0888..6b14d985 100644 --- a/views/EN/account/forgotPwd.pug +++ b/views/EN/account/forgotPwd.pug @@ -4,7 +4,7 @@ html(lang="en") title= "Forgot Password" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") + link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/custom/login.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. diff --git a/views/EN/account/home.pug b/views/EN/account/home.pug index d2f3875a..82390276 100644 --- a/views/EN/account/home.pug +++ b/views/EN/account/home.pug @@ -4,7 +4,7 @@ html(lang="en") title= "User Account" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") + link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .collapse { diff --git a/views/EN/account/profile.pug b/views/EN/account/profile.pug index 47c1f7e8..838bca98 100644 --- a/views/EN/account/profile.pug +++ b/views/EN/account/profile.pug @@ -4,7 +4,7 @@ html(lang="en") title= "User Profile" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") + link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .collapse { diff --git a/views/EN/account/registration.pug b/views/EN/account/registration.pug index 88ef5a93..1e549e67 100644 --- a/views/EN/account/registration.pug +++ b/views/EN/account/registration.pug @@ -4,7 +4,7 @@ html(lang="en") title= "Create New Account" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") + link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .collapse { diff --git a/views/EN/account/reset.pug b/views/EN/account/reset.pug index b8939ea2..0b964959 100644 --- a/views/EN/account/reset.pug +++ b/views/EN/account/reset.pug @@ -4,7 +4,7 @@ html(lang="en") title= "Reset Password" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") + link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/custom/login.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. diff --git a/views/EN/account/security.pug b/views/EN/account/security.pug index 2a5c248c..e8d8be5b 100644 --- a/views/EN/account/security.pug +++ b/views/EN/account/security.pug @@ -4,7 +4,7 @@ html(lang="en") title= "User Profile" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") + link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .collapse { diff --git a/views/EN/account/services.pug b/views/EN/account/services.pug index f095144b..7ad5e503 100644 --- a/views/EN/account/services.pug +++ b/views/EN/account/services.pug @@ -4,7 +4,7 @@ html(lang="en") title= "User Profile" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") + link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .collapse { diff --git a/views/EN/project/addProjectOverview.pug b/views/EN/project/addProjectOverview.pug index 7b40b54f..42375dad 100644 --- a/views/EN/project/addProjectOverview.pug +++ b/views/EN/project/addProjectOverview.pug @@ -4,7 +4,7 @@ html(lang="de") title= "Add Project Overview" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") + link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .collapse { diff --git a/views/EN/project/mailinglists.pug b/views/EN/project/mailinglists.pug index f2ddbd8b..43a4a436 100644 --- a/views/EN/project/mailinglists.pug +++ b/views/EN/project/mailinglists.pug @@ -3,7 +3,7 @@ html(lang="en") title= "Mailinglisten" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") + link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .collapse { diff --git a/views/EN/project/projects.pug b/views/EN/project/projects.pug index 56f65c10..720bc8fc 100644 --- a/views/EN/project/projects.pug +++ b/views/EN/project/projects.pug @@ -4,7 +4,7 @@ html(lang="de") title= "Project List" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") + link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .collapse { -- GitLab From 5c9626575f55c8ba11ed7268bac6297a39401b0d Mon Sep 17 00:00:00 2001 From: Wolfgang Knopki Date: Mon, 22 Jun 2020 13:30:42 +0200 Subject: [PATCH 013/163] replaced /css/ calls with relative links instead of calls to transfer --- views/DE/404.pug | 2 +- views/DE/500.pug | 2 +- views/DE/account/contact.pug | 4 ++-- views/DE/account/forgotPwd.pug | 4 ++-- views/DE/account/home.pug | 2 +- views/DE/account/profile.pug | 2 +- views/DE/account/registration.pug | 2 +- views/DE/account/reset.pug | 4 ++-- views/DE/account/security.pug | 2 +- views/DE/account/services.pug | 2 +- views/DE/account/verification.pug | 2 +- views/DE/project/addProjectOverview.pug | 2 +- views/DE/project/landingpage.pug | 2 +- views/DE/project/mailinglists.pug | 2 +- views/DE/project/project-simplified.pug | 2 +- views/DE/project/projectOverview.pug | 2 +- views/DE/project/projects.pug | 2 +- views/DE/project/videoconferences.pug | 2 +- views/EN/account/forgotPwd.pug | 4 ++-- views/EN/account/home.pug | 2 +- views/EN/account/profile.pug | 2 +- views/EN/account/registration.pug | 2 +- views/EN/account/reset.pug | 4 ++-- views/EN/account/security.pug | 2 +- views/EN/account/services.pug | 2 +- views/EN/project/addProjectOverview.pug | 2 +- views/EN/project/mailinglists.pug | 2 +- views/EN/project/projects.pug | 2 +- 28 files changed, 33 insertions(+), 33 deletions(-) diff --git a/views/DE/404.pug b/views/DE/404.pug index 575cfc99..28d105ae 100644 --- a/views/DE/404.pug +++ b/views/DE/404.pug @@ -4,7 +4,7 @@ html(lang="de") title= "404 - Page not found" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") style. .container { height: 400px; diff --git a/views/DE/500.pug b/views/DE/500.pug index 5f19f51a..b18e630c 100644 --- a/views/DE/500.pug +++ b/views/DE/500.pug @@ -4,7 +4,7 @@ html(lang="de") title= "500 - Internal Server Error" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") style. .container { height: 400px; diff --git a/views/DE/account/contact.pug b/views/DE/account/contact.pug index 508ca7af..ddf00d4f 100644 --- a/views/DE/account/contact.pug +++ b/views/DE/account/contact.pug @@ -4,12 +4,12 @@ html(lang="de") title= "Kontakt" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") link(rel="stylesheet", type="text/css", href="/fonts/ionicons.min.css") link(rel="stylesheet", type="text/css", href="/css/Contact-Form-Clean.css") link(rel="stylesheet", type="text/css", href="/css/Testimonials.css") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/custom/login.css") + link(rel="stylesheet", type="text/css", href="/css/custom/login.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .collapse { diff --git a/views/DE/account/forgotPwd.pug b/views/DE/account/forgotPwd.pug index 292572a4..a0e333ba 100644 --- a/views/DE/account/forgotPwd.pug +++ b/views/DE/account/forgotPwd.pug @@ -4,8 +4,8 @@ html(lang="de") title= "Forgot Password" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/custom/login.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/custom/login.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .collapse { diff --git a/views/DE/account/home.pug b/views/DE/account/home.pug index 1b3729c7..0d427232 100644 --- a/views/DE/account/home.pug +++ b/views/DE/account/home.pug @@ -4,7 +4,7 @@ html(lang="de") title= "User Account" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") body div(class="container") diff --git a/views/DE/account/profile.pug b/views/DE/account/profile.pug index fb114770..5ea7640a 100644 --- a/views/DE/account/profile.pug +++ b/views/DE/account/profile.pug @@ -4,7 +4,7 @@ html(lang="de") title= "User Profile" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") body div(class="container") diff --git a/views/DE/account/registration.pug b/views/DE/account/registration.pug index 2e0a1eee..5d169e73 100644 --- a/views/DE/account/registration.pug +++ b/views/DE/account/registration.pug @@ -4,7 +4,7 @@ html(lang="de") title= "Create New Account" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .warning { diff --git a/views/DE/account/reset.pug b/views/DE/account/reset.pug index ef8693e5..ede0800c 100644 --- a/views/DE/account/reset.pug +++ b/views/DE/account/reset.pug @@ -4,8 +4,8 @@ html(lang="de") title= "Reset Password" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/custom/login.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/custom/login.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .collapse { diff --git a/views/DE/account/security.pug b/views/DE/account/security.pug index 523ee199..d060e233 100644 --- a/views/DE/account/security.pug +++ b/views/DE/account/security.pug @@ -4,7 +4,7 @@ html(lang="de") title= "User Profile" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .warning { diff --git a/views/DE/account/services.pug b/views/DE/account/services.pug index 1a525556..bb9dba43 100644 --- a/views/DE/account/services.pug +++ b/views/DE/account/services.pug @@ -4,7 +4,7 @@ html(lang="de") title= "User Profile" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") body div(class="container") diff --git a/views/DE/account/verification.pug b/views/DE/account/verification.pug index 34250834..a5518385 100644 --- a/views/DE/account/verification.pug +++ b/views/DE/account/verification.pug @@ -4,7 +4,7 @@ html(lang="de") title= "User Verification" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") style. .container { height: 400px; diff --git a/views/DE/project/addProjectOverview.pug b/views/DE/project/addProjectOverview.pug index 6894c88f..5752e8b9 100644 --- a/views/DE/project/addProjectOverview.pug +++ b/views/DE/project/addProjectOverview.pug @@ -4,7 +4,7 @@ html(lang="de") title= "Add Project Overview" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") // jQuery UI - Datepicker link(rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css") diff --git a/views/DE/project/landingpage.pug b/views/DE/project/landingpage.pug index 5ff093f2..d00050e9 100644 --- a/views/DE/project/landingpage.pug +++ b/views/DE/project/landingpage.pug @@ -4,7 +4,7 @@ html(lang="de") title= "Project List" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .collapse { diff --git a/views/DE/project/mailinglists.pug b/views/DE/project/mailinglists.pug index 16df2b40..5f24660f 100644 --- a/views/DE/project/mailinglists.pug +++ b/views/DE/project/mailinglists.pug @@ -3,7 +3,7 @@ html(lang="de") title= "Mailinglisten" meta(charset="UTF-8") meta(name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") link(rel="stylesheet" href="/fonts/ionicons.min.css") link(rel="stylesheet" href="assets/css/Testimonials.css") diff --git a/views/DE/project/project-simplified.pug b/views/DE/project/project-simplified.pug index fdda3403..a7f317b7 100644 --- a/views/DE/project/project-simplified.pug +++ b/views/DE/project/project-simplified.pug @@ -4,7 +4,7 @@ html(lang="de") title= "Project List" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .help .card-title > a:before { diff --git a/views/DE/project/projectOverview.pug b/views/DE/project/projectOverview.pug index b7d9c9ee..beacda4a 100644 --- a/views/DE/project/projectOverview.pug +++ b/views/DE/project/projectOverview.pug @@ -4,7 +4,7 @@ html(lang="de") title= "Project List" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .collapse { diff --git a/views/DE/project/projects.pug b/views/DE/project/projects.pug index 09d3a93b..f3693d92 100644 --- a/views/DE/project/projects.pug +++ b/views/DE/project/projects.pug @@ -4,7 +4,7 @@ html(lang="de") title= "Project List" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .collapse { diff --git a/views/DE/project/videoconferences.pug b/views/DE/project/videoconferences.pug index 91ba82c2..20706244 100644 --- a/views/DE/project/videoconferences.pug +++ b/views/DE/project/videoconferences.pug @@ -4,7 +4,7 @@ html(lang="de") title= "Project List" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .collapse { diff --git a/views/EN/account/forgotPwd.pug b/views/EN/account/forgotPwd.pug index 6b14d985..985793b0 100644 --- a/views/EN/account/forgotPwd.pug +++ b/views/EN/account/forgotPwd.pug @@ -4,8 +4,8 @@ html(lang="en") title= "Forgot Password" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/custom/login.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/custom/login.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .collapse { diff --git a/views/EN/account/home.pug b/views/EN/account/home.pug index 82390276..df71fe18 100644 --- a/views/EN/account/home.pug +++ b/views/EN/account/home.pug @@ -4,7 +4,7 @@ html(lang="en") title= "User Account" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .collapse { diff --git a/views/EN/account/profile.pug b/views/EN/account/profile.pug index 838bca98..60788795 100644 --- a/views/EN/account/profile.pug +++ b/views/EN/account/profile.pug @@ -4,7 +4,7 @@ html(lang="en") title= "User Profile" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .collapse { diff --git a/views/EN/account/registration.pug b/views/EN/account/registration.pug index 1e549e67..2e1aba4c 100644 --- a/views/EN/account/registration.pug +++ b/views/EN/account/registration.pug @@ -4,7 +4,7 @@ html(lang="en") title= "Create New Account" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .collapse { diff --git a/views/EN/account/reset.pug b/views/EN/account/reset.pug index 0b964959..606b304f 100644 --- a/views/EN/account/reset.pug +++ b/views/EN/account/reset.pug @@ -4,8 +4,8 @@ html(lang="en") title= "Reset Password" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/custom/login.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/custom/login.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .collapse { diff --git a/views/EN/account/security.pug b/views/EN/account/security.pug index e8d8be5b..c2c997b0 100644 --- a/views/EN/account/security.pug +++ b/views/EN/account/security.pug @@ -4,7 +4,7 @@ html(lang="en") title= "User Profile" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .collapse { diff --git a/views/EN/account/services.pug b/views/EN/account/services.pug index 7ad5e503..c70d729f 100644 --- a/views/EN/account/services.pug +++ b/views/EN/account/services.pug @@ -4,7 +4,7 @@ html(lang="en") title= "User Profile" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .collapse { diff --git a/views/EN/project/addProjectOverview.pug b/views/EN/project/addProjectOverview.pug index 42375dad..d0a4b0eb 100644 --- a/views/EN/project/addProjectOverview.pug +++ b/views/EN/project/addProjectOverview.pug @@ -4,7 +4,7 @@ html(lang="de") title= "Add Project Overview" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .collapse { diff --git a/views/EN/project/mailinglists.pug b/views/EN/project/mailinglists.pug index 43a4a436..fdc0ef23 100644 --- a/views/EN/project/mailinglists.pug +++ b/views/EN/project/mailinglists.pug @@ -3,7 +3,7 @@ html(lang="en") title= "Mailinglisten" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .collapse { diff --git a/views/EN/project/projects.pug b/views/EN/project/projects.pug index 720bc8fc..f1ecc579 100644 --- a/views/EN/project/projects.pug +++ b/views/EN/project/projects.pug @@ -4,7 +4,7 @@ html(lang="de") title= "Project List" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .collapse { -- GitLab From c2c7f24ffc7d51cbcc8cd341fe4a9928d4fe77cc Mon Sep 17 00:00:00 2001 From: Wolfgang Knopki Date: Mon, 22 Jun 2020 11:39:07 +0000 Subject: [PATCH 014/163] Update mailinglists.pug, replaced assets/css/Testimonials.css with /css/Testimonials.css --- views/DE/project/mailinglists.pug | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/DE/project/mailinglists.pug b/views/DE/project/mailinglists.pug index 5f24660f..3f8c8f6e 100644 --- a/views/DE/project/mailinglists.pug +++ b/views/DE/project/mailinglists.pug @@ -6,7 +6,7 @@ html(lang="de") link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") link(rel="stylesheet" href="/fonts/ionicons.min.css") - link(rel="stylesheet" href="assets/css/Testimonials.css") + link(rel="stylesheet" href="/css/Testimonials.css") style. .collapse { display: none; -- GitLab From 742c74f69d6d2cca5bf3394ea1dabadeb2dcad3e Mon Sep 17 00:00:00 2001 From: Rosanny Date: Fri, 26 Jun 2020 11:08:02 +0200 Subject: [PATCH 015/163] MLAB-225: fixing button position --- views/DE/project/mailinglists.pug | 27 +++------------------------ 1 file changed, 3 insertions(+), 24 deletions(-) diff --git a/views/DE/project/mailinglists.pug b/views/DE/project/mailinglists.pug index 3f8c8f6e..a676a7f8 100644 --- a/views/DE/project/mailinglists.pug +++ b/views/DE/project/mailinglists.pug @@ -7,27 +7,6 @@ html(lang="de") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") link(rel="stylesheet" href="/fonts/ionicons.min.css") link(rel="stylesheet" href="/css/Testimonials.css") - style. - .collapse { - display: none; - } - .collapse.in { - display: block; - } - .collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition-timing-function: ease; - -o-transition-timing-function: ease; - transition-timing-function: ease; - -webkit-transition-duration: .35s; - -o-transition-duration: .35s; - transition-duration: .35s; - -webkit-transition-property: height,visibility; - -o-transition-property: height,visibility; - transition-property: height,visibility; - } body div(class="container") div(class="row") @@ -79,9 +58,9 @@ html(lang="de") p() Über das Transferportal können Sie selbst eine Liste zu Ihrem Projekt anlegen, um mit Ihren Partnern in Verbindung zu bleiben. p() Folgen Sie hierzu der Anleitung des DFN. - div(class="col-md-4 col-lg-6" style="background-color: #ffffff;") - a(class="btn btn-primary text-center d-inline-flex d-lg-flex flex-column flex-grow-1 flex-shrink-1 flex-fill justify-content-between align-items-baseline align-content-center align-self-baseline flex-wrap justify-content-md-center align-items-md-end align-items-lg-center justify-content-xl-center mx-auto" role="button" style="background-color: #E0001B; margin-top:10px; margin-top:10px;" href="/downloads/Handout_Mailinglisten_Erstellen.pdf") Erste Schritte (Anleitung als PDF) - a(class="btn btn-primary text-center d-lg-flex justify-content-center align-items-center align-content-center align-self-center align-items-lg-end mx-auto" role="button" style="background-color: #E0001B;" href="https://www.listserv.dfn.de/sympa/help/admin") Gesamtes Tutorial bei DFN (externer Link) + div(class="col-md-4 col-lg-6 justify-content-between flex-wrap" style="background-color: #ffffff;") + a(class="btn btn-primary text-center d-inline-flex d-lg-flex flex-column flex-grow-1 flex-shrink-1 flex-fill justify-content-between align-items-baseline align-content-center align-self-baseline flex-wrap order-3 justify-content-md-center align-items-md-end align-items-lg-center justify-content-xl-center mx-auto" role="button" style="background-color: #E0001B; margin-top:10px; margin-top:10px;" href="/downloads/Handout_Mailinglisten_Erstellen.pdf") Erste Schritte (Anleitung als PDF) + a(class="btn btn-primary text-center d-inline-flex d-lg-flex flex-column flex-grow-1 flex-shrink-1 flex-fill justify-content-between align-items-baseline align-content-center align-self-baseline flex-wrap order-3 justify-content-md-center align-items-md-end align-items-lg-center justify-content-xl-center mx-auto" role="button" style="background-color: #E0001B; margin-top:10px; margin-top:10px;" href="https://www.listserv.dfn.de/sympa/help/admin") Gesamtes Tutorial bei DFN (externer Link) div(id="addListText" style="background-color: #dadada;margin-top: 0px;") div(class="container") -- GitLab From a3aca3db6bae9db94249a075f6aa2a1ec519b287 Mon Sep 17 00:00:00 2001 From: Wolfgang Knopki Date: Mon, 29 Jun 2020 14:48:42 +0200 Subject: [PATCH 016/163] [bugfix] added bootstrap.min.css as well to fix nonworking mobile version --- views/DE/project/projects.pug | 1 + 1 file changed, 1 insertion(+) diff --git a/views/DE/project/projects.pug b/views/DE/project/projects.pug index f3693d92..6611eb81 100644 --- a/views/DE/project/projects.pug +++ b/views/DE/project/projects.pug @@ -4,6 +4,7 @@ html(lang="de") title= "Project List" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. -- GitLab From d3557f93ca58a19cd05557b58085199f007dfb1f Mon Sep 17 00:00:00 2001 From: Wolfgang Knopki Date: Mon, 29 Jun 2020 14:53:31 +0200 Subject: [PATCH 017/163] [bugfix] added bootstrap.min.css to projectOverview --- views/DE/project/projectOverview.pug | 1 + 1 file changed, 1 insertion(+) diff --git a/views/DE/project/projectOverview.pug b/views/DE/project/projectOverview.pug index beacda4a..87f0092e 100644 --- a/views/DE/project/projectOverview.pug +++ b/views/DE/project/projectOverview.pug @@ -4,6 +4,7 @@ html(lang="de") title= "Project List" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. -- GitLab From 1a59bf45bc24968606d46efae8428c651bcdbb43 Mon Sep 17 00:00:00 2001 From: Wolfgang Knopki Date: Mon, 29 Jun 2020 15:05:50 +0200 Subject: [PATCH 018/163] [bugfix] jquery-3.3.1.slim.min.js replaces jquery-3.3.1.min.js --- views/DE/project/projectOverview.pug | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/DE/project/projectOverview.pug b/views/DE/project/projectOverview.pug index 87f0092e..edccc860 100644 --- a/views/DE/project/projectOverview.pug +++ b/views/DE/project/projectOverview.pug @@ -155,7 +155,7 @@ html(lang="de") img(src="./images/M4_LAB_Projekt/Innovative_Hochschule_Initiative_BMBF_GWK_RGB.png" width="100%") //jQuery - script(src="https://code.jquery.com/jquery-3.3.1.min.js") + script(src="https://code.jquery.com/jquery-3.3.1.slim.min.js") script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous") // Bootstrap script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") -- GitLab From ba8d45532badf14f6ee738937aade12d3b472f2d Mon Sep 17 00:00:00 2001 From: Wolfgang Knopki Date: Mon, 29 Jun 2020 15:22:47 +0200 Subject: [PATCH 019/163] [bugfix] removed inline styling --- views/DE/project/projectOverview.pug | 29 ++-------------------------- 1 file changed, 2 insertions(+), 27 deletions(-) diff --git a/views/DE/project/projectOverview.pug b/views/DE/project/projectOverview.pug index edccc860..5d759bd1 100644 --- a/views/DE/project/projectOverview.pug +++ b/views/DE/project/projectOverview.pug @@ -4,34 +4,9 @@ html(lang="de") title= "Project List" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") - style. - .collapse { - display: none; - } - .collapse.in { - display: block; - } - .collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition-timing-function: ease; - -o-transition-timing-function: ease; - transition-timing-function: ease; - -webkit-transition-duration: .35s; - -o-transition-duration: .35s; - transition-duration: .35s; - -webkit-transition-property: height,visibility; - -o-transition-property: height,visibility; - transition-property: height,visibility; - } - .warning { - color: red; - font-size: 11px; - } + body div for project in projectOV @@ -155,7 +130,7 @@ html(lang="de") img(src="./images/M4_LAB_Projekt/Innovative_Hochschule_Initiative_BMBF_GWK_RGB.png" width="100%") //jQuery - script(src="https://code.jquery.com/jquery-3.3.1.slim.min.js") + script(src="https://code.jquery.com/jquery-3.3.1.min.js") script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous") // Bootstrap script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") -- GitLab From ca7cfce1b80f840aed6e79eca9dc34b79235d0fc Mon Sep 17 00:00:00 2001 From: Wolfgang Knopki Date: Mon, 29 Jun 2020 15:31:43 +0200 Subject: [PATCH 020/163] [bugfix] removed any and all inline styling --- views/DE/project/landingpage.pug | 26 +------------------------- views/DE/project/projects.pug | 26 +------------------------- views/DE/project/videoconferences.pug | 25 ------------------------- 3 files changed, 2 insertions(+), 75 deletions(-) diff --git a/views/DE/project/landingpage.pug b/views/DE/project/landingpage.pug index d00050e9..f5263243 100644 --- a/views/DE/project/landingpage.pug +++ b/views/DE/project/landingpage.pug @@ -6,31 +6,7 @@ html(lang="de") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") - style. - .collapse { - display: none; - } - .collapse.in { - display: block; - } - .collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition-timing-function: ease; - -o-transition-timing-function: ease; - transition-timing-function: ease; - -webkit-transition-duration: .35s; - -o-transition-duration: .35s; - transition-duration: .35s; - -webkit-transition-property: height,visibility; - -o-transition-property: height,visibility; - transition-property: height,visibility; - } - .warning { - color: red; - font-size: 11px; - } + body include landingpage.html diff --git a/views/DE/project/projects.pug b/views/DE/project/projects.pug index 6611eb81..95ec98e6 100644 --- a/views/DE/project/projects.pug +++ b/views/DE/project/projects.pug @@ -7,31 +7,7 @@ html(lang="de") link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") - style. - .collapse { - display: none; - } - .collapse.in { - display: block; - } - .collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition-timing-function: ease; - -o-transition-timing-function: ease; - transition-timing-function: ease; - -webkit-transition-duration: .35s; - -o-transition-duration: .35s; - transition-duration: .35s; - -webkit-transition-property: height,visibility; - -o-transition-property: height,visibility; - transition-property: height,visibility; - } - .warning { - color: red; - font-size: 11px; - } + body div(class="container-fluid") if isUserAuthenticated diff --git a/views/DE/project/videoconferences.pug b/views/DE/project/videoconferences.pug index 20706244..6c82511f 100644 --- a/views/DE/project/videoconferences.pug +++ b/views/DE/project/videoconferences.pug @@ -6,31 +6,6 @@ html(lang="de") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") - style. - .collapse { - display: none; - } - .collapse.in { - display: block; - } - .collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition-timing-function: ease; - -o-transition-timing-function: ease; - transition-timing-function: ease; - -webkit-transition-duration: .35s; - -o-transition-duration: .35s; - transition-duration: .35s; - -webkit-transition-property: height,visibility; - -o-transition-property: height,visibility; - transition-property: height,visibility; - } - .warning { - color: red; - font-size: 11px; - } body div(class="flex-container") div(class="main") -- GitLab From 97fdd304ccec7c1368a21c0a90c1eddce043aa2a Mon Sep 17 00:00:00 2001 From: Rosanny Date: Wed, 1 Jul 2020 13:15:42 +0200 Subject: [PATCH 021/163] MLAB-223: delete collapse css --- views/DE/account/contact.pug | 21 --------------------- views/DE/account/forgotPwd.pug | 21 --------------------- views/DE/account/reset.pug | 21 --------------------- 3 files changed, 63 deletions(-) diff --git a/views/DE/account/contact.pug b/views/DE/account/contact.pug index ddf00d4f..68dc8f03 100644 --- a/views/DE/account/contact.pug +++ b/views/DE/account/contact.pug @@ -11,27 +11,6 @@ html(lang="de") link(rel="stylesheet", type="text/css", href="/css/Testimonials.css") link(rel="stylesheet", type="text/css", href="/css/custom/login.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") - style. - .collapse { - display: none; - } - .collapse.in { - display: block; - } - .collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition-timing-function: ease; - -o-transition-timing-function: ease; - transition-timing-function: ease; - -webkit-transition-duration: .35s; - -o-transition-duration: .35s; - transition-duration: .35s; - -webkit-transition-property: height,visibility; - -o-transition-property: height,visibility; - transition-property: height,visibility; - } body div(class="container") div(class="row") diff --git a/views/DE/account/forgotPwd.pug b/views/DE/account/forgotPwd.pug index a0e333ba..8b8669f6 100644 --- a/views/DE/account/forgotPwd.pug +++ b/views/DE/account/forgotPwd.pug @@ -7,27 +7,6 @@ html(lang="de") link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") link(rel="stylesheet", type="text/css", href="/css/custom/login.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") - style. - .collapse { - display: none; - } - .collapse.in { - display: block; - } - .collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition-timing-function: ease; - -o-transition-timing-function: ease; - transition-timing-function: ease; - -webkit-transition-duration: .35s; - -o-transition-duration: .35s; - transition-duration: .35s; - -webkit-transition-property: height,visibility; - -o-transition-property: height,visibility; - transition-property: height,visibility; - } body div(class="container-fluid") div(class="row") diff --git a/views/DE/account/reset.pug b/views/DE/account/reset.pug index ede0800c..bfc3251d 100644 --- a/views/DE/account/reset.pug +++ b/views/DE/account/reset.pug @@ -7,27 +7,6 @@ html(lang="de") link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") link(rel="stylesheet", type="text/css", href="/css/custom/login.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") - style. - .collapse { - display: none; - } - .collapse.in { - display: block; - } - .collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition-timing-function: ease; - -o-transition-timing-function: ease; - transition-timing-function: ease; - -webkit-transition-duration: .35s; - -o-transition-duration: .35s; - transition-duration: .35s; - -webkit-transition-property: height,visibility; - -o-transition-property: height,visibility; - transition-property: height,visibility; - } body div(class="container-fluid") div(class="row") -- GitLab From 86f64bfee5e6a1a339c13afe3a85d2842b45106d Mon Sep 17 00:00:00 2001 From: Rosanny Date: Thu, 2 Jul 2020 10:56:34 +0200 Subject: [PATCH 022/163] MLAB-253: use the original bootstrap CSS --- views/DE/404.pug | 2 +- views/DE/500.pug | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/views/DE/404.pug b/views/DE/404.pug index 28d105ae..5a16f086 100644 --- a/views/DE/404.pug +++ b/views/DE/404.pug @@ -4,7 +4,7 @@ html(lang="de") title= "404 - Page not found" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") style. .container { height: 400px; diff --git a/views/DE/500.pug b/views/DE/500.pug index b18e630c..aea0e76c 100644 --- a/views/DE/500.pug +++ b/views/DE/500.pug @@ -4,7 +4,7 @@ html(lang="de") title= "500 - Internal Server Error" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") style. .container { height: 400px; -- GitLab From a7f46e4e45ff69627369a71639afd2333f30179d Mon Sep 17 00:00:00 2001 From: Rosanny Date: Thu, 2 Jul 2020 11:12:27 +0200 Subject: [PATCH 023/163] MLAB-253: replace bootstrap.css with m4lab.css on Account Pages --- views/DE/account/contact.pug | 2 +- views/DE/account/forgotPwd.pug | 3 ++- views/DE/account/home.pug | 3 ++- views/DE/account/profile.pug | 3 ++- views/DE/account/registration.pug | 3 ++- views/DE/account/reset.pug | 3 ++- views/DE/account/security.pug | 3 ++- views/DE/account/services.pug | 3 ++- views/DE/account/verification.pug | 3 ++- 9 files changed, 17 insertions(+), 9 deletions(-) diff --git a/views/DE/account/contact.pug b/views/DE/account/contact.pug index 68dc8f03..67107cf9 100644 --- a/views/DE/account/contact.pug +++ b/views/DE/account/contact.pug @@ -4,8 +4,8 @@ html(lang="de") title= "Kontakt" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab.css") link(rel="stylesheet", type="text/css", href="/fonts/ionicons.min.css") link(rel="stylesheet", type="text/css", href="/css/Contact-Form-Clean.css") link(rel="stylesheet", type="text/css", href="/css/Testimonials.css") diff --git a/views/DE/account/forgotPwd.pug b/views/DE/account/forgotPwd.pug index 8b8669f6..75390a80 100644 --- a/views/DE/account/forgotPwd.pug +++ b/views/DE/account/forgotPwd.pug @@ -4,7 +4,8 @@ html(lang="de") title= "Forgot Password" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab.css") link(rel="stylesheet", type="text/css", href="/css/custom/login.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") body diff --git a/views/DE/account/home.pug b/views/DE/account/home.pug index 0d427232..54c4ced0 100644 --- a/views/DE/account/home.pug +++ b/views/DE/account/home.pug @@ -4,7 +4,8 @@ html(lang="de") title= "User Account" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") body div(class="container") diff --git a/views/DE/account/profile.pug b/views/DE/account/profile.pug index 5ea7640a..190fc1c7 100644 --- a/views/DE/account/profile.pug +++ b/views/DE/account/profile.pug @@ -4,7 +4,8 @@ html(lang="de") title= "User Profile" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") body div(class="container") diff --git a/views/DE/account/registration.pug b/views/DE/account/registration.pug index 5d169e73..39fc405d 100644 --- a/views/DE/account/registration.pug +++ b/views/DE/account/registration.pug @@ -4,7 +4,8 @@ html(lang="de") title= "Create New Account" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .warning { diff --git a/views/DE/account/reset.pug b/views/DE/account/reset.pug index bfc3251d..a6ef872a 100644 --- a/views/DE/account/reset.pug +++ b/views/DE/account/reset.pug @@ -4,7 +4,8 @@ html(lang="de") title= "Reset Password" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab.css") link(rel="stylesheet", type="text/css", href="/css/custom/login.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") body diff --git a/views/DE/account/security.pug b/views/DE/account/security.pug index d060e233..81da0660 100644 --- a/views/DE/account/security.pug +++ b/views/DE/account/security.pug @@ -4,7 +4,8 @@ html(lang="de") title= "User Profile" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .warning { diff --git a/views/DE/account/services.pug b/views/DE/account/services.pug index bb9dba43..a2015cd9 100644 --- a/views/DE/account/services.pug +++ b/views/DE/account/services.pug @@ -4,7 +4,8 @@ html(lang="de") title= "User Profile" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") body div(class="container") diff --git a/views/DE/account/verification.pug b/views/DE/account/verification.pug index a5518385..10cdea08 100644 --- a/views/DE/account/verification.pug +++ b/views/DE/account/verification.pug @@ -4,7 +4,8 @@ html(lang="de") title= "User Verification" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab.css") style. .container { height: 400px; -- GitLab From d6b0a60d1ecb5f638e7f3be239707ebc9a5a46e4 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Thu, 2 Jul 2020 11:16:32 +0200 Subject: [PATCH 024/163] MLAB-253: replace boostrap.css with m4lab.css on Project Pages --- views/DE/project/addProjectOverview.pug | 3 ++- views/DE/project/landingpage.pug | 3 ++- views/DE/project/mailinglists.pug | 3 ++- views/DE/project/project-simplified.pug | 3 ++- views/DE/project/projectOverview.pug | 3 ++- views/DE/project/projects.pug | 2 +- views/DE/project/videoconferences.pug | 3 ++- 7 files changed, 13 insertions(+), 7 deletions(-) diff --git a/views/DE/project/addProjectOverview.pug b/views/DE/project/addProjectOverview.pug index 5752e8b9..8119c861 100644 --- a/views/DE/project/addProjectOverview.pug +++ b/views/DE/project/addProjectOverview.pug @@ -4,7 +4,8 @@ html(lang="de") title= "Add Project Overview" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") // jQuery UI - Datepicker link(rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css") diff --git a/views/DE/project/landingpage.pug b/views/DE/project/landingpage.pug index f5263243..5aaf31a5 100644 --- a/views/DE/project/landingpage.pug +++ b/views/DE/project/landingpage.pug @@ -4,7 +4,8 @@ html(lang="de") title= "Project List" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") body diff --git a/views/DE/project/mailinglists.pug b/views/DE/project/mailinglists.pug index a676a7f8..bf3c747b 100644 --- a/views/DE/project/mailinglists.pug +++ b/views/DE/project/mailinglists.pug @@ -3,7 +3,8 @@ html(lang="de") title= "Mailinglisten" meta(charset="UTF-8") meta(name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no") - link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") link(rel="stylesheet" href="/fonts/ionicons.min.css") link(rel="stylesheet" href="/css/Testimonials.css") diff --git a/views/DE/project/project-simplified.pug b/views/DE/project/project-simplified.pug index a7f317b7..5219c290 100644 --- a/views/DE/project/project-simplified.pug +++ b/views/DE/project/project-simplified.pug @@ -4,7 +4,8 @@ html(lang="de") title= "Project List" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") style. .help .card-title > a:before { diff --git a/views/DE/project/projectOverview.pug b/views/DE/project/projectOverview.pug index 5d759bd1..512534c2 100644 --- a/views/DE/project/projectOverview.pug +++ b/views/DE/project/projectOverview.pug @@ -4,7 +4,8 @@ html(lang="de") title= "Project List" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") body diff --git a/views/DE/project/projects.pug b/views/DE/project/projects.pug index 95ec98e6..44748f8a 100644 --- a/views/DE/project/projects.pug +++ b/views/DE/project/projects.pug @@ -5,7 +5,7 @@ html(lang="de") meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") - link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") body diff --git a/views/DE/project/videoconferences.pug b/views/DE/project/videoconferences.pug index 6c82511f..de48a2a4 100644 --- a/views/DE/project/videoconferences.pug +++ b/views/DE/project/videoconferences.pug @@ -4,7 +4,8 @@ html(lang="de") title= "Project List" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") body div(class="flex-container") -- GitLab From bd831d5b4a3749bfb2d3f8e2b5ce80e91a6b83b5 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Thu, 2 Jul 2020 13:02:09 +0200 Subject: [PATCH 025/163] MLAB-251: responsive page --- views/DE/project/projectOverview.pug | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/views/DE/project/projectOverview.pug b/views/DE/project/projectOverview.pug index 512534c2..e12d5f42 100644 --- a/views/DE/project/projectOverview.pug +++ b/views/DE/project/projectOverview.pug @@ -11,29 +11,25 @@ html(lang="de") body div for project in projectOV - div(class="flex-container") - div(class="main") + div(class="row") + div(class="col-sm-8 pt-3") h1 #{project.title} div(style="float:right; margin-left:30px; margin-bottom:0px; width:50%;") img(src=project.src, width="100%") p(style="text-align:right") #{project.caption} - h2 Projektüberblick + h2(class="pt-4") Projektüberblick p !{project.overview} br b keywords: span #{project.keywords} - br - h2 Fragestellung + h2(class="pt-4") Fragestellung p !{project.question} - p - h2 Vorgehensweise + h2(class="pt-4") Vorgehensweise p !{project.approach} - br - br - h2 Ergebnis und Nutzung + h2(class="pt-4") Ergebnis und Nutzung p !{project.result} - div(class="side") + div(class="col-sm-4 pt-3" style="background-color: #f1f1f1") for image in projectImgs if image.pos == '2' || image.pos == '3' div(class="projectimg") -- GitLab From d0cd5be6683bacf043acfffc638b268671fe7cf4 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Thu, 2 Jul 2020 13:09:37 +0200 Subject: [PATCH 026/163] MLAB-251: add container --- views/DE/project/projectOverview.pug | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/DE/project/projectOverview.pug b/views/DE/project/projectOverview.pug index e12d5f42..8c9ab406 100644 --- a/views/DE/project/projectOverview.pug +++ b/views/DE/project/projectOverview.pug @@ -9,7 +9,7 @@ html(lang="de") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") body - div + div(class="container") for project in projectOV div(class="row") div(class="col-sm-8 pt-3") -- GitLab From 694f15b286c961d1a4d521fba3742a45bac6ed73 Mon Sep 17 00:00:00 2001 From: Varun Srivastava <92srva1mst@hft-stuttgart.de> Date: Fri, 3 Jul 2020 13:57:22 +0200 Subject: [PATCH 027/163] email signature changes --- config/config.js | 3 +- routes/routes-account.js | 99 ++++++++++++++++++++++++++-------------- 2 files changed, 67 insertions(+), 35 deletions(-) diff --git a/config/config.js b/config/config.js index 201291a1..30cd6a8d 100644 --- a/config/config.js +++ b/config/config.js @@ -44,7 +44,8 @@ module.exports = { saml: { path: process.env.SAML_PATH || '/saml/SSO', entryPoint: process.env.SAML_ENTRY_POINT || 'https://m4lab.hft-stuttgart.de/idp/saml2/idp/SSOService.php', - issuer: 'sp-account-testing.m4lab.hft-stuttgart.de', //testing metadata + issuer: 'sp-account.m4lab.hft-stuttgart.de', //local metadata + //issuer: 'sp-account-testing.m4lab.hft-stuttgart.de', //testing metadata //issuer: 'sp-account-prod.m4lab.hft-stuttgart.de', //production metadata logoutUrl: 'https://m4lab.hft-stuttgart.de/idp/saml2/idp/SingleLogoutService.php' } diff --git a/routes/routes-account.js b/routes/routes-account.js index 40c54b58..f7a83d9e 100644 --- a/routes/routes-account.js +++ b/routes/routes-account.js @@ -22,6 +22,20 @@ module.exports = function (app, config, passport, i18n) { done(null, user); }); + const mailSignature = 'Mit den besten Grüßen,
das Transferportal-Team der HFT Stuttgart

' + + 'Transferportal der Hochschule für Technik Stuttgart
' + + 'Schellingstr. 24 70174 Stuttgart
' + + 'm4lab@hft-stuttgart.de
' + + 'https://transfer.hft-stuttgart.de
' + + 'HFT  ' + + 'Facebook  ' + + 'Instagram  ' + + 'Twitter  ' + + 'Youtube  ' + + '' + + 'Snapchat' + + '
' + var samlStrategy = new SamlStrategy({ // URL that goes from the Identity Provider -> Service Provider callbackUrl: config.passport.saml.path, @@ -86,13 +100,13 @@ module.exports = function (app, config, passport, i18n) { // ======== APP ROUTES - ACCOUNT ==================== var updatePasswordMailSubject = "Ihr Passwort für das Transferportal wurde gespeichert." - var mailSignature = "Mit den besten Grüßen,\ndas Transferportal-Team der HFT Stuttgart\n\n"+ - "Transferportal der Hochschule für Technik Stuttgart\n"+ - "Schellingstr. 24\n"+ - "70174 Stuttgart\n"+ - "m4lab@hft-stuttgart.de\n"+ - "https://transfer.hft-stuttgart.de" - var updatePasswordMailContent = "Lieber Nutzer,\n\n"+"Ihr Passwort wurde erfolgreich geändert.\n\n"+mailSignature + // var mailSignature = "Mit den besten Grüßen,\ndas Transferportal-Team der HFT Stuttgart\n\n"+ + // "Transferportal der Hochschule für Technik Stuttgart\n"+ + // "Schellingstr. 24\n"+ + // "70174 Stuttgart\n"+ + // "m4lab@hft-stuttgart.de\n"+ + // "https://transfer.hft-stuttgart.de" + var updatePasswordMailContent = '
Lieber Nutzer,

Ihr Passwort wurde erfolgreich geändert.

' + mailSignature + '
'; app.get('/', function (req, res) { if (req.isAuthenticated()) { @@ -346,7 +360,7 @@ module.exports = function (app, config, passport, i18n) { mailer.options.to = req.user.email //mailOptions.subject = "Your M4_LAB Password has been updated." mailer.options.subject = updatePasswordMailSubject - mailer.options.text = updatePasswordMailContent + mailer.options.html = updatePasswordMailContent mailer.transport.sendMail(mailer.options, function(err) { if (err) { console.log(err) @@ -402,12 +416,17 @@ module.exports = function (app, config, passport, i18n) { "Otherwise, you can reset your password using this link: http://m4lab.hft-stuttgart.de/account/reset/" + token + "\n" + "This password reset is only valid for 1 hour.\n\n"+ "Thanks,\nM4_LAB Team" */ - var emailContent = "Lieber Nutzer,\n\n"+ - "wir haben Ihre Anfrage zur Erneuerung Ihres Passwortes erhalten. Falls Sie diese Anfrage nicht gesendet haben, ignorieren Sie bitte diese E-Mail.\n\n"+ - "Sie können Ihr Passwort mit dem Klick auf diesen Link ändern: http://m4lab.hft-stuttgart.de/account/reset/" + token + "\n" + // test server - //"Sie können Ihr Passwort mit dem Klick auf diesen Link ändern: http://localhost:9989/reset/" + token + "\n" + // localhost - "Dieser Link ist aus Sicherheitsgründen nur für 1 Stunde gültig.\n\n"+mailSignature - + // var emailContent = "Lieber Nutzer,\n\n"+ + // "wir haben Ihre Anfrage zur Erneuerung Ihres Passwortes erhalten. Falls Sie diese Anfrage nicht gesendet haben, ignorieren Sie bitte diese E-Mail.\n\n"+ + // "Sie können Ihr Passwort mit dem Klick auf diesen Link ändern: http://m4lab.hft-stuttgart.de/account/reset/" + token + "\n" + // test server + // //"Sie können Ihr Passwort mit dem Klick auf diesen Link ändern: http://localhost:9989/reset/" + token + "\n" + // localhost + // "Dieser Link ist aus Sicherheitsgründen nur für 1 Stunde gültig.\n\n"+mailSignature + + var emailContent = '
Lieber Nutzer, Varun

' + + '

wir haben Ihre Anfrage zur Erneuerung Ihres Passwortes erhalten. Falls Sie diese Anfrage nicht gesendet haben, ignorieren Sie bitte diese E-Mail.

' + + 'Sie können Ihr Passwort mit dem Klick auf diesen Link ändern: http://m4lab.hft-stuttgart.de/account/reset/' + token + '
' + // test server + 'Dieser Link ist aus Sicherheitsgründen nur für 1 Stunde gültig.

' + mailSignature + '
'; + var credentialData = { user_id: user.id, resetPasswordToken: token, @@ -420,7 +439,7 @@ module.exports = function (app, config, passport, i18n) { // send email mailer.options.to = emailAddress; mailer.options.subject = emailSubject; - mailer.options.text = emailContent; + mailer.options.html = emailContent; mailer.transport.sendMail(mailer.options, function(err) { done(err, 'done'); }); @@ -483,7 +502,7 @@ module.exports = function (app, config, passport, i18n) { // send notifiaction email mailer.options.to = user.email mailer.options.subject = updatePasswordMailSubject - mailer.options.text = updatePasswordMailContent + mailer.options.html = updatePasswordMailContent mailer.transport.sendMail(mailer.options, function(err) { if (err) { console.log(err) @@ -563,15 +582,20 @@ module.exports = function (app, config, passport, i18n) { else { // send email var emailSubject = "Bitte bestätigen Sie Ihr M4_LAB Benutzerkonto" - var emailContent = "Lieber Nutzer,\n\n"+ - "vielen Dank für Ihre Anmeldung am Transferportal der HFT Stuttgart.\n"+ - "Um Ihre Anmeldung zu bestätigen, klicken Sie bitte diesen Link: "+config.app.host+"/verifyAccount?token="+token+"\n"+ - "Ohne Bestätigung Ihres Kontos müssen wir Ihr Konto leider nach 7 Tagen löschen.\n\n"+ - "Sollten Sie sich selbst nicht mit Ihren Daten am Transferportal registriert haben, ignorieren Sie diese E-Mail bitte.\n\n"+mailSignature - + // var emailContent = "Lieber Nutzer,\n\n"+ + // "vielen Dank für Ihre Anmeldung am Transferportal der HFT Stuttgart.\n"+ + // "Um Ihre Anmeldung zu bestätigen, klicken Sie bitte diesen Link: "+config.app.host+"/verifyAccount?token="+token+"\n"+ + // "Ohne Bestätigung Ihres Kontos müssen wir Ihr Konto leider nach 7 Tagen löschen.\n\n"+ + // "Sollten Sie sich selbst nicht mit Ihren Daten am Transferportal registriert haben, ignorieren Sie diese E-Mail bitte.\n\n"+mailSignature + var emailContent = '
Lieber Nutzer,

' + + '

vielen Dank für Ihre Anmeldung am Transferportal der HFT Stuttgart.
' + + 'Um Ihre Anmeldung zu bestätigen, klicken Sie bitte diesen Link: ' + config.app.host + '/verifyAccount?token=' + token + + '

' + + 'Ohne Bestätigung Ihres Kontos müssen wir Ihr Konto leider nach 7 Tagen löschen.


' + mailSignature + + '
'; mailer.options.to = req.body.inputEmail; mailer.options.subject = emailSubject; - mailer.options.text = emailContent; + mailer.options.html = emailContent; mailer.transport.sendMail(mailer.options, function(err) { if (err) { console.log('cannot send email') @@ -615,13 +639,15 @@ module.exports = function (app, config, passport, i18n) { else { // send email var emailSubject = "Herzlich willkommen" - var emailContent = "Lieber Nutzer,\n\n"+ - "herzlich willkommen beim Transferportal der HFT Stuttgart!\n"+ - "Sie können nun alle Dienste des Portals nutzen.\n\n"+mailSignature - + // var emailContent = "Lieber Nutzer,\n\n"+ + // "herzlich willkommen beim Transferportal der HFT Stuttgart!\n"+ + // "Sie können nun alle Dienste des Portals nutzen.\n\n"+mailSignature + var emailContent = '
Lieber Nutzer,

' + + '

herzlich willkommen beim Transferportal der HFT Stuttgart!
' + + 'Sie können nun alle Dienste des Portals nutzen.


' + mailSignature; mailer.options.to = data.email; mailer.options.subject = emailSubject; - mailer.options.text = emailContent; + mailer.options.html = emailContent; mailer.transport.sendMail(mailer.options, function(err) { if (err) { console.log('cannot send email') @@ -656,14 +682,19 @@ module.exports = function (app, config, passport, i18n) { if (token) { // send email var emailSubject = "Bitte bestätigen Sie Ihr M4_LAB Benutzerkonto" - var emailContent = "Lieber Nutzer,\n\n"+ - "vielen Dank für Ihre Anmeldung am Transferportal der HFT Stuttgart. "+ - "\nUm Ihre Anmeldung zu bestätigen, klicken Sie bitte diesen Link: "+config.app.host+"/verifyAccount?token="+token+ - "\n\nOhne Bestätigung Ihres Kontos müssen wir Ihr Konto leider nach 7 Tagen löschen.\n\n"+mailSignature - + // var emailContent = "Lieber Nutzer,\n\n"+ + // "vielen Dank für Ihre Anmeldung am Transferportal der HFT Stuttgart. "+ + // "\nUm Ihre Anmeldung zu bestätigen, klicken Sie bitte diesen Link: "+config.app.host+"/verifyAccount?token="+token+ + // "\n\nOhne Bestätigung Ihres Kontos müssen wir Ihr Konto leider nach 7 Tagen löschen.\n\n"+mailSignature + var emailContent = '

Lieber Nutzer,

' + + '

vielen Dank für Ihre Anmeldung am Transferportal der HFT Stuttgart.
' + + 'Um Ihre Anmeldung zu bestätigen, klicken Sie bitte diesen Link: ' + config.app.host + '/verifyAccount?token=' + token + + '

' + + 'Ohne Bestätigung Ihres Kontos müssen wir Ihr Konto leider nach 7 Tagen löschen.


' + mailSignature + + '
'; mailer.options.to = emailAddress; mailer.options.subject = emailSubject; - mailer.options.text = emailContent; + mailer.options.html = emailContent; mailer.transport.sendMail(mailer.options, function(err) { if (err) { console.log('cannot send email') -- GitLab From fb9e8971362acfddf995980552a1ec1309d2f7cf Mon Sep 17 00:00:00 2001 From: Varun Srivastava <92srva1mst@hft-stuttgart.de> Date: Fri, 3 Jul 2020 13:59:19 +0200 Subject: [PATCH 028/163] reverting config changes --- config/config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/config.js b/config/config.js index 30cd6a8d..1535c914 100644 --- a/config/config.js +++ b/config/config.js @@ -44,8 +44,8 @@ module.exports = { saml: { path: process.env.SAML_PATH || '/saml/SSO', entryPoint: process.env.SAML_ENTRY_POINT || 'https://m4lab.hft-stuttgart.de/idp/saml2/idp/SSOService.php', - issuer: 'sp-account.m4lab.hft-stuttgart.de', //local metadata - //issuer: 'sp-account-testing.m4lab.hft-stuttgart.de', //testing metadata + //issuer: 'sp-account.m4lab.hft-stuttgart.de', //local metadata + issuer: 'sp-account-testing.m4lab.hft-stuttgart.de', //testing metadata //issuer: 'sp-account-prod.m4lab.hft-stuttgart.de', //production metadata logoutUrl: 'https://m4lab.hft-stuttgart.de/idp/saml2/idp/SingleLogoutService.php' } -- GitLab From b21bf6a15c3ff56f2cd1cab919c0074bcec4f0a1 Mon Sep 17 00:00:00 2001 From: Varun Srivastava <92srva1mst@hft-stuttgart.de> Date: Fri, 3 Jul 2020 14:10:37 +0200 Subject: [PATCH 029/163] updated the links for images in signature --- routes/routes-account.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/routes/routes-account.js b/routes/routes-account.js index f7a83d9e..66f44bfa 100644 --- a/routes/routes-account.js +++ b/routes/routes-account.js @@ -27,14 +27,14 @@ module.exports = function (app, config, passport, i18n) { 'Schellingstr. 24 70174 Stuttgart
' + 'm4lab@hft-stuttgart.de
' + 'https://transfer.hft-stuttgart.de
' + - 'HFT  ' + - 'Facebook  ' + - 'Instagram  ' + - 'Twitter  ' + - 'Youtube  ' + + 'HFT  ' + + 'Facebook  ' + + 'Instagram  ' + + 'Twitter  ' + + 'Youtube  ' + '' + - 'Snapchat' + - '
' + 'Snapchat' + + '
' var samlStrategy = new SamlStrategy({ // URL that goes from the Identity Provider -> Service Provider -- GitLab From 8726c4af11ca3ae0bda8080608da77d45ec08a88 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Fri, 3 Jul 2020 15:41:52 +0200 Subject: [PATCH 030/163] add link to portal URL --- routes/routes-account.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routes/routes-account.js b/routes/routes-account.js index 66f44bfa..f0477561 100644 --- a/routes/routes-account.js +++ b/routes/routes-account.js @@ -26,7 +26,7 @@ module.exports = function (app, config, passport, i18n) { 'Transferportal der Hochschule für Technik Stuttgart
' + 'Schellingstr. 24 70174 Stuttgart
' + 'm4lab@hft-stuttgart.de
' + - 'https://transfer.hft-stuttgart.de
' + + 'https://transfer.hft-stuttgart.de
' + 'HFT  ' + 'Facebook  ' + 'Instagram  ' + -- GitLab From 715c0c5a4f5c7de0654751f2805b0b6875bf4054 Mon Sep 17 00:00:00 2001 From: Wolfgang Knopki Date: Mon, 13 Jul 2020 07:46:35 +0000 Subject: [PATCH 031/163] Update .gitlab-ci.yml --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 273c37c2..80cb7c29 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,4 +1,4 @@ -pages-devel: +pages-testing: stage: deploy script: - npm install -- GitLab From 0031c8a3b1818cb05d7f1644f370d04e632fdf1c Mon Sep 17 00:00:00 2001 From: sanny Date: Wed, 15 Jul 2020 12:13:46 +0200 Subject: [PATCH 032/163] delete unused files --- routes/routes-project.js | 362 ------------------------ views/DE/project/addProjectOverview.pug | 144 ---------- views/DE/project/landingpage.html | 68 ----- views/DE/project/landingpage.pug | 24 -- views/DE/project/mailinglists.pug | 79 ------ views/DE/project/project-simplified.pug | 52 ---- views/DE/project/project.html | 220 -------------- views/DE/project/projectOverview.pug | 135 --------- views/DE/project/projects.pug | 91 ------ views/DE/project/videoconferences.pug | 43 --- views/EN/error.pug | 6 - views/EN/layout.pug | 12 - views/EN/project/addProjectOverview.pug | 115 -------- views/EN/project/mailinglists.pug | 61 ---- views/EN/project/projects.pug | 117 -------- 15 files changed, 1529 deletions(-) delete mode 100644 routes/routes-project.js delete mode 100644 views/DE/project/addProjectOverview.pug delete mode 100644 views/DE/project/landingpage.html delete mode 100644 views/DE/project/landingpage.pug delete mode 100644 views/DE/project/mailinglists.pug delete mode 100644 views/DE/project/project-simplified.pug delete mode 100644 views/DE/project/project.html delete mode 100644 views/DE/project/projectOverview.pug delete mode 100644 views/DE/project/projects.pug delete mode 100644 views/DE/project/videoconferences.pug delete mode 100644 views/EN/error.pug delete mode 100644 views/EN/layout.pug delete mode 100644 views/EN/project/addProjectOverview.pug delete mode 100644 views/EN/project/mailinglists.pug delete mode 100644 views/EN/project/projects.pug diff --git a/routes/routes-project.js b/routes/routes-project.js deleted file mode 100644 index d34bab48..00000000 --- a/routes/routes-project.js +++ /dev/null @@ -1,362 +0,0 @@ -const methods = require('./methods') -const async = require('async') -const helpers = require('./helpers') - -const pictSizeLimit = 1000000 // 1 MB - -module.exports = function (app) { - - // ======== APP ROUTES - PROJECT ==================== - var lang = 'DE' - - app.get('/mailinglists', function (req, res) { - async.waterfall([ - function(done) { - methods.getAllMailinglists(function(mailinglistOverview, err) { - if (!err) { - done(err, mailinglistOverview) - } - }) - }, - // create JSON object of mailinglists for front-end - function(mailinglistOverview, done) { - var allMailingLists = [] // JSON object - for (let i = 0; i < mailinglistOverview.length; i++) { - // add data to JSON object - allMailingLists.push({ - id: mailinglistOverview[i].id, - name: mailinglistOverview[i].name, - src: mailinglistOverview[i].src, - projectstatus: mailinglistOverview[i].projectstatus, - project_title: mailinglistOverview[i].project_title, - keywords: mailinglistOverview[i].keywords - }); - } - - res.render(lang+'/project/mailinglists', { - isUserAuthenticated: req.isAuthenticated(), - user: req.user, - mailinglists: allMailingLists - }); - } - ]) - }); - - app.get('/project_', function (req, res) { - async.waterfall([ - // get all projects from projectdb - function(done) { - methods.getAllProjects(function(projectsOverview, err) { - if (!err) { - done(err, projectsOverview) - } - }) - }, - // create JSON object for front-end - function(projectsOverview, done) { - var activeProjects = [] - var nonActiveProjects = [] - - for (var i = 0; i < projectsOverview.length; i++) { - var project = { - id: projectsOverview[i].id, - logo: projectsOverview[i].logo, - akronym: projectsOverview[i].pname, - title: projectsOverview[i].title, - summary: projectsOverview[i].onelinesummary, - category: projectsOverview[i].category, - cp: projectsOverview[i].contact_email, - gitlab: projectsOverview[i].gitlab - } - if (projectsOverview[i].projectstatus == 0) { - nonActiveProjects.push(project) - } - else if (projectsOverview[i].projectstatus == 1) { - activeProjects.push(project) - } - } - - // render the page - if (req.isAuthenticated()) { - res.render(lang+'/project/projects', { - isUserAuthenticated: true, - nonActive: nonActiveProjects, - active: activeProjects - }); - } - else { - res.render(lang+'/project/projects', { - isUserAuthenticated: false, - nonActive: nonActiveProjects, - active: activeProjects - }); - } - } - ]) - }) - - app.get('/project', function (req, res) { - res.render(lang+'/project/project-simplified', { - isUserAuthenticated: req.isAuthenticated(), - user: req.user - }); - }) - - app.get('/addprojectoverview', function (req, res) { - if (req.isAuthenticated()) { - res.render(lang+'/project/addProjectOverview') - } - else { - res.redirect('/login') - } - }) - - app.post('/addprojectoverview__', function (req, res) { - if (req.isAuthenticated()) { - var wiki = 0 - if (req.body.wiki) - wiki = 1 - - var projectTerm = req.body.termForm + " - " + req.body.termTo - var projectOverviewData = { - pname: req.body.pname, - title: req.body.title, - onelinesummary: req.body.summary, - category: req.body.category, - logo: req.body.logo, - gitlab: req.body.gitlabURL, - wiki: wiki, - overview: req.body.overview, - question: req.body.question, - approach: req.body.approach, - result: req.body.result, - keywords: req.body.keywords, - announcement: req.body.announcement, - term: projectTerm, - further_details: req.body.furtherDetails, - website: req.body.website, - src: req.body.src, - caption: req.body.caption, - contact_lastname: req.body.contactName, - contact_email: req.body.contactEmail, - leader_lastname: req.body.leaderName, - leader_email: req.body.leaderEmail - } - - methods.addProjectOverview(projectOverviewData, function(err){ - if (err) { - //req.flash('error', "Failed") - req.flash('error', "Fehlgeschlagen") - res.redirect('/addProjectOverview'); - } - else { - req.flash('success', 'Your project has been created.') - res.redirect('/project'); - } - }) - } - }) - - app.post('/addprojectoverview', function (req, res) { - if (req.isAuthenticated()) { - var wiki = 0 - if (req.body.wiki) - wiki = 1 - - var projectLogo = req.files.logo - var projectPicture = req.files.src - var projectLogoPath, projectPicturePath - - if (projectLogo) { - // raise error if size limit is exceeded - if (projectLogo.size === pictSizeLimit) { - req.flash('error', 'Projektlogo exceeds 1 MB'); - res.redirect('/addprojectoverview'); - } - else { - // TEST PATH FOR DEVELOPMENT (LOCALHOST) - projectLogoPath = './folder-in-server-to-save-projektlogo/'+req.body.pname+'/'+projectLogo.name - // PATH FOR TEST/LIVE SERVER - // var projectLogoPath = to-be-defined - } - } - if (projectPicture) { - // raise error if size limit is exceeded - if (projectPicture.size === pictSizeLimit) { - req.flash('error', 'Projektbild exceeds 1 MB'); - res.redirect('/addprojectoverview'); - } - else { - // TEST PATH FOR DEVELOPMENT (LOCALHOST) - projectPicturePath = './folder-in-server-to-save-projektbild/'+req.body.pname+'/'+projectPicture.name - // PATH FOR TEST/LIVE SERVER - // var projectPicturePath = to-be-defined - } - - } - - var projectTerm = req.body.termForm + " - " + req.body.termTo - var projectOverviewData = { - pname: req.body.pname, - title: req.body.title, - onelinesummary: req.body.summary, - category: req.body.category, - logo: projectLogoPath, - gitlab: req.body.gitlabURL, - wiki: wiki, - overview: req.body.overview, - question: req.body.question, - approach: req.body.approach, - result: req.body.result, - keywords: req.body.keywords, - announcement: req.body.announcement, - term: projectTerm, - further_details: req.body.furtherDetails, - website: req.body.website, - src: projectPicturePath, - caption: req.body.caption, - contact_lastname: req.body.contactName, - contact_email: req.body.contactEmail, - leader_lastname: req.body.leaderName, - leader_email: req.body.leaderEmail - } - - // save pictures - if (projectLogo) { - projectLogo.mv(projectLogoPath, function(err) { - if (err) { - console.error(err) - res.status(500).render(lang+'/500', { - error: err - }) - } - }); - } - if (projectPicture) { - projectPicture.mv(projectPicturePath, function(err) { - if (err) { - console.error(err) - res.status(500).render(lang+'/500', { - error: err - }) - } - }); - } - - /* RS: Temporary solution while Project DB is still in early phase. - When User DB and Project DB are integrated and quite stabil, this operation should be done in 1 transaction. - */ - var userId // todo: make this global variable? - async.waterfall([ - // get userId by email from userdb - function(done) { - methods.getUserIdByEmail(req.user.email, function(id, err) { - if (!err) { - userId = id - done(err) - } - }) - }, - // add project overview - function(done) { - methods.addProjectOverview(projectOverviewData, function(data, err){ - if (err) { - res.status(500).render(lang+'/500', { - error: err - }) - } - else { - done(err, data.insertId) - } - }) - }, - // assign the created overview to logged-in user - function(projectOverviewId, done) { - var userProjectRoleData = { - project_id: projectOverviewId, - user_id: userId, - role_id: 3 // OVERVIEW_CREATOR - } - methods.addUserProjectRole(userProjectRoleData, function(userProjects, err) { - if (err) { - //req.flash('error', "Failed") - req.flash('error', "Fehlgeschlagen") - res.redirect('/addProjectOverview'); - } - else { - req.flash('success', 'Your project has been created.') - res.redirect('/project'); - } - }) - } - ]) - } - }) - - app.get('/updateprojectoverview', function (req, res) { - // only their own project - }) - - app.post('/updateprojectoverview', function (req, res) { - // only their own project - }) - - app.get('/projectoverview', function(req, res){ - async.waterfall([ - function(done) { - methods.getProjectOverviewById(req.query.projectID, function(projectOverview, err) { - if (!err) { - done(err, projectOverview) - } - }) - }, - function(projectOverview,done){ - methods.getProjectImagesById(req.query.projectID, function(projectImages, err) { - if (!err) { - done(err, projectImages, projectOverview) - } - }) - }, - // render projectOverview page - function(projectImages, projectOverview, done) { - - console.log(projectImages); - partnerWebsites = helpers.stringToArray(projectOverview[0].partner_website); - partnerNames = helpers.stringToArray(projectOverview[0].partner_name); - awardSites = helpers.stringToArray(projectOverview[0].award_website); - awardNames = helpers.stringToArray(projectOverview[0].award_name); - sponsorWebsites = helpers.stringToArray(projectOverview[0].sponsor_website); - sponsorImgs = helpers.stringToArray(projectOverview[0].sponsor_img); - sponsorNames = helpers.stringToArray(projectOverview[0].sponsor_name); - - res.render(lang+'/project/projectOverview', { - isUserAuthenticated: req.isAuthenticated(), - user: req.user, - projectOV: projectOverview, - projectImgs: projectImages, - partnerWS: partnerWebsites, - partnerN: partnerNames, - awardWS: awardSites, - awardN: awardNames, - sponsorWS: sponsorWebsites, - sponsorIMG: sponsorImgs, - sponsorN: sponsorNames - }); - } - ]) - }) - - app.get('/videoconferences', function(req, res){ - res.render(lang+'/project/videoconferences', { - isUserAuthenticated: req.isAuthenticated(), - user: req.user, - }); - }) - - app.get('/landingpage', function(req, res){ - res.render(lang+'/project/landingpage', { - isUserAuthenticated: req.isAuthenticated(), - user: req.user, - }); - }) -}; \ No newline at end of file diff --git a/views/DE/project/addProjectOverview.pug b/views/DE/project/addProjectOverview.pug deleted file mode 100644 index 8119c861..00000000 --- a/views/DE/project/addProjectOverview.pug +++ /dev/null @@ -1,144 +0,0 @@ -doctype html -html(lang="de") - head - title= "Add Project Overview" - meta(charset="UTF-8") - meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") - link(rel="stylesheet", type="text/css", href="/css/m4lab.css") - link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") - // jQuery UI - Datepicker - link(rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css") - style. - .collapse { - display: none; - } - .collapse.in { - display: block; - } - .collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition-timing-function: ease; - -o-transition-timing-function: ease; - transition-timing-function: ease; - -webkit-transition-duration: .35s; - -o-transition-duration: .35s; - transition-duration: .35s; - -webkit-transition-property: height,visibility; - -o-transition-property: height,visibility; - transition-property: height,visibility; - } - .warning { - color: red; - font-size: 11px; - } - body - div(class="container-fluid") - div(class="row") - div(class="col-md-6 offset-md-2") - h4(class="mb-3 font-weight-bold") Neues Projekt - div(class="col-md-6 offset-md-3") - if errors - for error, i in errors - div.alert.alert-danger.alert-dismissible.fade.show #{ error } - a(class="close", href="#", data-dismiss="alert", aria-label="close") × - form(method="POST" encType="multipart/form-data") - div(class='form-row') - div(class='form-group col-md-12') - input#inputPname(name="title" class="form-control" type="text" placeholder="Projekttitel*" required) - div(class="form-group col-md-12") - input#inputTitle(name="pname" class="form-control" type="text" placeholder="Akronym*" required) - div(class="form-group col-md-12") - input#inputSummary(name="summary" class="form-control" type="text" placeholder="Kurzbeschreibung") - div(class='form-group col-md-12') - select#inputCategory(name="category", class="form-control") - option(value="") - Projektkategorie - - option(value="Experten-Gruppe") Experten-Gruppe - option(value="Student-Projekt") Student-Projekt - option(value="Lehr Projekt") Lehr Projekt - option(value="Transfer-projekt") Transfer-projekt - div(class="form-group col-md-12") - div(class='form-group row') - label(for="projectLogo" class="col-sm-3 col-form-label") Projektlogo (max. 1 MB) - div(class="col-md-9") - input#inputLogo(name="logo" class="form-control" type="file") - div(class="form-group col-md-12") - div(class="input-group mb-3") - input#inputGitlabURL(name="gitlabURL" type="text" class="form-control" placeholder="M4_LAB GitLab Project URL, z.B. https://transfer.hft-stuttgart.de/gitlab/username/projectname") - div(class="input-group-prepend") - div(class="input-group-text") - input#inputWiki(name="wiki" type="checkbox") - |   Wiki - - h5(class="mb-3 font-weight-bold") Inhalte - div(class='form-row') - div(class='form-group col-md-12') - textarea#inputOverview(name="overview" class="form-control" type="text" rows="5" placeholder="Projektüberblick") - div(class="form-group col-md-12") - textarea#inputQuestion(name="question" class="form-control" type="text" rows="5" placeholder="Fragestellung") - div(class='form-group col-md-12') - textarea#inputApproach(name="approach" class="form-control" type="text" rows="5" placeholder="Vorgehensweise") - div(class="form-group col-md-12") - textarea#inputResult(name="result" class="form-control" type="text" rows="5" placeholder="Ergebnis und Nutzung") - div(class="form-group col-md-12") - input#inputKeywords(name="keywords" class="form-control" type="text" placeholder="keywords") - h5(class="mb-3 font-weight-bold") Projektinformationen - div(class='form-row') - div(class='form-group col-md-12') - input#inputAnnouncement(name="announcement" class="form-control" type="text" rows="5" placeholder="Ausschreibung") - div(class="form-group col-md-12") - div(class='form-group row') - label(for="projectLogo" class="col-sm-2 col-form-label") Laufzeit - div(class="col-md-5") - input#inputTermFrom(name="termForm" class="form-control" type="text" placeholder="von (dd.mm.yyyy)") - div(class="col-md-5") - input#inputTermTo(name="termTo" class="form-control" type="text" placeholder="bis (dd.mm.yyyy)") - div(class='form-group col-md-12') - textarea#inputFurtherDetails(name="furtherDetails" class="form-control" type="text" rows="5" placeholder="Weitere Informationen (bspw. Links zu Berichten)") - div(class="form-group col-md-12") - input#inputWebsite(name="website" class="form-control" type="text" placeholder="Projekt-Website") - h5(class="mb-3 font-weight-bold") Bilder - div(class='form-row') - div(class="form-group col-md-12") - div(class='form-group row') - label(for="projectPicture" class="col-sm-3 col-form-label") Projektbild (max. 1 MB) - div(class="col-md-9") - input#inputSrc(name="src" class="form-control" type="file") - div(class="form-group col-md-12") - input#inputCaption(name="caption" class="form-control" type="text" placeholder="Bildunterschrift/Bildquelle") - h5(class="mb-3 font-weight-bold") Kontakt - div(class='form-row') - div(class="form-group col-md-2") -

Ansprechperson

- div(class="form-group col-md-5") - input#inputContactName(name="contactName" class="form-control" type="text" placeholder="Anrede, Titel, Vorname, Nachname") - div(class="form-group col-md-5") - input#inputContactEmail(name="contactEmail" class="form-control" type="email" placeholder="E-Mail-Adresse") - div(class="form-group col-md-2") -

Projektleitung

- div(class="form-group col-md-5") - input#inputLeaderName(name="leaderName" class="form-control" type="text" placeholder="Anrede, Titel, Vorname, Nachname") - div(class="form-group col-md-5") - input#inputLeaderEmail(name="leaderEmail" class="form-control" type="email" placeholder="E-Mail-Adresse") - p * Pflichtfeld - input#submitBtn(type="submit", class="btn btn-outline-dark btn-block", value="Projekt Anlegen") - - // jQuery - script(src="https://code.jquery.com/jquery-3.3.1.min.js") - script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous") - // jQuery UI - Datepicker - script(src="https://code.jquery.com/ui/1.12.1/jquery-ui.js") - script(src="/js/jquery-ui/i18n/datepicker-de.js") - //script(src="i18n/datepicker-de.js") - // Bootstrap - script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") - // Header - script(src="/js/headfoot.js") - script. - $( function() { - $.datepicker.setDefaults( $.datepicker.regional["de"] ); - $("#inputTermFrom").datepicker(); - $("#inputTermTo").datepicker(); - }); \ No newline at end of file diff --git a/views/DE/project/landingpage.html b/views/DE/project/landingpage.html deleted file mode 100644 index d9c19d49..00000000 --- a/views/DE/project/landingpage.html +++ /dev/null @@ -1,68 +0,0 @@ - - -
- -
-
-

-

Als innovative Hochschule wollen wir den Wandel in der Gesellschaft zukunftsfähig und verantwortungsvoll mitgestalten.

-
-

Unser Ziel ist die Beantwortung gesellschaftlich relevanter Zukunftsfragen.

- - Diese bearbeiten wir durch Forschungs-, Innovations- und Transferprojekte und entwickeln dabei anwendungsbezogene Lösungen. - Als Impulsgeber ermöglichen wir den Transfer innovativer Ideen, indem wir Kooperationen fördern und Räume für kreativen Austausch schaffen. -
- Dabei verknüpfen wir unsere Expertise mit Partnern innerhalb und außerhalb der Region Stuttgart. Wir informieren und involvieren Interessierte und Beteiligte durch die unterschiedlichsten Events und Formate. -
-

Willst du dabei sein?

- - Dann findest du unter Informationen mehr über unsere Expertise, Projekte, Publikationen und Lösungen. -
- Erfahre mehr über unsere Events und über die Möglichkeiten zur Zusammenarbeit. -

-
-
- - - - -
\ No newline at end of file diff --git a/views/DE/project/landingpage.pug b/views/DE/project/landingpage.pug deleted file mode 100644 index 5aaf31a5..00000000 --- a/views/DE/project/landingpage.pug +++ /dev/null @@ -1,24 +0,0 @@ -doctype html -html(lang="de") - head - title= "Project List" - meta(charset="UTF-8") - meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") - link(rel="stylesheet", type="text/css", href="/css/m4lab.css") - link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") - - body - include landingpage.html - - - // jQuery - script(src="https://code.jquery.com/jquery-3.3.1.min.js") - script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous") - // Bootstrap - script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") - // Header - if isUserAuthenticated - script(src="/js/headfootLogout.js") - else - script(src="/js/headfoot.js") \ No newline at end of file diff --git a/views/DE/project/mailinglists.pug b/views/DE/project/mailinglists.pug deleted file mode 100644 index bf3c747b..00000000 --- a/views/DE/project/mailinglists.pug +++ /dev/null @@ -1,79 +0,0 @@ -html(lang="de") - head - title= "Mailinglisten" - meta(charset="UTF-8") - meta(name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no") - link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") - link(rel="stylesheet", type="text/css", href="/css/m4lab.css") - link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") - link(rel="stylesheet" href="/fonts/ionicons.min.css") - link(rel="stylesheet" href="/css/Testimonials.css") - body - div(class="container") - div(class="row") - div(class="col-md-12" style="margin-bottom: 40px;") - img(class="mx-auto" src="/img/Mailinglisten.jpg" width="100%") - div(class="container") - div(class="row") - div(class="col-md-12" style="margin-bottom: 30px;") - h4(class="text-center") Durch Mailinglisten können Sie interessierten Personen
regelmäßig Informationen zu Ihrem Projekt oder Thema zukommen lassen.
Ebenso können Sie über ein Abonnement in einer Mailingliste Mitglied des Verteilers
werden und so im Austausch bleiben.
- div(class="col-md-12" style="margin-bottom: 30px;") - h2(class="text-center" style="color: #708090;") Aktive Mailinglisten - div(class="table-responsive table-borderless") - table(class="table table-striped table-bordered table-hover") - thead() - tr() - th Name - th Zum Abonnement der Mailingliste - th Zum zugehörigen Projekt - th Keywords - tbody() - for item in mailinglists - if item.projectstatus == '1' - tr - td #{item.name} - td #{item.src} - td #{item.project_title} - td #{item.keywords} - div(id="aboText" style="background-color: #dadada;margin-top: 40px;") - div(class="container") - div(class="row" style="margin-bottom: 0;padding-top: 20px;padding-bottom: 20px;") - div(class="col-lg-12" style="background-color: #ffffff;") - h2(class="text-center" style="color: #708090;margin-top: 15px;") Mailingliste abonnieren - div(class="col-md-4 col-lg-6" style="background-color: #ffffff;") - p() Das Deutsche Forschungsnetz (DFN) bietet Mailinglisten für Wissenschaft und Forschung an. Mailinglisten sind E-Mail-Verteilerlisten, d.h. Personen, die sich für Ihr Forschungsthema interessieren, können sich über das DFN registrieren und erhalten im Anschluss daran regelmäßig die über die Mailinglisten geteilten Informationen. - p() Sie als Verteiler senden die zu versendende Mail folglich nur noch an die festgelegte Mailinglistenadresse und das Programm leitet die Nachricht an alle registrierten Personen weiter. - div(class="col-md-4 col-lg-6 justify-content-between flex-wrap" style="background-color: #ffffff;") - div(class="justify-content-between order-2" style="background-color: rgba(255,255,255,0);") - p(class="text-left d-flex d-md-flex flex-row flex-grow-1 flex-shrink-1 flex-fill justify-content-between align-items-start align-content-start align-self-start flex-wrap order-1 justify-content-md-center align-items-md-start justify-content-lg-start") Oben finden Sie eine Übersicht über die aktiven Mailinglisten. Wenn Sie sich in eine Mailingliste eintragen wollen, dann klicken Sie auf den entsprechend hinterlegten Link. - p() Es öffnet sich daraufhin die Hauptseite der Liste. Nach der Auswahl des Buttons "Abonnieren", können Sie Ihre Mailadresse hinterlegen und sich in die Liste eintragen. - a(class="btn btn-primary text-center d-inline-flex d-lg-flex flex-column flex-grow-1 flex-shrink-1 flex-fill justify-content-between align-items-baseline align-content-center align-self-baseline flex-wrap order-3 justify-content-md-center align-items-md-end align-items-lg-center justify-content-xl-center mx-auto" role="button" style="background-color: #E0001B; margin-top:10px; margin-bottom:10px;" href="/downloads/Handout_Mailinglisten_Abonnieren.pdf") Erste Schritte (Anleitung als PDF) - a(class="btn btn-primary text-center d-inline-flex d-lg-flex flex-column flex-grow-1 flex-shrink-1 flex-fill justify-content-between align-items-baseline align-content-center align-self-baseline flex-wrap mb-auto justify-content-md-center align-items-md-end align-items-lg-center justify-content-xl-center mx-auto" role="button" style="background-color: #E0001B;" href="https://www.listserv.dfn.de/sympa/help") Weitergehende Dokumentation bei DFN (externer Link) - - div(id="newListText" style="background-color: #dadada;margin-top: 0px;") - div(class="container") - div(class="row" style="margin-bottom: 0;padding-top: 20px;padding-bottom: 20px;") - div(class="col-lg-12" style="background-color: #ffffff;") - h2(class="text-center" style="color: #708090;margin-top: 15px;") Neue Mailingliste erstellen - div(class="col-md-4 col-lg-6" style="background-color: #ffffff;") - p() Über das Transferportal können Sie selbst eine Liste zu Ihrem Projekt anlegen, um mit Ihren Partnern in Verbindung zu bleiben. - p() Folgen Sie hierzu der Anleitung des DFN. - - div(class="col-md-4 col-lg-6 justify-content-between flex-wrap" style="background-color: #ffffff;") - a(class="btn btn-primary text-center d-inline-flex d-lg-flex flex-column flex-grow-1 flex-shrink-1 flex-fill justify-content-between align-items-baseline align-content-center align-self-baseline flex-wrap order-3 justify-content-md-center align-items-md-end align-items-lg-center justify-content-xl-center mx-auto" role="button" style="background-color: #E0001B; margin-top:10px; margin-top:10px;" href="/downloads/Handout_Mailinglisten_Erstellen.pdf") Erste Schritte (Anleitung als PDF) - a(class="btn btn-primary text-center d-inline-flex d-lg-flex flex-column flex-grow-1 flex-shrink-1 flex-fill justify-content-between align-items-baseline align-content-center align-self-baseline flex-wrap order-3 justify-content-md-center align-items-md-end align-items-lg-center justify-content-xl-center mx-auto" role="button" style="background-color: #E0001B; margin-top:10px; margin-top:10px;" href="https://www.listserv.dfn.de/sympa/help/admin") Gesamtes Tutorial bei DFN (externer Link) - - div(id="addListText" style="background-color: #dadada;margin-top: 0px;") - div(class="container") - div(class="row" style="margin-bottom: 0;padding-top: 20px;padding-bottom: 20px;") - div(class="col-lg-12" style="background-color: #ffffff;") - h2(class="text-center" style="color: #708090;margin-top: 15px;") Neue Mailingliste eintragen - div(class="col-xl" style="background-color: #ffffff;") - p() Um Ihre beim DFN angelegte Mailingliste hier aufzunehmen, schicken Sie uns bitte eine Email an support-transfer@hft-stuttgart.de - // jQuery - script(src="https://code.jquery.com/jquery-3.3.1.min.js") - script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous") - // Bootstrap - script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") - // Header - script(src="/js/headfoot.js") \ No newline at end of file diff --git a/views/DE/project/project-simplified.pug b/views/DE/project/project-simplified.pug deleted file mode 100644 index 5219c290..00000000 --- a/views/DE/project/project-simplified.pug +++ /dev/null @@ -1,52 +0,0 @@ -doctype html -html(lang="de") - head - title= "Project List" - meta(charset="UTF-8") - meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") - link(rel="stylesheet", type="text/css", href="/css/m4lab.css") - link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") - style. - .help .card-title > a:before { - float: right !important; - content: "-"; - padding-right: 5px; - } - .help .card-title > a.collapsed:before { - float: right !important; - content: "+"; - } - .help h3 > a { - color: #708090; - text-decoration: none; - display: block; - } - .help a { - display: inline; - } - .help .card > .card-header { - color: #fff; - } - .card-title { - margin-bottom: 0.5rem; - margin-top: 0.5rem; - } - #infoicon { - color: #708090; - } - .heading { - color: #708090; - } - body - include project.html - - - // jQuery - - script(src="https://code.jquery.com/jquery-3.3.1.min.js") - script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous") - // Bootstrap - script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") - // Header - script(src="/js/headfoot.js") diff --git a/views/DE/project/project.html b/views/DE/project/project.html deleted file mode 100644 index 73cd0ee5..00000000 --- a/views/DE/project/project.html +++ /dev/null @@ -1,220 +0,0 @@ -
-
-
-
-
-
-
-
-
-
-
-

Diese Seite bietet den Einstieg zu den Inhalten der unterschiedlichen Projekte, - die über das Portal zur Verfügung gestellt werden.

-
-
-
-
-
-
-
-
-
- -
-

Open-Source-/ Open-Data-Projekte

-

Für die Veröffentlichung von Open-Source-Projekten steht Ihnen eine von der HFT - Stuttgart selbstverwaltete Gitlab-Instanz bereit. -

- Eine Übersicht der aktuellen Open-Source-/Open-Data-Projekte erreichen Sie über diesen - Link zu den Gitlab-Projekten.
-

-
-
-
- -
-

Andere Projekte

-

Aktuell unterstützt das Transferportal Projekte, die einer Open-Source bzw. - Open-Data-Lizenz - unterliegen. Die Gründe hierfür liegen in den Lizenzbedingungen unserer Gitlab-Instanz als - Plattform. -

- Künftig möchten wir auch andere Projekttypen unterstützen. Es soll dann beispielsweise möglich sein, - Projektergebnisse zu veröffentlichen ohne die dazugehörigen Quellcodes oder Rohdaten offenzulegen. -

- Wir entwickeln das Portal kontinuierlich weiter und prüfen dabei auch andere Plattformen zur - Nutzung. -

-
-
-
-
- -
-

Falls Sie mehr über die - Weiterentwicklung des Portals - erfahren wollen oder sich mit Anregungen auch aktiv einbringen - wollen, regen wir an, unsere Mailingliste - transferportalhft zu abonnieren. Sie können uns aber auch - jederzeit - direkt unter Kontakt anschreiben. -

-
-
-
- - - - - - -
- -
- -

Hilfestellung zu GitLab

- -
- -
-
- -
-

- Dann klicken Sie auf diesen - Link zu den Gitlab-Projekten - um die Liste aller im Gitlab erfassten Projekte zu sehen. Vor dort können Sie dann auf die einzelnen - Projekte zugreifen. - Ein Anmelden am Portal ist dazu nicht nötig. -

-
-
- -
- -
- -
-

- Sie können mittels Issues dem Projekteigentümer eine Rückmeldung geben bzw. einen Fehler melden. - Darüberhinaus können Sie sich auch aktiv beteiligen. Dazu müssen Sie im Portal als Nutzer - registriert sein. -

-

- Wenn Sie noch kein Benutzerkonto haben, klicken Sie bitte oben auf den Link Benutzerkonto und folgen - Sie dem System durch die Registrierungsprozedur. -

-

- Haben Sie ein Benutzerkonto, befolgen Sie bitte folgende Schritte: -

-
    -
  1. - Folgen Sie dem - Link zu den Gitlab-Projekten, um zum Gitlab zu - gelangen. -
  2. -
  3. - Melden Sie sich bei Gitlab an, indem Sie im Gitlab auf den Link Sign-In klicken. -
  4. -
  5. - Sie werden dann auf eine Anmeldeseite von unserem Portal geführt. Geben Sie dort bitte ihre - Benutzerdaten vom Portal ein. -
  6. -
  7. - Nach erfolgreichem Anmelden werden Sie zum Gitlab zurückgeführt. -
  8. -
  9. - Navigieren Sie dann zum Projekt Ihrer Wahl. -
  10. -
  11. - Abhängig davon wie der Projekteigentümer das Projekt konfiguriert hat, können Sie entweder - direkt loslegen, oder Sie müssen zunächst noch beim Projekteigentümer Zugang zum Projekt - anfragen, indem Sie im Gitlab bei der entsprechende Projektseite auf den Link Request Access - klicken. -
  12. -
-
-
- -
- -
- -
-

- Vorraussetzung dazu ist, dass Sie aktives oder ehemaliges Mitglied der Hochschule für Technik sind, - d.h. eine (noch) gültige HFT-Emailadresse haben, und zudem im Portal als Nutzer registriert sein. -

-

- Wenn Sie noch kein Benutzerkonto haben, klicken Sie bitte oben auf den Link Benutzerkonto und folgen - Sie dem System durch die Registrierungsprozedur. -

-

- Haben Sie ein Benutzerkonto, befolgen Sie bitte folgende Schritte: -

-
    -
  1. - Folgen Sie dem - Link zu den Gitlab-Projekten, um zum Gitlab zu - gelangen. -
  2. -
  3. - Melden Sie sich bei Gitlab an, indem Sie im Gitlab auf den Link Sign-In klicken. -
  4. -
  5. - Sie werden dann auf eine Anmeldeseite von unserem Portal geführt. Geben Sie dort bitte ihre - Benutzerdaten vom Portal ein. -
  6. -
  7. - Nach erfolgreichem Anmelden werden Sie zum Gitlab zurückgeführt. -
  8. -
  9. - Erstellen Sie dann in Gitlab ein neues Projekt durch Klicken auf den grünen New Project-Knopf - und anschließendem Befolgen der Eingabemaske von Gitlab. -
  10. -
-

- Weitere Hilfestellung zum Anlegen von Projekten in Gitlab finden Sie in der Gitlab-Dokumentation. -

-

- Hinweis: Um Inhalte zum Gitlab "pushen" zu können, verwendet die Gitlab-Instanz unseres Portals die - s.g. "SSH Keys". - Weitere Informationen dazu finden Sie in der - Gitlab-Dokumentation zu SSH Keys. -

-
-
-
- -
- -
\ No newline at end of file diff --git a/views/DE/project/projectOverview.pug b/views/DE/project/projectOverview.pug deleted file mode 100644 index 8c9ab406..00000000 --- a/views/DE/project/projectOverview.pug +++ /dev/null @@ -1,135 +0,0 @@ -doctype html -html(lang="de") - head - title= "Project List" - meta(charset="UTF-8") - meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") - link(rel="stylesheet", type="text/css", href="/css/m4lab.css") - link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") - - body - div(class="container") - for project in projectOV - div(class="row") - div(class="col-sm-8 pt-3") - h1 #{project.title} - div(style="float:right; margin-left:30px; margin-bottom:0px; width:50%;") - img(src=project.src, width="100%") - p(style="text-align:right") #{project.caption} - - h2(class="pt-4") Projektüberblick - p !{project.overview} - br - b keywords: - span #{project.keywords} - h2(class="pt-4") Fragestellung - p !{project.question} - h2(class="pt-4") Vorgehensweise - p !{project.approach} - h2(class="pt-4") Ergebnis und Nutzung - p !{project.result} - div(class="col-sm-4 pt-3" style="background-color: #f1f1f1") - for image in projectImgs - if image.pos == '2' || image.pos == '3' - div(class="projectimg") - - if image.caption - span #{image.caption} - - - div(class="fakeimg") - if project.leader_lastname - p - b Projektleitung HfT:   - #{project.leader_lastname} - div(class="fakeimg") - if project.contact_lastname - p - b Ansprechperson:   - #{project.contact_lastname} - div(class="fakeimg") - if project.announcement - p - b Ausschreibung:   - span !{project.announcement} - - div(class="fakeimg") - if project.partner_name - p - b Projektpartner: - br - for website, i in partnerWS - if website - #{partnerN[i]} - br - else - #{partnerN[i]} - br - - div(class="fakeimg") - if project.term - p - b Projektlaufzeit:   - span #{project.term} - - div(class="fakeimg") - if project.award_name - p - b Preise: - br - for awardsite, i in awardWS - if awardsite - #{awardN[i]} - br - else - #{awardN[i]} - br - - div(class="fakeimg") - if project.administrator - p - b Projektträger:   - span #{project.administrator} - - div(class="fakeimg") - if project.sponsor_name - p - b Geldgeber: - br - for website, i in sponsorWS - if website - #{sponsorN[i]} - br - else - #{sponsorN[i]} - br - - div(class="fakeimg") - if project.website || project.further_details - p - b Mehr Informationen:   - if project.website - #{project.website} - br - span !{project.further_details} - - if project.pname == 'M4LAB' - div(class="Downloads" style="height:200px;") - h5 Downloads - - div(class="Projektlogos") - img(src="./images/M4_LAB_Projekt/WRS_Logo.jpg" width="32%") - img(src="./images/M4_LAB_Projekt/IBA2027_Logo.jpg" width="32%") - img(src="./images/M4_LAB_Projekt/GWK_Logo.jpg" width="32%") - br - br - img(src="./images/M4_LAB_Projekt/Innovative_Hochschule_Initiative_BMBF_GWK_RGB.png" width="100%") - - //jQuery - script(src="https://code.jquery.com/jquery-3.3.1.min.js") - script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous") - // Bootstrap - script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") - // Header - script(src="/js/headfoot.js") \ No newline at end of file diff --git a/views/DE/project/projects.pug b/views/DE/project/projects.pug deleted file mode 100644 index 44748f8a..00000000 --- a/views/DE/project/projects.pug +++ /dev/null @@ -1,91 +0,0 @@ -doctype html -html(lang="de") - head - title= "Project List" - meta(charset="UTF-8") - meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") - link(rel="stylesheet", type="text/css", href="/css/m4lab.css") - link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") - - body - div(class="container-fluid") - if isUserAuthenticated - p Auf dieser Seite sehen Sie die Liste der über dieses Portal veröffentlichten Projekte. - a(href="/addprojectoverview" class="btn btn-primary" role="button" aria-pressed="true") Projekt anlegen - else - p Auf dieser Seite sehen Sie die Liste der über dieses Portal veröffentlichten Projekte. - p Möchten Sie ein neues Projekt anlegen, dann klicken Sie bitte auf #[a(href="/addprojectoverview") Anmelden und Projekt anlegen] - if successes - for success in successes - div.alert.alert-success.alert-dismissible #{ success } - a(class="close", href="#", data-dismiss="alert", aria-label="close") × - // Active projects - h3(class="mb-3 font-weight-bold") Aktive Projekte - table(class="table table-striped") - thead - tr - th Logo - th Akronym - th Title - th Kernziel - th Kategorie - th Ansprechpartner - th Projektinhalte - tbody - for item in active - tr - //td #{item.status} - td - img(src=item.logo, width="40", height="40") - td #{item.akronym} - td #{item.title} - td #{item.summary} - td #{item.category} - td #[a(class="nav-link", href="mailto:"+ item.cp) #{item.cp}] - td #[a(class="nav-link", href="https://m4lab.hft-stuttgart.de/projectoverview?projectID="+item.id) Zur Projektübersicht] - if item.gitlab - a(class="nav-link", href="https://transfer.hft-stuttgart.de/gitlab/"+item.gitlab+"/tree/master") Projektdateien - a(class="nav-link", href="https://transfer.hft-stuttgart.de/gitlab/"+item.gitlab+"/wikis/home") Projektwiki - else - a(class="nav-link", href="#") Projektdateien - a(class="nav-link", href="#") Projektwiki - br - // Non-active projects - h3(class="mb-3 font-weight-bold") Abgeschlossene Projekte - table(class="table table-striped") - thead - tr - th Logo - th Akronym - th Title - th Kernziel - th Kategorie - th Ansprechpartner - th Projektinhalte - tbody - for item in nonActive - tr - //td #{item.status} - td - img(src=item.logo, width="40", height="40") - td #{item.akronym} - td #{item.title} - td #{item.summary} - td #{item.category} - td #[a(class="nav-link", href="mailto:"+ item.cp) #{item.cp}] - td #[a(class="nav-link", href="https://m4lab.hft-stuttgart.de/projectoverview?projectID="+item.id) Zur Projektübersicht] - if item.gitlab - a(class="nav-link", href="https://transfer.hft-stuttgart.de/gitlab/"+item.gitlab+"/tree/master") Projektdateien - a(class="nav-link", href="https://transfer.hft-stuttgart.de/gitlab/"+item.gitlab+"/wikis/home") Projektwiki - else - a(class="nav-link", href="#") Projektdateien - a(class="nav-link", href="#") Projektwiki - - // jQuery - script(src="https://code.jquery.com/jquery-3.3.1.min.js") - script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous") - // Bootstrap - script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") - // Header - script(src="/js/headfoot.js") \ No newline at end of file diff --git a/views/DE/project/videoconferences.pug b/views/DE/project/videoconferences.pug deleted file mode 100644 index de48a2a4..00000000 --- a/views/DE/project/videoconferences.pug +++ /dev/null @@ -1,43 +0,0 @@ -doctype html -html(lang="de") - head - title= "Project List" - meta(charset="UTF-8") - meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") - link(rel="stylesheet", type="text/css", href="/css/m4lab.css") - link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") - body - div(class="flex-container") - div(class="main") - h1 Videokonferenzen - - p Wir bieten grundsätzlich zwei Möglichkeiten an, Viodeokonferenzen abzuhalten: - - h2 Jitsi - - p - Jitsi ist ein Opensource Videokonferenz-System, welches es ermöglicht, direkt über den Browser Videokonferenzen abzuhalten. - br - span Da die Hauptlast bei diesem System Clientseitig getragen wird, raten wir zu einer Nutzung auf Desktopsystemen bzw. Laptops. - - p Um eine Videokonferenz starten zu können, muss sich zunächst ein Organisator am Portal anmelden und die Videokonferenz eröffnen. Weitere Teilnehmer können dann ohne Anmeldung einfach über einen Link hinzugefügt werden. - - p Der Zugang zu Jitsi findet sich hier - - h2 GoToMeeting - - p Eine weitere Option, die wir anbieten werden, ist die Organisation von Videokonferenzen via GoToMeeting - - p Mehr Informationen darüber erhalten Sie zu gegebener Zeit an dieser Stelle - - - - - //jQuery - script(src="https://code.jquery.com/jquery-3.3.1.min.js") - script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous") - // Bootstrap - script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") - // Header - script(src="/js/headfoot.js") \ No newline at end of file diff --git a/views/EN/error.pug b/views/EN/error.pug deleted file mode 100644 index bf750c00..00000000 --- a/views/EN/error.pug +++ /dev/null @@ -1,6 +0,0 @@ -html - head - title Error - body - h1 An error occurred! - block content \ No newline at end of file diff --git a/views/EN/layout.pug b/views/EN/layout.pug deleted file mode 100644 index 32d27e01..00000000 --- a/views/EN/layout.pug +++ /dev/null @@ -1,12 +0,0 @@ -doctype html -html - head - title PassportJS SAML example - block links - link(rel='stylesheet', href='bower_components/bootstrap/dist/css/bootstrap.css') - body - div.container - block content - script(src='bower_components/jquery/dist/jquery.min.js') - script(src='bower_components/bootstrap/dist/js/bootstrap.min.js') - block scripts diff --git a/views/EN/project/addProjectOverview.pug b/views/EN/project/addProjectOverview.pug deleted file mode 100644 index d0a4b0eb..00000000 --- a/views/EN/project/addProjectOverview.pug +++ /dev/null @@ -1,115 +0,0 @@ -doctype html -html(lang="de") - head - title= "Add Project Overview" - meta(charset="UTF-8") - meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") - link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") - style. - .collapse { - display: none; - } - .collapse.in { - display: block; - } - .collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition-timing-function: ease; - -o-transition-timing-function: ease; - transition-timing-function: ease; - -webkit-transition-duration: .35s; - -o-transition-duration: .35s; - transition-duration: .35s; - -webkit-transition-property: height,visibility; - -o-transition-property: height,visibility; - transition-property: height,visibility; - } - .warning { - color: red; - font-size: 11px; - } - body - div(class="container-fluid") - div(class="row") - div(class="col-md-6 offset-md-2") - h4(class="mb-3 font-weight-bold") Neues Projekt - div(class="col-md-6 offset-md-3") - if errors - for error, i in errors - div.alert.alert-danger.alert-dismissible.fade.show #{ error } - a(class="close", href="#", data-dismiss="alert", aria-label="close") × - form(method="POST") - div(class='form-row') - div(class='form-group col-md-12') - input#inputPname(name="pname" class="form-control" type="text" placeholder="human-readable short project name*" required) - div(class="form-group col-md-12") - input#inputTitle(name="title" class="form-control" type="text" placeholder="official title of the project*" required) - div(class="form-group col-md-12") - input#inputSummary(name="summary" class="form-control" type="text" placeholder="one line summary of the project") - div(class="form-group col-md-12") - input#inputCategory(name="category" class="form-control" type="text" placeholder="category of the project") - div(class="form-group col-md-12") - input#inputLogo(name="logo" class="form-control" type="text" placeholder="official logo of the project") - div(class="form-group col-md-12") - div(class="input-group mb-3") - input#inputGitlabURL(name="gitlabURL" type="text" class="form-control" placeholder="M4_LAB GitLab Project URL, z.B. https://transfer.hft-stuttgart.de/gitlab/username/projectname") - div(class="input-group-prepend") - div(class="input-group-text") - input#inputWiki(name="wiki" type="checkbox") - |   Wiki - - h5(class="mb-3 font-weight-bold") Content - div(class='form-row') - div(class='form-group col-md-12') - textarea#inputOverview(name="overview" class="form-control" type="text" rows="5" placeholder="overview") - div(class="form-group col-md-12") - textarea#inputQuestion(name="question" class="form-control" type="text" rows="5" placeholder="question") - div(class='form-group col-md-12') - textarea#inputApproach(name="approach" class="form-control" type="text" rows="5" placeholder="approach") - div(class="form-group col-md-12") - textarea#inputResult(name="result" class="form-control" type="text" rows="5" placeholder="result") - div(class="form-group col-md-12") - input#inputKeywords(name="keywords" class="form-control" type="text" placeholder="keywords") - h5(class="mb-3 font-weight-bold") Info - div(class='form-row') - div(class='form-group col-md-12') - textarea#inputAnnouncement(name="announcement" class="form-control" type="text" rows="5" placeholder="Ausschreibung") - div(class="form-group col-md-12") - input#inputTerm(name="term" class="form-control" type="text" placeholder="Laufzeit") - div(class='form-group col-md-12') - textarea#inputFurtherDetails(name="furtherDetails" class="form-control" type="text" rows="5" placeholder="Mehr informationen") - div(class="form-group col-md-12") - input#inputWebsite(name="website" class="form-control" type="text" placeholder="website") - h5(class="mb-3 font-weight-bold") Images - div(class='form-row') - div(class="form-group col-md-12") - input#inputSrc(name="src" class="form-control" type="text" placeholder="link to the image source") - div(class="form-group col-md-12") - input#inputCaption(name="caption" class="form-control" type="text" placeholder="caption of the image") - h5(class="mb-3 font-weight-bold") Contact - div(class='form-row') - div(class="form-group col-md-4") - input#inputContactFirstname(name="contactFirstname" class="form-control" type="text" placeholder="contact firstname") - div(class="form-group col-md-4") - input#inputContactLastname(name="contactLastname" class="form-control" type="text" placeholder="contact lastname") - div(class="form-group col-md-4") - input#inputContactEmail(name="contactEmail" class="form-control" type="email" placeholder="contact email") - div(class="form-group col-md-4") - input#inputLeaderFirstname(name="leaderFirstname" class="form-control" type="text" placeholder="leader firstname") - div(class="form-group col-md-4") - input#inputLeaderLastname(name="leaderLastname" class="form-control" type="text" placeholder="leader lastname") - div(class="form-group col-md-4") - input#inputLeaderEmail(name="leaderEmail" class="form-control" type="email" placeholder="leader email") - p * Pflichtfeld - input#submitBtn(type="submit", class="btn btn-outline-dark btn-block", value="Projekt Anlegen") - - // jQuery - script(src="https://code.jquery.com/jquery-3.3.1.min.js") - script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous") - // Bootstrap - script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") - // Header - script(src="/js/headfootLogout.js") \ No newline at end of file diff --git a/views/EN/project/mailinglists.pug b/views/EN/project/mailinglists.pug deleted file mode 100644 index fdc0ef23..00000000 --- a/views/EN/project/mailinglists.pug +++ /dev/null @@ -1,61 +0,0 @@ -html(lang="en") - head - title= "Mailinglisten" - meta(charset="UTF-8") - meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") - link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") - style. - .collapse { - display: none; - } - .collapse.in { - display: block; - } - .collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition-timing-function: ease; - -o-transition-timing-function: ease; - transition-timing-function: ease; - -webkit-transition-duration: .35s; - -o-transition-duration: .35s; - transition-duration: .35s; - -webkit-transition-property: height,visibility; - -o-transition-property: height,visibility; - transition-property: height,visibility; - } - body -
- div() - h5(align="left") Aktive Mailinglisten - div(class="flex-container" style="align-items:flex-start") - div(class="table") - table(border="0" id="listtable" class="table table-striped") - thead - tr - th Name - th Link - th zugeh. Projekt - tbody - for item in mailinglists - if item.projectstatus == '1' - tr - td #{item.name} - td #{item.src} - td #{item.project_title} -
- div() - h5(align="left") Eintragung in Mailingliste - p() Wenn Sie sich in eine Mailingliste eintragen wollen, folgen Sie folgender Anleitung: - // jQuery - script(src="https://code.jquery.com/jquery-3.3.1.min.js") - script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous") - // Bootstrap - script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") - // Header - if isUserAuthenticated - script(src="/js/headfootLogout.js") - else - script(src="https://transfer.hft-stuttgart.de/js/headfoot.js") \ No newline at end of file diff --git a/views/EN/project/projects.pug b/views/EN/project/projects.pug deleted file mode 100644 index f1ecc579..00000000 --- a/views/EN/project/projects.pug +++ /dev/null @@ -1,117 +0,0 @@ -doctype html -html(lang="de") - head - title= "Project List" - meta(charset="UTF-8") - meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") - link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") - style. - .collapse { - display: none; - } - .collapse.in { - display: block; - } - .collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition-timing-function: ease; - -o-transition-timing-function: ease; - transition-timing-function: ease; - -webkit-transition-duration: .35s; - -o-transition-duration: .35s; - transition-duration: .35s; - -webkit-transition-property: height,visibility; - -o-transition-property: height,visibility; - transition-property: height,visibility; - } - .warning { - color: red; - font-size: 11px; - } - body - div(class="container-fluid") - if isUserAuthenticated - p Auf dieser Seite sehen Sie die Liste der über dieses Portal veröffentlichten Projekte. - a(href="/addprojectoverview" class="btn btn-primary" role="button" aria-pressed="true") Projekt anlegen - else - p Auf dieser Seite sehen Sie die Liste der über dieses Portal veröffentlichten Projekte. - p Möchten Sie ein neues Projekt anlegen, dann klicken Sie bitte auf #[a(href="/addprojectoverview") Anmelden und Projekt anlegen] - if successes - for success in successes - div.alert.alert-success.alert-dismissible #{ success } - a(class="close", href="#", data-dismiss="alert", aria-label="close") × - // Active projects - h3(class="mb-3 font-weight-bold") Aktive Projekte - table(class="table table-striped") - thead - tr - th Logo - th Akronym - th Title - th Kernziel - th Kategorie - th Ansprechpartner - th Projektinhalte - tbody - for item in active - tr - //td #{item.status} - td - img(src=item.logo, width="40", height="40") - td #{item.akronym} - td #{item.title} - td #{item.summary} - td #{item.category} - td #[a(class="nav-link", href="mailto:"+ item.cp) #{item.cp}] - td #[a(class="nav-link", href="https://m4lab.hft-stuttgart.de/projectoverview?projectID="+item.id) Zur Projektübersicht] - if item.gitlab - a(class="nav-link", href=item.gitlab+"/tree/master") Projektdateien - a(class="nav-link", href=item.gitlab+"/wikis/home") Projektwiki - else - a(class="nav-link", href="#") Projektdateien - a(class="nav-link", href="#") Projektwiki - br - // Non-active projects - h3(class="mb-3 font-weight-bold") Abgeschlossene Projekte - table(class="table table-striped") - thead - tr - th Logo - th Akronym - th Title - th Kernziel - th Kategorie - th Ansprechpartner - th Projektinhalte - tbody - for item in nonActive - tr - //td #{item.status} - td - img(src=item.logo, width="40", height="40") - td #{item.akronym} - td #{item.title} - td #{item.summary} - td #{item.category} - td #[a(class="nav-link", href="mailto:"+ item.cp) #{item.cp}] - td #[a(class="nav-link", href="https://m4lab.hft-stuttgart.de/projectoverview?projectID="+item.id) Zur Projektübersicht] - if item.gitlab - a(class="nav-link", href="https://transfer.hft-stuttgart.de/gitlab/"+item.gitlab+"/tree/master") Projektdateien - a(class="nav-link", href="https://transfer.hft-stuttgart.de/gitlab/"+item.gitlab+"/wikis/home") Projektwiki - else - a(class="nav-link", href="#") Projektdateien - a(class="nav-link", href="#") Projektwiki - - // jQuery - script(src="https://code.jquery.com/jquery-3.3.1.min.js") - script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous") - // Bootstrap - script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") - // Header - if isUserAuthenticated - script(src="/js/headfootLogout.js") - else - script(src="https://transfer.hft-stuttgart.de/js/headfoot.js") \ No newline at end of file -- GitLab From b98aacea02537aeea656146b22f54ab853f56e43 Mon Sep 17 00:00:00 2001 From: sanny Date: Wed, 15 Jul 2020 12:15:17 +0200 Subject: [PATCH 033/163] remove lines that has been moved to "Project Page" project --- app.js | 1 - routes/methods.js | 33 --------------------------------- 2 files changed, 34 deletions(-) diff --git a/app.js b/app.js index 3e4b3a6f..f03f1c29 100644 --- a/app.js +++ b/app.js @@ -69,7 +69,6 @@ app.use(function(req, res, next) { }); require('./routes/routes-account')(app, config, passport, i18n); -require('./routes/routes-project')(app, config, passport); require('./routes/api')(app, config, passport); // Handle 404 diff --git a/routes/methods.js b/routes/methods.js index 7b34268a..91b75af3 100644 --- a/routes/methods.js +++ b/routes/methods.js @@ -212,39 +212,6 @@ var methods = { }) callback(err) }) - }, - // ======================= project db ======================= - getAllProjects: function(callback) { - dbconn.project.query('CALL getAllprojects', function (err, rows, fields){ - if (err) throw err; - callback(rows[0], err); - }) - }, - getAllMailinglists: function(callback) { - dbconn.project.query('CALL getAllLists', function (err, rows, fields){ - if (err) throw err; - callback(rows[0], err); - }) - }, - getProjectOverviewById: function(projectId, callback) { - dbconn.project.query('CALL GetProjectInformationByProjectID(' + projectId+ ')', function (err, rows, fields){ - if (err) throw err; - callback(rows[0], err); - }) - }, - getProjectImagesById: function(projectId, callback) { - dbconn.project.query('CALL getImagesByProjectID(' + projectId+ ')', function (err, rows, fields){ - if (err) throw err; - callback(rows[0], err); - }) - }, - addProjectOverview: function(data, callback) { - dbconn.project.query('INSERT INTO project_overview SET ?', data, function (err, results, fields){ - if (err) { - console.error(err); - } - callback(results, err); - }) } }; -- GitLab From 3fb7744f141cbd6b97b62060af9a19ba8d8dc7ca Mon Sep 17 00:00:00 2001 From: sanny Date: Wed, 15 Jul 2020 14:06:12 +0200 Subject: [PATCH 034/163] small update --- package.json | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 2df85495..0abe26eb 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "m4lab-user-account", "version": "0.0.1", - "description": "Example for PassportJS SAML strategy", + "description": "M4_LAB User Account", "author": { "name": "Rosanny Sihombing", "email": "rosanny.sihombing@hft-stuttgart.de", @@ -9,12 +9,11 @@ }, "keywords": [ "m4_lab", - "saml", - "sso" + "account" ], "repository": { "type": "git", - "url": "https://transfer.gitlab.com/tbd.git" + "url": "https://transfer.hft-stuttgart.de/gitlab/m4lab_tv1/user-account.git" }, "scripts": { "start": "nodemon app.js", -- GitLab From 1d915c1d6cd00894040314c36066d0d2774db545 Mon Sep 17 00:00:00 2001 From: sanny Date: Wed, 15 Jul 2020 18:30:52 +0200 Subject: [PATCH 035/163] postponed getting users' project --- routes/routes-account.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/routes/routes-account.js b/routes/routes-account.js index f0477561..5e6292c1 100644 --- a/routes/routes-account.js +++ b/routes/routes-account.js @@ -180,6 +180,10 @@ module.exports = function (app, config, passport, i18n) { methods.getUserByEmail(req.user.email, function(data, err){ if (!err) { if (data.verificationStatus == 1) { + res.render(lang+'/account/services', { + user: data + }); + /* !!! DO NOT DELETE. TEMPORARILY DISABLED FOR FUTURE USE. !!! async.waterfall([ // get userId by email from userdb function(done) { @@ -237,6 +241,7 @@ module.exports = function (app, config, passport, i18n) { }); } ]) + */ } else { res.render(lang+'/account/home', { -- GitLab From ba9ff1871abd1c332c245f4668f0fe05409f39e3 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Fri, 17 Jul 2020 16:28:45 +0200 Subject: [PATCH 036/163] express js best practices --- app.js | 6 +- package-lock.json | 165 +++++++++++++++++++++++++++++++++++++++++++--- package.json | 2 + 3 files changed, 163 insertions(+), 10 deletions(-) diff --git a/app.js b/app.js index f03f1c29..bbf16ae8 100644 --- a/app.js +++ b/app.js @@ -9,6 +9,8 @@ const session = require('express-session'); const errorhandler = require('errorhandler'); const flash = require('express-flash'); const fileUpload = require('express-fileupload'); +const helmet = require('helmet'); +const compression = require('compression'); const i18n = require('i18n'); // internationalization i18n.configure({ @@ -16,7 +18,7 @@ i18n.configure({ directory: './locales' }); -var env = process.env.NODE_ENV || 'testing'; +var env = process.env.NODE_ENV || 'development'; const config = require('./config/config')[env]; var app = express(); @@ -33,6 +35,8 @@ app.use(fileUpload({ } })); +app.use(helmet()); +app.use(compression()); app.use(morgan('combined')); app.use(cookieParser()); app.use(bodyParser.json()); diff --git a/package-lock.json b/package-lock.json index 8def6205..f3d2af9d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -102,9 +102,9 @@ }, "dependencies": { "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" } } }, @@ -158,6 +158,11 @@ "type-is": "~1.6.17" } }, + "bowser": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.9.0.tgz", + "integrity": "sha512-2ld76tuLBNFekRgmJfT2+3j5MIrP6bFict8WAIT3beq+srz1gcKNAdNKMqHqauQt63NmAa88HfP1/Ypa9Er3HA==" + }, "boxen": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", @@ -214,6 +219,11 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" }, + "camelize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", + "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" + }, "capture-stack-trace": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", @@ -293,6 +303,42 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "requires": { + "mime-db": ">= 1.43.0 < 2" + }, + "dependencies": { + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + } + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + } + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -335,6 +381,11 @@ "safe-buffer": "5.1.2" } }, + "content-security-policy-builder": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-security-policy-builder/-/content-security-policy-builder-2.1.0.tgz", + "integrity": "sha512-/MtLWhJVvJNkA9dVLAp6fg9LxD2gfI6R2Fi1hPmfjYXSahJJzcfvoeDOxSyp4NvxMuwWv3WMssE9o31DoULHrQ==" + }, "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", @@ -397,6 +448,11 @@ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" }, + "dasherize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz", + "integrity": "sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg=" + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -453,6 +509,11 @@ "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=" }, + "dont-sniff-mimetype": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.1.0.tgz", + "integrity": "sha512-ZjI4zqTaxveH2/tTlzS1wFp+7ncxNZaIEWYg3lzZRHkKf5zPT/MnEG6WL0BhHMJUabkh8GeU5NL5j+rEUCb7Ug==" + }, "dot-prop": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", @@ -643,6 +704,11 @@ } } }, + "feature-policy": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/feature-policy/-/feature-policy-0.3.0.tgz", + "integrity": "sha512-ZtijOTFN7TzCujt1fnNhfWPFPSHeZkesff9AXZj+UEjYBynWNUIYpC87Ve4wHzyexQsImicLu7WsC2LHq7/xrQ==" + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -753,6 +819,72 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" }, + "helmet": { + "version": "3.23.3", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.23.3.tgz", + "integrity": "sha512-U3MeYdzPJQhtvqAVBPntVgAvNSOJyagwZwyKsFdyRa8TV3pOKVFljalPOCxbw5Wwf2kncGhmP0qHjyazIdNdSA==", + "requires": { + "depd": "2.0.0", + "dont-sniff-mimetype": "1.1.0", + "feature-policy": "0.3.0", + "helmet-crossdomain": "0.4.0", + "helmet-csp": "2.10.0", + "hide-powered-by": "1.1.0", + "hpkp": "2.0.0", + "hsts": "2.2.0", + "nocache": "2.1.0", + "referrer-policy": "1.2.0", + "x-xss-protection": "1.3.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } + } + }, + "helmet-crossdomain": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/helmet-crossdomain/-/helmet-crossdomain-0.4.0.tgz", + "integrity": "sha512-AB4DTykRw3HCOxovD1nPR16hllrVImeFp5VBV9/twj66lJ2nU75DP8FPL0/Jp4jj79JhTfG+pFI2MD02kWJ+fA==" + }, + "helmet-csp": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.10.0.tgz", + "integrity": "sha512-Rz953ZNEFk8sT2XvewXkYN0Ho4GEZdjAZy4stjiEQV3eN7GDxg1QKmYggH7otDyIA7uGA6XnUMVSgeJwbR5X+w==", + "requires": { + "bowser": "2.9.0", + "camelize": "1.0.0", + "content-security-policy-builder": "2.1.0", + "dasherize": "2.0.0" + } + }, + "hide-powered-by": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.1.0.tgz", + "integrity": "sha512-Io1zA2yOA1YJslkr+AJlWSf2yWFkKjvkcL9Ni1XSUqnGLr/qRQe2UI3Cn/J9MsJht7yEVCe0SscY1HgVMujbgg==" + }, + "hpkp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hpkp/-/hpkp-2.0.0.tgz", + "integrity": "sha1-EOFCJk52IVpdMMROxD3mTe5tFnI=" + }, + "hsts": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hsts/-/hsts-2.2.0.tgz", + "integrity": "sha512-ToaTnQ2TbJkochoVcdXYm4HOCliNozlviNsg+X2XQLQvZNI/kCHR9rZxVYpJB3UPcHz80PgxRyWQ7PdU1r+VBQ==", + "requires": { + "depd": "2.0.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } + } + }, "http-errors": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", @@ -988,9 +1120,9 @@ "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg=" + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" }, "longest": { "version": "1.0.1", @@ -1101,9 +1233,9 @@ } }, "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "morgan": { "version": "1.9.1", @@ -1143,6 +1275,11 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=" }, + "nocache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz", + "integrity": "sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q==" + }, "node-forge": { "version": "0.7.6", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz", @@ -1636,6 +1773,11 @@ "picomatch": "^2.0.4" } }, + "referrer-policy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.2.0.tgz", + "integrity": "sha512-LgQJIuS6nAy1Jd88DCQRemyE3mS+ispwlqMk3b0yjZ257fI1v9c+/p6SD5gP5FGyXUIgrNOAfmyioHwZtYv2VA==" + }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", @@ -2044,6 +2186,11 @@ "signal-exit": "^3.0.2" } }, + "x-xss-protection": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.3.0.tgz", + "integrity": "sha512-kpyBI9TlVipZO4diReZMAHWtS0MMa/7Kgx8hwG/EuZLiA6sg4Ah/4TRdASHhRRN3boobzcYgFRUFSgHRge6Qhg==" + }, "xdg-basedir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", diff --git a/package.json b/package.json index 0abe26eb..6a35d13c 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "async": "^3.1.0", "bcryptjs": "^2.4.3", "body-parser": "^1.19.0", + "compression": "^1.7.4", "cookie-parser": "1.4.3", "crypto": "^1.0.1", "errorhandler": "1.4.3", @@ -31,6 +32,7 @@ "express-flash": "0.0.2", "express-session": "^1.17.0", "fs": "0.0.1-security", + "helmet": "^3.23.3", "i18n": "^0.8.5", "morgan": "^1.9.1", "mysql": "^2.17.1", -- GitLab From 7b309b2960a3ce9d57d6082f96bc29eefb1aa456 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Fri, 17 Jul 2020 16:57:52 +0200 Subject: [PATCH 037/163] set env to testing --- app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.js b/app.js index bbf16ae8..daa83468 100644 --- a/app.js +++ b/app.js @@ -18,7 +18,7 @@ i18n.configure({ directory: './locales' }); -var env = process.env.NODE_ENV || 'development'; +var env = process.env.NODE_ENV || 'testing'; const config = require('./config/config')[env]; var app = express(); -- GitLab From 66ee50016a7a877ee3e375858c92fdab3f2cbec7 Mon Sep 17 00:00:00 2001 From: Wolfgang Knopki Date: Wed, 16 Sep 2020 11:52:52 +0000 Subject: [PATCH 038/163] Update .gitlab-ci.yml --- .gitlab-ci.yml | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 80cb7c29..583e6b40 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,6 +1,7 @@ -pages-testing: +deploy-testing: stage: deploy script: + - cat $configfiledev > ./config/config.js - npm install - "pm2 delete --silent account || :" - pm2 start ./app.js --name=account @@ -9,4 +10,16 @@ pages-testing: - testing only: - testing - - test_logoutbutton \ No newline at end of file + +deploy-master: + stage: deploy + script: + - cat $configfileprod > ./config/config.js + - npm install + - "pm2 delete --silent account || :" + - pm2 start ./app.js --name=account + - pm2 save + tags: + - production + only: + - master \ No newline at end of file -- GitLab From f582ea0d6e5108258c7b30a512ae4e2ea0d43472 Mon Sep 17 00:00:00 2001 From: Wolfgang Knopki Date: Wed, 16 Sep 2020 11:56:30 +0000 Subject: [PATCH 039/163] Update config.js, removed credentials --- config/config.js | 46 ++++++++++++++++++++++------------------------ 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/config/config.js b/config/config.js index 1535c914..eaab8764 100644 --- a/config/config.js +++ b/config/config.js @@ -9,28 +9,28 @@ module.exports = { strategy: 'saml', saml: { path: process.env.SAML_PATH || '/saml/SSO', - entryPoint: process.env.SAML_ENTRY_POINT || 'https://m4lab.hft-stuttgart.de/idp/saml2/idp/SSOService.php', - issuer: 'sp-account.m4lab.hft-stuttgart.de', //local metadata - logoutUrl: 'https://m4lab.hft-stuttgart.de/idp/saml2/idp/SingleLogoutService.php' + entryPoint: process.env.SAML_ENTRY_POINT || 'Saml Entry Point', + issuer: 'SAML issuer', //local metadata + logoutUrl: 'SAML logout URL' } }, database: { host: 'localhost', // DB host - user: 'DBManager', // DB username - password: 'Stuttgart2019', // DB password + user: 'usernamedb', // DB username + password: 'passworddb', // DB password port: 3306, // MySQL port dbUser: 'userdb', // User DB host_project: 'localhost', // DB host project db - dbProject: 'projectDB' // Project DB + dbProject: 'projectdb' // Project DB }, mailer: { - host: 'mail.hft-stuttgart.de', // hostname + host: 'mailhost', // hostname secureConnection: false, // TLS requires secureConnection to be false port: 587, // port for secure SMTP - authUser: 'ad\\support-transfer', - authPass: '6laumri2', + authUser: 'mailuser', + authPass: 'mailpass', tlsCiphers: 'SSLv3', - from: 'support-transfer@hft-stuttgart.de', + from: 'mailfrom', } }, testing: { @@ -43,30 +43,28 @@ module.exports = { strategy: 'saml', saml: { path: process.env.SAML_PATH || '/saml/SSO', - entryPoint: process.env.SAML_ENTRY_POINT || 'https://m4lab.hft-stuttgart.de/idp/saml2/idp/SSOService.php', - //issuer: 'sp-account.m4lab.hft-stuttgart.de', //local metadata - issuer: 'sp-account-testing.m4lab.hft-stuttgart.de', //testing metadata - //issuer: 'sp-account-prod.m4lab.hft-stuttgart.de', //production metadata - logoutUrl: 'https://m4lab.hft-stuttgart.de/idp/saml2/idp/SingleLogoutService.php' + entryPoint: process.env.SAML_ENTRY_POINT || 'saml entry point', + issuer: 'SAML issuer', //testing metadata + logoutUrl: 'SAML logout URL' } }, database: { - host: 'transfer.hft-stuttgart.de', // DB host - user: 'DBManager', // DB username - password: 'Stuttgart2019', // DB password + host: 'dbhost', // DB host + user: 'dbuser', // DB username + password: 'dbpass', // DB password port: 3306, // MySQL port dbUser: 'userdb', // User DB - host_project: 'm4lab.hft-stuttgart.de', // DB host project db - dbProject: 'projectDB' // Project DB + host_project: 'dbhost', // DB host project db + dbProject: 'projectdb' // Project DB }, mailer: { - host: 'mail.hft-stuttgart.de', // hostname + host: 'mailhost', // hostname secureConnection: false, // TLS requires secureConnection to be false port: 587, // port for secure SMTP - authUser: 'ad\\support-transfer', - authPass: '6laumri2', + authUser: 'mailuser', + authPass: 'mailpass', tlsCiphers: 'SSLv3', - from: 'support-transfer@hft-stuttgart.de', + from: 'mailfrom', } } } \ No newline at end of file -- GitLab From 53937cc86ccc5f4317ac12614bc310be76bf4dc6 Mon Sep 17 00:00:00 2001 From: Wolfgang Knopki Date: Fri, 18 Sep 2020 16:03:56 +0200 Subject: [PATCH 040/163] [bugfix] certificates moved to variables, cicd config adapted --- .gitlab-ci.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 583e6b40..0d650171 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -2,6 +2,9 @@ deploy-testing: stage: deploy script: - cat $configfiledev > ./config/config.js + - cat $cert > ./routes/cert/cert.pem + - cat $certidp > ./routes/cert/cert_idp.pem + - cat $key > ./routes/cert/key.pem - npm install - "pm2 delete --silent account || :" - pm2 start ./app.js --name=account @@ -15,6 +18,9 @@ deploy-master: stage: deploy script: - cat $configfileprod > ./config/config.js + - cat $cert > ./routes/cert/cert.pem + - cat $certidp > ./routes/cert/cert_idp.pem + - cat $key > ./routes/cert/key.pem - npm install - "pm2 delete --silent account || :" - pm2 start ./app.js --name=account -- GitLab From 0d2d48c03c422670b5fdd87ddbdd70bb26ae6093 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Thu, 29 Oct 2020 17:44:22 +0100 Subject: [PATCH 041/163] gitlab config --- config/config.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config/config.js b/config/config.js index eaab8764..c99b06fa 100644 --- a/config/config.js +++ b/config/config.js @@ -31,6 +31,9 @@ module.exports = { authPass: 'mailpass', tlsCiphers: 'SSLv3', from: 'mailfrom', + }, + gitlab: { + token_readWriteProjects: 'token-goes-here' } }, testing: { @@ -65,6 +68,9 @@ module.exports = { authPass: 'mailpass', tlsCiphers: 'SSLv3', from: 'mailfrom', + }, + gitlab: { + token_readWriteProjects: 'token-goes-here' } } } \ No newline at end of file -- GitLab From d61008fdecd858803a51fbc5b454328f1d6f29e8 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Thu, 29 Oct 2020 18:17:26 +0100 Subject: [PATCH 042/163] update dependency --- package-lock.json | 295 ++++++++++++++++++++++------------------------ package.json | 5 +- 2 files changed, 144 insertions(+), 156 deletions(-) diff --git a/package-lock.json b/package-lock.json index f3d2af9d..6e8994d0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -81,6 +81,11 @@ "resolved": "https://registry.npmjs.org/async/-/async-3.1.0.tgz", "integrity": "sha512-4vx/aaY6j/j3Lw3fbCHNWP0pPaTCew3F6F3hYyl/tHs/ndmV1q7NW9T5yuJ2XAGwdQrP+6Wu20x06U4APo/iQQ==" }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", @@ -303,6 +308,19 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -410,6 +428,11 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + }, "core-js": { "version": "2.6.10", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz", @@ -478,13 +501,10 @@ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw=" }, - "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==", - "requires": { - "object-keys": "^1.0.12" - } + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "depd": { "version": "1.1.2", @@ -515,9 +535,9 @@ "integrity": "sha512-ZjI4zqTaxveH2/tTlzS1wFp+7ncxNZaIEWYg3lzZRHkKf5zPT/MnEG6WL0BhHMJUabkh8GeU5NL5j+rEUCb7Ug==" }, "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha1-HxngwuGqDjJ5fEl5nyg3rGr2nFc=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", "requires": { "is-obj": "^1.0.0" } @@ -532,11 +552,6 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, - "ejs": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", - "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==" - }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -551,33 +566,6 @@ "escape-html": "~1.0.3" } }, - "es-abstract": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.3.tgz", - "integrity": "sha512-WtY7Fx5LiOnSYgF5eg/1T+GONaGmpvpPdCpSnYij+U2gDTL0UPfWrhDw7b2IYb+9NQJsYpCA0wOQvZfsd6YwRw==", - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "string.prototype.trimleft": "^2.1.0", - "string.prototype.trimright": "^2.1.0" - } - }, - "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==", - "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", @@ -704,6 +692,11 @@ } } }, + "fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" + }, "feature-policy": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/feature-policy/-/feature-policy-0.3.0.tgz", @@ -731,6 +724,21 @@ "unpipe": "~1.0.0" } }, + "form-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", + "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "formidable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", + "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==" + }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -814,11 +822,6 @@ "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==" - }, "helmet": { "version": "3.23.3", "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.23.3.tgz", @@ -940,6 +943,11 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", @@ -963,11 +971,6 @@ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=" }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" - }, "is-ci": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", @@ -976,11 +979,6 @@ "ci-info": "^1.5.0" } }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" - }, "is-expression": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz", @@ -1075,14 +1073,6 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, - "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==", - "requires": { - "has-symbols": "^1.0.1" - } - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -1119,11 +1109,6 @@ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - }, "longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", @@ -1281,9 +1266,9 @@ "integrity": "sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q==" }, "node-forge": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz", - "integrity": "sha1-/fO0GK7h+U8O9kLNY0hsd8qXJKw=" + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" }, "nodemailer": { "version": "6.3.1", @@ -1343,25 +1328,6 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, - "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" - } - }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -1406,15 +1372,15 @@ } }, "passport-saml": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/passport-saml/-/passport-saml-1.2.0.tgz", - "integrity": "sha512-CU1JOx9FTITF8+vl/G1g7FV6kHWXYzECV3pq3D8K3RIM1MS0efbfQ2hkgDFdoZGdG9DdMH5z8OBW/O8qoXnkLQ==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/passport-saml/-/passport-saml-1.4.2.tgz", + "integrity": "sha512-RJXtuiv4KWazi4zmZGVqN5pf3bV2aFbOygYzUCDEBDdeOD0yHFL4ymPOpLPXg35HvilFYTzB94JRWqwLdI2ecw==", "requires": { "debug": "^3.1.0", "passport-strategy": "*", "q": "^1.5.0", - "xml-crypto": "^1.1.4", - "xml-encryption": "^0.11.0", + "xml-crypto": "^2.0.0", + "xml-encryption": "1.2.1", "xml2js": "0.4.x", "xmlbuilder": "^11.0.0", "xmldom": "0.1.x" @@ -1423,7 +1389,7 @@ "debug": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "requires": { "ms": "^2.1.1" } @@ -1834,7 +1800,7 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=" + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "semver": { "version": "5.7.1", @@ -1939,24 +1905,6 @@ "strip-ansi": "^4.0.0" } }, - "string.prototype.trimleft": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", - "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string.prototype.trimright": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", - "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -1983,6 +1931,59 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, + "superagent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", + "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", + "requires": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.7", + "form-data": "^3.0.0", + "formidable": "^1.2.2", + "methods": "^1.1.2", + "mime": "^2.4.6", + "qs": "^6.9.4", + "readable-stream": "^3.6.0", + "semver": "^7.3.2" + }, + "dependencies": { + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "requires": { + "ms": "2.1.2" + } + }, + "mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" + }, + "qs": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", + "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + } + } + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -2131,15 +2132,6 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -2197,60 +2189,55 @@ "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" }, "xml-crypto": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/xml-crypto/-/xml-crypto-1.4.0.tgz", - "integrity": "sha1-3hzsjNMcvWic2Q09boon1K6Afec=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xml-crypto/-/xml-crypto-2.0.0.tgz", + "integrity": "sha512-/a04qr7RpONRZHOxROZ6iIHItdsQQjN3sj8lJkYDDss8tAkEaAs0VrFjb3tlhmS5snQru5lTs9/5ISSMdPDHlg==", "requires": { "xmldom": "0.1.27", "xpath": "0.0.27" + }, + "dependencies": { + "xmldom": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", + "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=" + } } }, "xml-encryption": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/xml-encryption/-/xml-encryption-0.11.2.tgz", - "integrity": "sha512-jVvES7i5ovdO7N+NjgncA326xYKjhqeAnnvIgRnY7ROLCfFqEDLwP0Sxp/30SHG0AXQV1048T5yinOFyvwGFzg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/xml-encryption/-/xml-encryption-1.2.1.tgz", + "integrity": "sha512-hn5w3l5p2+nGjlmM0CAhMChDzVGhW+M37jH35Z+GJIipXbn9PUlAIRZ6I5Wm7ynlqZjFrMAr83d/CIp9VZJMTA==", "requires": { - "async": "^2.1.5", - "ejs": "^2.5.6", - "node-forge": "^0.7.0", + "escape-html": "^1.0.3", + "node-forge": "^0.10.0", "xmldom": "~0.1.15", "xpath": "0.0.27" - }, - "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "requires": { - "lodash": "^4.17.14" - } - } } }, "xml2js": { - "version": "0.4.22", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.22.tgz", - "integrity": "sha512-MWTbxAQqclRSTnehWWe5nMKzI3VmJ8ltiJEco8akcC6j3miOhjjfzKum5sId+CWhfxdOs/1xauYr8/ZDBtQiRw==", + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", "requires": { "sax": ">=0.6.0", - "util.promisify": "~1.0.0", "xmlbuilder": "~11.0.0" } }, "xmlbuilder": { "version": "11.0.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha1-vpuuHIoEbnazESdyY0fQrXACvrM=" + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" }, "xmldom": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", - "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=" + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", + "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==" }, "xpath": { "version": "0.0.27", "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.27.tgz", - "integrity": "sha1-3TQh+9zFZGrDLEhTG01+nQws+pI=" + "integrity": "sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ==" }, "yallist": { "version": "2.1.2", diff --git a/package.json b/package.json index 6a35d13c..d6e8119e 100644 --- a/package.json +++ b/package.json @@ -39,8 +39,9 @@ "nodemailer": "^6.3.1", "nodemon": "^2.0.1", "passport": "0.3.2", - "passport-saml": "^1.2.0", - "pug": "^2.0.4" + "passport-saml": "^1.4.2", + "pug": "^2.0.4", + "superagent": "^6.1.0" }, "devDependencies": {}, "engines": { -- GitLab From 9b8cdb72e6cb4e8291954c2737be08e9f34d0c1a Mon Sep 17 00:00:00 2001 From: Rosanny Date: Thu, 29 Oct 2020 18:46:07 +0100 Subject: [PATCH 043/163] gitlab activation: the skeleton --- routes/methods.js | 21 ++++++++++++++++++++- routes/routes-account.js | 29 +++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/routes/methods.js b/routes/methods.js index 91b75af3..85745482 100644 --- a/routes/methods.js +++ b/routes/methods.js @@ -69,7 +69,7 @@ var methods = { }) }, getUserByEmail: function(email, callback) { - dbconn.user.query('SELECT verificationStatus, salutation, title, firstname, lastname, industry, organisation, speciality, m4lab_idp FROM user WHERE email = "' +email+'"', function (err, rows, fields) { + dbconn.user.query('SELECT id, verificationStatus, salutation, title, firstname, lastname, industry, organisation, speciality, m4lab_idp FROM user WHERE email = "' +email+'"', function (err, rows, fields) { if (err) { throw err; } @@ -212,6 +212,25 @@ var methods = { }) callback(err) }) + }, + /* ===== GitLab ===== */ + getGitlabId: function(userId, callback){ + let gitlabUserId + dbconn.user.query('SELECT gu.gitlab_userId FROM user_gitlab gu, user u WHERE u.id = "' +userId+'" and gu.user_id = u.id', function (err, rows) { + if (err) { + throw err + } + else if(rows[0]) { + gitlabUserId = rows[0].gitlab_userId + } + callback(gitlabUserId, err) + }) + }, + addGitlabUser: function(data, callback){ + dbconn.user.query('INSERT INTO user_gitlab SET ?', data, function (err) { + if (err) throw err + callback(err) + }) } }; diff --git a/routes/routes-account.js b/routes/routes-account.js index 5e6292c1..1f20a780 100644 --- a/routes/routes-account.js +++ b/routes/routes-account.js @@ -10,6 +10,7 @@ const salt = 64; // salt length const async = require('async') const crypto = require('crypto') const mailer = require('./mailer') +const superagent = require('superagent') module.exports = function (app, config, passport, i18n) { @@ -180,6 +181,34 @@ module.exports = function (app, config, passport, i18n) { methods.getUserByEmail(req.user.email, function(data, err){ if (!err) { if (data.verificationStatus == 1) { + // start =============== RS: MLAB-183 + let userId = data.id + methods.getGitlabId(userId, function(data, err){ + if (!err) { + if (data) { + console.log("TODO: GitLab is already activated for this user. Allow project creation.") + } + else { + superagent.get('https://transfer.hft-stuttgart.de/gitlab/api/v4/users?private_token='+config.gitlab.token_readWriteProjects+'&search='+req.user.email) + .then(res => { + if (res.body.length > 0) { + let gitlabActivationData = { + user_id: userId, + gitlab_userId: res.body[0].id + } + methods.addGitlabUser(gitlabActivationData, function(err){}) + } + else { + console.log('TODO: Show gitlab activation button: transfer.hft-stuttgart.de/gitlab') + } + }) + .catch(err => { + console.log(err.message) + }); + } + } + }) + // end =============== RS: MLAB-183 res.render(lang+'/account/services', { user: data }); -- GitLab From fa3e27cc99f2ebcdc05b48c0c3e4f14b9588390c Mon Sep 17 00:00:00 2001 From: Wolfgang Knopki Date: Mon, 9 Nov 2020 14:12:59 +0100 Subject: [PATCH 044/163] patched fixed js paths with references relative to / --- views/DE/account/home.pug | 2 +- views/DE/account/profile.pug | 2 +- views/DE/account/registration.pug | 2 +- views/DE/account/security.pug | 2 +- views/DE/account/services.pug | 2 +- views/EN/account/forgotPwd.pug | 2 +- views/EN/account/registration.pug | 2 +- views/EN/account/reset.pug | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/views/DE/account/home.pug b/views/DE/account/home.pug index 54c4ced0..95898ac4 100644 --- a/views/DE/account/home.pug +++ b/views/DE/account/home.pug @@ -54,7 +54,7 @@ html(lang="de") // Bootstrap script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") // M4_LAB - script(src="https://m4lab.hft-stuttgart.de/js/headfoot.js") + script(src="/js/headfoot.js") script. // call verifyAccount function verify() { diff --git a/views/DE/account/profile.pug b/views/DE/account/profile.pug index 190fc1c7..d21fd923 100644 --- a/views/DE/account/profile.pug +++ b/views/DE/account/profile.pug @@ -101,4 +101,4 @@ html(lang="de") // Bootstrap script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") // M4_LAB - script(src="https://m4lab.hft-stuttgart.de/js/headfoot.js") \ No newline at end of file + script(src="/js/headfoot.js") \ No newline at end of file diff --git a/views/DE/account/registration.pug b/views/DE/account/registration.pug index 39fc405d..401af467 100644 --- a/views/DE/account/registration.pug +++ b/views/DE/account/registration.pug @@ -78,4 +78,4 @@ html(lang="de") // M4_LAB script(src="/js/generalFunction.js") script(src="/js/registration.js") - script(src="https://m4lab.hft-stuttgart.de/js/headfoot.js") \ No newline at end of file + script(src="/js/headfoot.js") \ No newline at end of file diff --git a/views/DE/account/security.pug b/views/DE/account/security.pug index 81da0660..712a5661 100644 --- a/views/DE/account/security.pug +++ b/views/DE/account/security.pug @@ -74,7 +74,7 @@ html(lang="de") // M4_LAB script(src="/js/security.js") script(src="/js/generalFunction.js") - script(src="https://m4lab.hft-stuttgart.de/js/headfoot.js") + script(src="/js/headfoot.js") script. // check input fields 'use strict'; diff --git a/views/DE/account/services.pug b/views/DE/account/services.pug index a2015cd9..8ef010bd 100644 --- a/views/DE/account/services.pug +++ b/views/DE/account/services.pug @@ -43,4 +43,4 @@ html(lang="de") // Bootstrap script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") // M4_LAB - script(src="https://m4lab.hft-stuttgart.de/js/headfoot.js") \ No newline at end of file + script(src="/js/headfoot.js") \ No newline at end of file diff --git a/views/EN/account/forgotPwd.pug b/views/EN/account/forgotPwd.pug index 985793b0..7688a512 100644 --- a/views/EN/account/forgotPwd.pug +++ b/views/EN/account/forgotPwd.pug @@ -53,4 +53,4 @@ html(lang="en") // Bootstrap script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") // M4_LAB - script(src="https://transfer.hft-stuttgart.de/js/headfoot.js") + script(src="/js/headfoot.js") diff --git a/views/EN/account/registration.pug b/views/EN/account/registration.pug index 2e1aba4c..25096b15 100644 --- a/views/EN/account/registration.pug +++ b/views/EN/account/registration.pug @@ -89,4 +89,4 @@ html(lang="en") // M4_LAB script(src="/js/generalFunction.js") script(src="/js/registration.js") - script(src="https://transfer.hft-stuttgart.de/js/headfoot.js") \ No newline at end of file + script(src="/js/headfoot.js") \ No newline at end of file diff --git a/views/EN/account/reset.pug b/views/EN/account/reset.pug index 606b304f..610a914e 100644 --- a/views/EN/account/reset.pug +++ b/views/EN/account/reset.pug @@ -57,4 +57,4 @@ html(lang="en") // M4_LAB script(src="/js/security.js") script(src="/js/generalFunction.js") - script(src="https://transfer.hft-stuttgart.de/js/headfoot.js") + script(src="/js/headfoot.js") -- GitLab From cf23642b40c0591d0667201ebb1371d93a508a4e Mon Sep 17 00:00:00 2001 From: Rosanny Date: Fri, 4 Dec 2020 21:12:47 +0100 Subject: [PATCH 045/163] to access GitLab API --- routes/gitlab.js | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 routes/gitlab.js diff --git a/routes/gitlab.js b/routes/gitlab.js new file mode 100644 index 00000000..8af3898f --- /dev/null +++ b/routes/gitlab.js @@ -0,0 +1,34 @@ +var env = process.env.NODE_ENV || 'testing' +const config = require('../config/config')[env] +const axios = require('axios') +const fs = require('fs') +var formData = require('form-data') + +var gitlab = { + createNewPages: function(newPagesdata, callback) { + let data = new formData() + data.append('avatar', fs.createReadStream(newPagesdata.avatar)) + + let dataConfig = { + method: 'post', + url: 'https://transfer.hft-stuttgart.de/gitlab/api/v4/projects/user/'+newPagesdata.gitlabId+ + '?name='+newPagesdata.name+'&description='+newPagesdata.description+'&tag_list=website'+ + '&use_custom_template=true&template_name=page_basic', + headers: { + 'Authorization': 'Bearer '+config.gitlab.token_readWriteProjects, + ...data.getHeaders() + }, + data : data + } + axios(dataConfig) + .then(function (response) { + callback(response.data) + }) + .catch(function (err) { + if(err) + callback(err.response.data) + }) + } +} + +module.exports = gitlab \ No newline at end of file -- GitLab From e390b9a72feac872e449e6367683ae31ec0d65e0 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Fri, 4 Dec 2020 21:15:23 +0100 Subject: [PATCH 046/163] MLAB-396 --- views/DE/account/newPages.pug | 100 ++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 views/DE/account/newPages.pug diff --git a/views/DE/account/newPages.pug b/views/DE/account/newPages.pug new file mode 100644 index 00000000..b2985599 --- /dev/null +++ b/views/DE/account/newPages.pug @@ -0,0 +1,100 @@ +doctype html +html(lang="de") + head + title= "Setup a new website" + meta(charset="UTF-8") + meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") + link(rel="stylesheet", type="text/css", href="https://m4lab.hft-stuttgart.de/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="https://m4lab.hft-stuttgart.de/css/m4lab.css") + link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") + body + div(class="container") + div(class="row min-vh-100 flex-column flex-md-row") + aside(class="col-12 col-md-3 p-0 flex-shrink-1") + nav(class="navbar navbar-expand flex-md-column flex-row align-items-start py-2") + div(class="collapse navbar-collapse") + ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") + li(class="nav-item") + a(class="nav-link pl-0 text-nowrap" href="/account/") + span(class="font-weight-bold" style="color:black;") #{user.firstname} #{user.lastname} + li(class="nav-item") + a(class="nav-link pl-0" href="/account/profile") + i(class="fa fa-user fa-fw") + span(class="d-none d-md-inline") Benutzerprofil + if user.m4lab_idp == 1 + li(class="nav-item") + a(class="nav-link pl-0" href="/account/security") + i(class="fa fa-lock fa-fw") + span(class="d-none d-md-inline") Sicherheitseinstellungen + li(class="nav-item") + a(class="nav-link pl-0" href="/account/services") + i(class="fa fa-tasks fa-fw" style="color:black;") + span(class="d-none d-md-inline" style="color:black;") Projekte und Dienste + li(class="nav-item") + a(class="nav-link pl-0" href="/logout" style="color:red;") + i(class="fa fa-sign-out-alt fa-fw") + span(class="d-none d-md-inline") Logout + main(class="col bg-faded py-3 flex-grow-1") + if successes + for success in successes + div.alert.alert-success.alert-dismissible #{ success } + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + if errors + for error, i in errors + div.alert.alert-danger.alert-dismissible.fade.show #{ error } + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + h3(class="pb-2") New Website + div(class="mx-4") + h4(class="pb-1") Step 1: Setup + p Please fill-in all fields + //form#newPagesForm(method="POST", action="/newPages", encType="multipart/form-data") + form(method="POST", encType="multipart/form-data") + div(class='form-group row') + div(class="col-sm-10") + input#name(name="name", type="text" class="form-control", placeholder="Name", maxlength="75" required) + |

your website will be published on this URL: https://transfer.hft-stuttgart.de/pages/

+ div(class="form-group row") + div(class="col-sm-10") + textarea#description(name="description", type="text", class="form-control", placeholder="Description" maxlength="500" required) + div(class="form-group row") + label(for="logo" class="col-sm-2") Logo + div(class="col-sm-10") + input#logo(name="logo", type="file" required) + p#respInfoSuccess(class="font-italic font-weight-light" style="color: green; display: none;") + p#respInfoFail(class="font-italic font-weight-light" style="color: red; display: none;") + input(type="submit", class="btn btn-primary", value="Set") + hr + div(class="mx-4") + h4(class="pb-1") Step 2: Complete + p Your website has been created, but not yet published. Please make sure you have completed the following before you publish your website. + ul + li project name, link, logo: setting.js + li contact person: kontakt.html + hr + div(class="mx-4") + h4(class="pb-1") Step 3: Publish + p bla bla bla + input(type="submit", class="btn btn-primary", value="Publish" disabled) + + // jQuery + script(src="https://code.jquery.com/jquery-3.3.1.min.js") + script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous") + // Bootstrap + script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") + // M4_LAB + script(src="https://m4lab.hft-stuttgart.de/js/headfoot.js") + script. + function showWebsiteURL() { + if ($("#name").val()) { + $("#nameInfo").show(); + let webName = $("#name").val().toLowerCase().replace(/\s/g, '-'); + document.getElementById("websiteName").innerText = webName; + } + else { + $("#nameInfo").hide(); + } + } + $('#name').on('input',function(e){ + showWebsiteURL(); + }) + showWebsiteURL(); \ No newline at end of file -- GitLab From 56eb3ee3ba9952c48946022378ae1d3e35d1f454 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Fri, 11 Dec 2020 21:23:55 +0100 Subject: [PATCH 047/163] update views --- views/DE/account/newPages.pug | 63 ++++++++++++++++++++++------------- views/DE/account/services.pug | 48 +++++++++++++++++++++++--- 2 files changed, 83 insertions(+), 28 deletions(-) diff --git a/views/DE/account/newPages.pug b/views/DE/account/newPages.pug index b2985599..00f11d21 100644 --- a/views/DE/account/newPages.pug +++ b/views/DE/account/newPages.pug @@ -4,8 +4,8 @@ html(lang="de") title= "Setup a new website" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://m4lab.hft-stuttgart.de/css/bootstrap.min.css") - link(rel="stylesheet", type="text/css", href="https://m4lab.hft-stuttgart.de/css/m4lab.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") body div(class="container") @@ -16,7 +16,7 @@ html(lang="de") ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") li(class="nav-item") a(class="nav-link pl-0 text-nowrap" href="/account/") - span(class="font-weight-bold" style="color:black;") #{user.firstname} #{user.lastname} + span(class="font-weight-bold" style="color:black;") #{user.firstName} #{user.lastName} li(class="nav-item") a(class="nav-link pl-0" href="/account/profile") i(class="fa fa-user fa-fw") @@ -47,34 +47,49 @@ html(lang="de") div(class="mx-4") h4(class="pb-1") Step 1: Setup p Please fill-in all fields - //form#newPagesForm(method="POST", action="/newPages", encType="multipart/form-data") form(method="POST", encType="multipart/form-data") div(class='form-group row') - div(class="col-sm-10") - input#name(name="name", type="text" class="form-control", placeholder="Name", maxlength="75" required) + label(for="name", class="col-sm-2") Name + div(class="col-sm-8") + input#name(name="name", type="text", class="form-control", value=project.name, placeholder="Name", maxlength="75" required) |

your website will be published on this URL: https://transfer.hft-stuttgart.de/pages/

div(class="form-group row") - div(class="col-sm-10") - textarea#description(name="description", type="text", class="form-control", placeholder="Description" maxlength="500" required) + label(for="description", class="col-sm-2") Description + div(class="col-sm-8") + textarea#description(name="description", type="text", class="form-control", placeholder="Description", maxlength="500" required) #{project.description} div(class="form-group row") - label(for="logo" class="col-sm-2") Logo - div(class="col-sm-10") - input#logo(name="logo", type="file" required) - p#respInfoSuccess(class="font-italic font-weight-light" style="color: green; display: none;") - p#respInfoFail(class="font-italic font-weight-light" style="color: red; display: none;") + label(for="logo", class="col-sm-2") Logo + div(class="col-sm-8") + input#logo(name="logo", class="form-control-file", value=project.avatar, type="file" required) input(type="submit", class="btn btn-primary", value="Set") hr - div(class="mx-4") - h4(class="pb-1") Step 2: Complete - p Your website has been created, but not yet published. Please make sure you have completed the following before you publish your website. - ul - li project name, link, logo: setting.js - li contact person: kontakt.html + if project.webUrl + div#step2(class="mx-4") + h4(class="pb-1") Step 2: Complete + //p Your website has been created, but not yet published. Please make sure you have completed the following before you publish your website. + p Please make sure you have completed the following before you publish your website. + ul + li project name, link, logo: setting.js + li contact person: kontakt.html + else + div#step2(class="mx-4", style="color: gray;") + h4(class="pb-1") Step 2: Complete + //p Your website has been created, but not yet published. Please make sure you have completed the following before you publish your website. + p Please make sure you have completed the following before you publish your website. + ul + li project name, link, logo: setting.js + li contact person: kontakt.html hr - div(class="mx-4") - h4(class="pb-1") Step 3: Publish - p bla bla bla - input(type="submit", class="btn btn-primary", value="Publish" disabled) + if project.webUrl + div#step3(class="mx-4") + h4(class="pb-1") Step 3: Publish + p bla bla bla + input(type="submit", class="btn btn-primary", value="Publish") + else + div#step3(class="mx-4", style="color: gray;") + h4(class="pb-1") Step 3: Publish + p bla bla bla + input(type="submit", class="btn btn-primary", value="Publish" disabled) // jQuery script(src="https://code.jquery.com/jquery-3.3.1.min.js") @@ -82,7 +97,7 @@ html(lang="de") // Bootstrap script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") // M4_LAB - script(src="https://m4lab.hft-stuttgart.de/js/headfoot.js") + script(src="/js/headfoot.js") script. function showWebsiteURL() { if ($("#name").val()) { diff --git a/views/DE/account/services.pug b/views/DE/account/services.pug index 8ef010bd..305bf025 100644 --- a/views/DE/account/services.pug +++ b/views/DE/account/services.pug @@ -4,8 +4,8 @@ html(lang="de") title= "User Profile" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") - link(rel="stylesheet", type="text/css", href="/css/m4lab.css") + link(rel="stylesheet", type="text/css", href="https://m4lab.hft-stuttgart.de/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="https://m4lab.hft-stuttgart.de/css/m4lab.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") body div(class="container") @@ -35,8 +35,48 @@ html(lang="de") i(class="fa fa-sign-out-alt fa-fw") span(class="d-none d-md-inline") Logout main(class="col bg-faded py-3 flex-grow-1") - p Auf dieser Seite werden in Zukunft Funktionen bereitgestellt, um Ihre Beteiligung an Projekten und Aktivierung von Diensten zu organisieren. Diese Funktionen stehen zurzeit aber noch nicht zur Verfügung. - + div(class="container") + h3(class="pb-2") Dienste + div(class="col-sm-12") + //p Auf dieser Seite werden in Zukunft Funktionen bereitgestellt, um Ihre Beteiligung an Projekten und Aktivierung von Diensten zu organisieren. Diese Funktionen stehen zurzeit aber noch nicht zur Verfügung. + p Auf dieser Seite werden in Zukunft Funktionen bereitgestellt, um Ihre Aktivierung von Diensten zu organisieren. Diese Funktionen stehen zurzeit aber noch nicht zur Verfügung. + hr + div(class="container") + h3(class="pb-2") Projekte + div(class="col-sm-12") + if gitlabPages + div(class="container") + div(class="row pb-1") + div(class="col font-weight-bold") Projektinformationen + div(class="col text-right") + a(href="/newPages" class="btn btn-sm btn-success" role="button") New Information + table(class="table") + for item in gitlabPages + - var img = item.avatar_url + tr + td + img(src=img, width="45", height="45") + td #{item.name} + if item.isPublished + td published + else + td not published yet + div(class="container") + div(class="row pb-1") + div(class="col font-weight-bold") Projektcode und -daten + div(class="col text-right") + button(type="button", class="btn btn-sm btn-success") New Code and Data + table(class="table") + for item in gitlabRepos + - var img = item.avatar_url + tr + td + img(src=img, width="45", height="45") + td #{item.name} + else + p + | Please login to gitlab to activate your access, and then refresh this page. + // jQuery script(src="https://code.jquery.com/jquery-3.3.1.min.js") script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous") -- GitLab From a954d29e6742921895b383d9c28a558623ffbb4a Mon Sep 17 00:00:00 2001 From: Rosanny Date: Fri, 11 Dec 2020 21:24:24 +0100 Subject: [PATCH 048/163] define user class --- classes/user.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 classes/user.js diff --git a/classes/user.js b/classes/user.js new file mode 100644 index 00000000..3549bf00 --- /dev/null +++ b/classes/user.js @@ -0,0 +1,23 @@ +class User { + constructor(id, email, salutation, title, firstName, lastName, industry, organisation, speciality, m4lab_idp, gitlabUserId, verificationStatus) { + this.id = id + this.email = email + this.salutation = salutation + this.title = title + this.firstName = firstName + this.lastName = lastName + this.industry = industry + this.organisation = organisation + this.speciality = speciality + this.m4lab_idp = m4lab_idp + this.gitlabUserId = gitlabUserId + this.verificationStatus = verificationStatus + } + + // getter + get fullName() { + return this.firstName+' '+this.lastName + } +} + +module.exports = User \ No newline at end of file -- GitLab From f8f078aadfef0a2d93f6faf41865a0b80c54e03c Mon Sep 17 00:00:00 2001 From: Rosanny Date: Fri, 11 Dec 2020 21:25:36 +0100 Subject: [PATCH 049/163] update gitlab API --- routes/gitlab.js | 73 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/routes/gitlab.js b/routes/gitlab.js index 8af3898f..67b300a0 100644 --- a/routes/gitlab.js +++ b/routes/gitlab.js @@ -5,13 +5,36 @@ const fs = require('fs') var formData = require('form-data') var gitlab = { + getUserIdByEmail: function(email, callback) { + let dataConfig = { + method: 'get', + url: 'https://transfer.hft-stuttgart.de/gitlab/api/v4/users?search='+email, + headers: { + 'Authorization': 'Bearer '+config.gitlab.token_readWriteProjects} + } + + axios(dataConfig) + .then(function (response) { + let res = { + error: false, + data: response.data[0].id} + callback(res) + }) + .catch(function (err) { + let res = { + error: true, + data: err} + callback(res) + }) + }, + // todo: fixing callback createNewPages: function(newPagesdata, callback) { let data = new formData() data.append('avatar', fs.createReadStream(newPagesdata.avatar)) let dataConfig = { method: 'post', - url: 'https://transfer.hft-stuttgart.de/gitlab/api/v4/projects/user/'+newPagesdata.gitlabId+ + url: 'https://transfer.hft-stuttgart.de/gitlab/api/v4/projects/user/'+newPagesdata.gitlabUserId+ '?name='+newPagesdata.name+'&description='+newPagesdata.description+'&tag_list=website'+ '&use_custom_template=true&template_name=page_basic', headers: { @@ -20,6 +43,7 @@ var gitlab = { }, data : data } + axios(dataConfig) .then(function (response) { callback(response.data) @@ -27,7 +51,54 @@ var gitlab = { .catch(function (err) { if(err) callback(err.response.data) + }) + }, + getUserProjects: function(gitlabUserId, callback) { + axios.get('https://transfer.hft-stuttgart.de/gitlab/api/v4/users/'+gitlabUserId+'/projects?private_token='+ + config.gitlab.token_readWriteProjects+'&owned=true&simple=true&visibility=public') + .then(response => { + let res = { + error: false, + data: response.data} + callback(res) }) + .catch(err => { + let res = { + error: true, + data: err} + callback(res) + }) + }, + getProjectIdsFromRunners: function(gitlabUserId, callback) { + let projectIds = [] + let dataConfig = { + method: 'get', + url: 'https://transfer.hft-stuttgart.de/gitlab/api/v4/runners/7', + headers: { + 'Authorization': 'Bearer '+config.gitlab.token_readWriteProjects} + } + + axios(dataConfig) + .then(function (response) { + let projects = response.data.projects + projects.forEach((project) => { + if(project.namespace.id == gitlabUserId) { + projectIds.push(project.id) + } + }) + let res = { + error: false, + data: projectIds} + + callback(res) + }) + .catch(function (err) { + let res = { + error: true, + data: err} + + callback(res) + }); } } -- GitLab From 346b22c7846bd778229f696c734afece584c1d2f Mon Sep 17 00:00:00 2001 From: Rosanny Date: Fri, 11 Dec 2020 21:26:50 +0100 Subject: [PATCH 050/163] updates on MLAB-396 --- routes/routes-account.js | 349 +++++++++++++++++++++++++++------------ 1 file changed, 242 insertions(+), 107 deletions(-) diff --git a/routes/routes-account.js b/routes/routes-account.js index 1f20a780..ba892df8 100644 --- a/routes/routes-account.js +++ b/routes/routes-account.js @@ -2,6 +2,7 @@ const fs = require('fs') const SamlStrategy = require('passport-saml').Strategy const dbconn = require('./dbconn') const methods = require('./methods') +const gitlab = require('./gitlab') // pwd encryption const bcrypt = require('bcryptjs'); const saltRounds = 10; @@ -10,7 +11,10 @@ const salt = 64; // salt length const async = require('async') const crypto = require('crypto') const mailer = require('./mailer') -const superagent = require('superagent') +const axios = require('axios') + +const myUser = require('../classes/user') +var loggedInUser module.exports = function (app, config, passport, i18n) { @@ -113,6 +117,29 @@ module.exports = function (app, config, passport, i18n) { if (req.isAuthenticated()) { methods.getUserByEmail(req.user.email, function(data, err){ if (!err) { + // Initialize user + if (!loggedInUser) { + loggedInUser = new myUser() + loggedInUser.id = data.id + loggedInUser.email = req.user.email + loggedInUser.salutation = data.salutation + loggedInUser.title = data.title + loggedInUser.firstName = data.firstname + loggedInUser.lastName = data.lastname + loggedInUser.industry = data.industry + loggedInUser.organisation = data.organisation + loggedInUser.speciality = data.speciality + loggedInUser.m4lab_idp = data.m4lab_idp + loggedInUser.verificationStatus = data.verificationStatus + + methods.getGitlabId(data.id, function(gitlabUserId, err){ + if(!err) { + loggedInUser.gitlabUserId = gitlabUserId + } + //console.log(loggedInUser) + }) + } + res.render(lang+'/account/home', { user: data }); @@ -124,12 +151,11 @@ module.exports = function (app, config, passport, i18n) { }); app.get('/login', - passport.authenticate(config.passport.strategy, - { - successRedirect: '/', - failureRedirect: '/login' - }) - ); + passport.authenticate(config.passport.strategy, { + successRedirect: '/', + failureRedirect: '/login' + }) + ) app.get('/logout', function (req, res) { if (req.user == null) { @@ -177,112 +203,109 @@ module.exports = function (app, config, passport, i18n) { }); app.get('/services', function (req, res) { - if (req.isAuthenticated()) { - methods.getUserByEmail(req.user.email, function(data, err){ - if (!err) { - if (data.verificationStatus == 1) { - // start =============== RS: MLAB-183 - let userId = data.id - methods.getGitlabId(userId, function(data, err){ - if (!err) { - if (data) { - console.log("TODO: GitLab is already activated for this user. Allow project creation.") - } - else { - superagent.get('https://transfer.hft-stuttgart.de/gitlab/api/v4/users?private_token='+config.gitlab.token_readWriteProjects+'&search='+req.user.email) - .then(res => { - if (res.body.length > 0) { - let gitlabActivationData = { - user_id: userId, - gitlab_userId: res.body[0].id - } - methods.addGitlabUser(gitlabActivationData, function(err){}) - } - else { - console.log('TODO: Show gitlab activation button: transfer.hft-stuttgart.de/gitlab') - } - }) - .catch(err => { - console.log(err.message) - }); + if (req.isAuthenticated() && loggedInUser) { + if (loggedInUser.verificationStatus == 1) { + let gitlabReposArr = [] + let gitlabPagesArr = [] + let userData = { + firstname: loggedInUser.firstName, + lastname: loggedInUser.lastName, + m4lab_idp: loggedInUser.m4lab_idp} + + if (loggedInUser.gitlabUserId) { + // GitLab is already activated for this user. Allow project creation. + /* + waterfall([ + function(callback){ + callback(null, 'one', 'two'); + }, + function(arg1, arg2, callback){ + callback(null, 'three'); + }, + function(arg1, callback){ + // arg1 now equals 'three' + callback(null, 'done'); + } + ], function (err, result) { + // result now equals 'done' + }); + */ + async.waterfall([ + // check projects in runners + function(callback) { + let gitlabRunnersProjectIdsArr + gitlab.getProjectIdsFromRunners (loggedInUser.gitlabUserId, function(data){ + if(data.error) + return res.status(500).send(data.data) + gitlabRunnersProjectIdsArr = data.data + callback(null, gitlabRunnersProjectIdsArr) + }) + } + ], function(err, gitlabRunnersProjectIdsArr) { + // get user projects + gitlab.getUserProjects (loggedInUser.gitlabUserId, function(data){ + if (data.error) + return res.status(500).send(data.data) + let gitlabData = data.data + for(let i = 0; i < gitlabData.length; i++){ + if (gitlabData[i].tag_list.includes('website')) { + let idxRunners = gitlabRunnersProjectIdsArr.indexOf(gitlabData[i].id) + let isWebsitePublished = false + if (idxRunners > 0) { + isWebsitePublished = true + } + let page = { + name: gitlabData[i].name, + description: gitlabData[i].description, + avatar_url: gitlabData[i].avatar_url, + web_url: gitlabData[i].web_url, + isPublished: isWebsitePublished} + gitlabPagesArr.push(page) + } else { + let repo = { + name: gitlabData[i].name, + description: gitlabData[i].description, + avatar_url: gitlabData[i].avatar_url, + web_url: gitlabData[i].web_url} + gitlabReposArr.push(repo) } } + + res.render(lang+'/account/services', { + user: userData, + gitlabRepos: gitlabReposArr, + gitlabPages: gitlabPagesArr + }) }) - // end =============== RS: MLAB-183 - res.render(lang+'/account/services', { - user: data - }); - /* !!! DO NOT DELETE. TEMPORARILY DISABLED FOR FUTURE USE. !!! - async.waterfall([ - // get userId by email from userdb - function(done) { - methods.getUserIdByEmail(req.user.email, function(userId, err) { - if (!err) { - done(err, userId) - } - }) - }, - // get user-project-role from userdb - function(userId, done) { - methods.getUserProjectRole(userId, function(userProjects, err) { - if (!err) { - done(err, userProjects) - } - }) - }, - // get all projects from projectdb - function(userProjects, done) { - methods.getAllProjects(function(projectsOverview, err) { - if (!err) { - done(err, userProjects, projectsOverview) - } - }) - }, - // create JSON object of projects and user status for front-end - function(userProjects, projectsOverview, done) { - var allProjects = [] // JSON object - - var userProjectId = [] // array of user's project_id - for (var i = 0; i < userProjects.length; i++) { - userProjectId.push(userProjects[i].project_id) - } - - for (var i = 0; i < projectsOverview.length; i++) { - // check if projectId is exist in userProjectId[] - var status = false - if (userProjectId.indexOf(projectsOverview[i].id) > -1) { - status = true - } - // add data to JSON object - allProjects.push({ - id: projectsOverview[i].id, - title: projectsOverview[i].title, - summary: projectsOverview[i].onelinesummary, - cp: projectsOverview[i].contact_email, - userStatus: status - }); + }) + } else { + gitlab.getUserIdByEmail(req.user.email, function(data){ + if (!data.error) { + let gitlabActivationData = { + user_id: loggedInUser.id, + gitlab_userId: data.data} + methods.addGitlabUser(gitlabActivationData, function(err){ + if(!err) { + loggedInUser.gitlabUserId = gitlabActivationData.gitlab_userId + res.redirect('/services') } - - // render the page - res.render(lang+'/account/services', { - user: data, - project: allProjects - }); - } - ]) - */ - } - else { - res.render(lang+'/account/home', { - user: data - }); - } + }) + } else { + res.render(lang+'/account/services', { + user: userData + }) + } + }) } - }) + } else { + res.render(lang+'/account/home', { + user: data + }) + } } else { - res.redirect('/login'); + res.redirect('/login') } - }); + }) app.get('/security', function (req, res) { if (req.isAuthenticated()) { @@ -557,6 +580,118 @@ module.exports = function (app, config, passport, i18n) { }); + // ============= NEW GITLAB PAGES =========================== + app.get('/newPages', function(req, res){ + if (req.isAuthenticated() && loggedInUser) { + let userData = { + firstName: loggedInUser.firstName, + lastName: loggedInUser.lastName, + m4lab_idp: loggedInUser.m4lab_idp + } + let projectData = { + name: null, + description: null, + avatar: null + } + res.render(lang+'/account/newPages', { + user: userData, + project: projectData + }) + } + else { + res.redirect('/login'); + } + }) + + app.post('/newPages', function(req, res) { + if (req.isAuthenticated() && loggedInUser) { + if (req.files && req.body.name && req.body.description) { + let projectName = req.body.name.toLowerCase().replace(/\s/g, '-') + let projectDesc = req.body.description + let projectAvatar = req.files.logo + let avatarDir = 'public/upload/' + + let userData = { + firstName: loggedInUser.firstName, + lastName: loggedInUser.lastName, + m4lab_idp: loggedInUser.m4lab_idp} + + async.waterfall([ + // upload avatar + function(done) { + projectAvatar.mv(avatarDir + projectAvatar.name, function(err) { + if (err) + return res.status(500).send(err) + console.log('avatar uploaded') + done(err) + }) + }, + // call gitlab + function(done) { + let newPagesData = { + gitlabUserId: loggedInUser.gitlabUserId, + name: projectName, + description: projectDesc, + avatar: avatarDir+projectAvatar.name} + gitlab.createNewPages(newPagesData, function(msg, err){ + if (err) { callback(err) } + else { + console.log(msg) + if(msg.message) { + if(msg.message.name == "has already been taken") { + let data = { + status: "error", + msg: "project name has already been taken, please choose another name"} + let projectData = { + name: projectName, + description: projectDesc, + avatar: projectAvatar} + + req.flash("error", data.msg) + res.render(lang+'/account/newPages', { + user: userData, + project: projectData + }) + } + } + else { + let data = { + status: "success", + msg: "success"} + let projectData = { + name: projectName, + description: projectDesc, + avatar: projectAvatar, + webUrl: msg.web_url} + + req.flash("success", data.msg) + res.render(lang+'/account/newPages', { + user: userData, + project: projectData + }) + } + } + done(err) + }) + }, + // delete avatar from /public/avatar + function(){ + fs.unlink(avatarDir+projectAvatar.name, (err) => { + if (err) throw err; + console.log('avatar is successfully deleted'); + }) + } + ]) + } + else { + console.log('Please provide the data') + } + } + else { + res.redirect('/login'); + } + }) + // ============= NEW USERS REGISTRATION =========================== app.get('/registration', function(req, res) { res.render(lang+'/account/registration') @@ -769,7 +904,7 @@ module.exports = function (app, config, passport, i18n) { }); }); - app.post('/contact', function(req, res, next) { + app.post('/contact', function(req, res, next) { //methods.currentDate(); let emailAddress = req.body.inputEmail; let supportAddress = "support-transfer@hft-stuttgart.de"; -- GitLab From bc16c384935492915de77010ccf1ac0571781d85 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Fri, 18 Dec 2020 10:28:47 +0100 Subject: [PATCH 051/163] express-flash-2 --- app.js | 8 +- package-lock.json | 345 ++++++++++++++++++++++-------- package.json | 7 +- views/DE/account/contact.pug | 14 +- views/DE/account/forgotPwd.pug | 14 +- views/DE/account/profile.pug | 14 +- views/DE/account/registration.pug | 14 +- views/DE/account/security.pug | 14 +- 8 files changed, 295 insertions(+), 135 deletions(-) diff --git a/app.js b/app.js index daa83468..737d73fa 100644 --- a/app.js +++ b/app.js @@ -7,7 +7,7 @@ const cookieParser = require('cookie-parser'); const bodyParser = require('body-parser'); const session = require('express-session'); const errorhandler = require('errorhandler'); -const flash = require('express-flash'); +const flash = require('express-flash-2'); const fileUpload = require('express-fileupload'); const helmet = require('helmet'); const compression = require('compression'); @@ -56,12 +56,6 @@ app.use(session( } )); app.use(flash()); -app.use((req, res, next) => { - res.locals.errors = req.flash("error"); - res.locals.successes = req.flash("success"); - next(); -}); - app.use(passport.initialize()); app.use(passport.session()); diff --git a/package-lock.json b/package-lock.json index 6e8994d0..bf8aa98c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -76,6 +76,11 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" + }, "async": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/async/-/async-3.1.0.tgz", @@ -86,6 +91,14 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, + "axios": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.0.tgz", + "integrity": "sha512-fmkJBknJKoZwem3/IKSSLpkdNXZeBu5Q7GA/aRsr2btgrptmSCxi2oFjZHqGdK9DoTil9PIHlPIZw2EcRJXRvw==", + "requires": { + "follow-redirects": "^1.10.0" + } + }, "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", @@ -206,6 +219,11 @@ "fill-range": "^7.0.1" } }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=" + }, "busboy": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz", @@ -243,6 +261,16 @@ "lazy-cache": "^1.0.3" } }, + "chai": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", + "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", + "requires": { + "assertion-error": "^1.0.1", + "deep-eql": "^0.1.3", + "type-detect": "^1.0.0" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -316,10 +344,13 @@ "delayed-stream": "~1.0.0" } }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "requires": { + "graceful-readlink": ">= 1.0.0" + } }, "compressible": { "version": "2.0.18", @@ -375,11 +406,6 @@ "xdg-basedir": "^3.0.0" } }, - "connect-flash": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/connect-flash/-/connect-flash-0.1.1.tgz", - "integrity": "sha1-2GMPJtlaf4UfmVax6MxnMvO2qjA=" - }, "constantinople": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz", @@ -428,11 +454,6 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, - "cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" - }, "core-js": { "version": "2.6.10", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz", @@ -496,6 +517,21 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, + "deep-eql": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "requires": { + "type-detect": "0.1.1" + }, + "dependencies": { + "type-detect": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=" + } + } + }, "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -524,6 +560,11 @@ "streamsearch": "0.1.2" } }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=" + }, "doctypes": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", @@ -652,12 +693,13 @@ "busboy": "^0.3.1" } }, - "express-flash": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/express-flash/-/express-flash-0.0.2.tgz", - "integrity": "sha1-I9GovPP5DXB5KOSJ+Whp7K0KzaI=", + "express-flash-2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/express-flash-2/-/express-flash-2-1.0.1.tgz", + "integrity": "sha1-8Vn04BcdxL8Z5ccOUxBjqGX5Cgo=", "requires": { - "connect-flash": "0.1.x" + "chai": "^3.5.0", + "mocha": "^3.2.0" } }, "express-session": { @@ -692,11 +734,6 @@ } } }, - "fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" - }, "feature-policy": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/feature-policy/-/feature-policy-0.3.0.tgz", @@ -724,6 +761,11 @@ "unpipe": "~1.0.0" } }, + "follow-redirects": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", + "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==" + }, "form-data": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", @@ -734,11 +776,6 @@ "mime-types": "^2.1.12" } }, - "formidable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", - "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==" - }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -754,6 +791,11 @@ "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=" }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, "fsevents": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", @@ -770,6 +812,19 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "glob-parent": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", @@ -809,6 +864,16 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", "integrity": "sha1-ShL/G2A3bvCYYsIJPt2Qgyi+hCM=" }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=" + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -822,6 +887,11 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + }, "helmet": { "version": "3.23.3", "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.23.3.tgz", @@ -943,15 +1013,24 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=" + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "ipaddr.js": { "version": "1.9.0", @@ -1088,6 +1167,11 @@ "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=" }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=" + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -1109,6 +1193,65 @@ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=" + }, + "lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=" + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" + }, + "lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "requires": { + "lodash._baseassign": "^3.0.0", + "lodash._basecreate": "^3.0.0", + "lodash._isiterateecall": "^3.0.0" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, "longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", @@ -1222,6 +1365,68 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "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=" + } + } + }, + "mocha": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", + "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.6.8", + "diff": "3.2.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.1", + "growl": "1.9.2", + "he": "1.1.1", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "requires": { + "ms": "2.0.0" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, "morgan": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", @@ -1341,6 +1546,14 @@ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", "integrity": "sha1-dysK5qqlJcOZ5Imt+tkMQD6zwo8=" }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -1401,6 +1614,11 @@ "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" }, + "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=" + }, "path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", @@ -1931,59 +2149,6 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, - "superagent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", - "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", - "requires": { - "component-emitter": "^1.3.0", - "cookiejar": "^2.1.2", - "debug": "^4.1.1", - "fast-safe-stringify": "^2.0.7", - "form-data": "^3.0.0", - "formidable": "^1.2.2", - "methods": "^1.1.2", - "mime": "^2.4.6", - "qs": "^6.9.4", - "readable-stream": "^3.6.0", - "semver": "^7.3.2" - }, - "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "requires": { - "ms": "2.1.2" - } - }, - "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" - }, - "qs": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", - "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" - } - } - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -2036,6 +2201,11 @@ "nopt": "~1.0.10" } }, + "type-detect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", + "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=" + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -2168,6 +2338,11 @@ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, "write-file-atomic": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", diff --git a/package.json b/package.json index d6e8119e..ff0f1312 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ }, "dependencies": { "async": "^3.1.0", + "axios": "^0.21.0", "bcryptjs": "^2.4.3", "body-parser": "^1.19.0", "compression": "^1.7.4", @@ -29,8 +30,9 @@ "errorhandler": "1.4.3", "express": "^4.17.1", "express-fileupload": "^1.1.6", - "express-flash": "0.0.2", + "express-flash-2": "^1.0.1", "express-session": "^1.17.0", + "form-data": "^3.0.0", "fs": "0.0.1-security", "helmet": "^3.23.3", "i18n": "^0.8.5", @@ -40,8 +42,7 @@ "nodemon": "^2.0.1", "passport": "0.3.2", "passport-saml": "^1.4.2", - "pug": "^2.0.4", - "superagent": "^6.1.0" + "pug": "^2.0.4" }, "devDependencies": {}, "engines": { diff --git a/views/DE/account/contact.pug b/views/DE/account/contact.pug index 67107cf9..37fee82b 100644 --- a/views/DE/account/contact.pug +++ b/views/DE/account/contact.pug @@ -17,14 +17,12 @@ html(lang="de") div(class="col-md-12" style="margin-bottom: 40px;") img(class="mx-auto" src="/img/Kontakt.jpg" width="100%") div(class="contact-clean" style="background-color: rgb(234,234,234);") - if successes - for success in successes - div.alert.alert-success.alert-dismissible #{ success } - a(class="close", href="#", data-dismiss="alert", aria-label="close") × - if errors - for error, i in errors - div.alert.alert-danger.alert-dismissible.fade.show #{ error } - a(class="close", href="#", data-dismiss="alert", aria-label="close") × + if flash.success + div.alert.alert-success.alert-dismissible #{flash.success} + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + if flash.error + div.alert.alert-danger.alert-dismissible.fade.show #{flash.error} + a(class="close", href="#", data-dismiss="alert", aria-label="close") × form(method="POST") h2(class="text_center") Kontaktieren Sie uns div(class="form-group") diff --git a/views/DE/account/forgotPwd.pug b/views/DE/account/forgotPwd.pug index 75390a80..07e90a89 100644 --- a/views/DE/account/forgotPwd.pug +++ b/views/DE/account/forgotPwd.pug @@ -12,14 +12,12 @@ html(lang="de") div(class="container-fluid") div(class="row") div(class="col-md-6 offset-md-3") - if successes - for success in successes - div.alert.alert-success.alert-dismissible #{ success } - a(class="close", href="#", data-dismiss="alert", aria-label="close") × - if errors - for error, i in errors - div.alert.alert-danger.alert-dismissible.fade.show #{ error } - a(class="close", href="#", data-dismiss="alert", aria-label="close") × + if flash.success + div.alert.alert-success.alert-dismissible #{flash.success} + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + if flash.error + div.alert.alert-danger.alert-dismissible.fade.show #{flash.error} + a(class="close", href="#", data-dismiss="alert", aria-label="close") × form#forgotForm(class="form-signin", method="POST") img(src="https://transfer.hft-stuttgart.de/images/demo/m4lab_logo.jpg", class="img-responsive center-block", width="185", height="192") div(class="form-row") diff --git a/views/DE/account/profile.pug b/views/DE/account/profile.pug index d21fd923..fcb01429 100644 --- a/views/DE/account/profile.pug +++ b/views/DE/account/profile.pug @@ -35,14 +35,12 @@ html(lang="de") i(class="fa fa-sign-out-alt fa-fw") span(class="d-none d-md-inline") Logout main(class="col bg-faded py-3 flex-grow-1") - if successes - for success in successes - div.alert.alert-success.alert-dismissible #{ success } - a(class="close", href="#", data-dismiss="alert", aria-label="close") × - if errors - for error, i in errors - div.alert.alert-danger.alert-dismissible.fade.show #{ error } - a(class="close", href="#", data-dismiss="alert", aria-label="close") × + if flash.success + div.alert.alert-success.alert-dismissible #{flash.success} + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + if flash.error + div.alert.alert-danger.alert-dismissible.fade.show #{flash.error} + a(class="close", href="#", data-dismiss="alert", aria-label="close") × form#profileForm(method="POST", action="/updateProfile") div(class="form-row") div(class='form-group col-md-2') diff --git a/views/DE/account/registration.pug b/views/DE/account/registration.pug index 401af467..3d90f3f9 100644 --- a/views/DE/account/registration.pug +++ b/views/DE/account/registration.pug @@ -21,14 +21,12 @@ html(lang="de") div(class="alert alert-info" role="alert") | Auf dieser Seite können sich Benutzer, die keinen Account an der HFT haben, registrieren.
| Um sich mit ihrem HFT-Account anzumelden, klicken Sie hier. - if successes - for success in successes - div.alert.alert-success.alert-dismissible #{ success } - a(class="close", href="#", data-dismiss="alert", aria-label="close") × - if errors - for error, i in errors - div.alert.alert-danger.alert-dismissible.fade.show #{ error } - a(class="close", href="#", data-dismiss="alert", aria-label="close") × + if flash.success + div.alert.alert-success.alert-dismissible #{flash.success} + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + if flash.error + div.alert.alert-danger.alert-dismissible.fade.show #{flash.error} + a(class="close", href="#", data-dismiss="alert", aria-label="close") × form(method="POST") h5(class="pt-2 mb-3 font-weight-bold") Anmeldedaten div(class='form-row') diff --git a/views/DE/account/security.pug b/views/DE/account/security.pug index 712a5661..60dbd2be 100644 --- a/views/DE/account/security.pug +++ b/views/DE/account/security.pug @@ -38,14 +38,12 @@ html(lang="de") i(class="fa fa-sign-out-alt fa-fw") span(class="d-none d-md-inline") Logout main(class="col bg-faded py-3 flex-grow-1") - if successes - for success in successes - div.alert.alert-success.alert-dismissible #{ success } - a(class="close", href="#", data-dismiss="alert", aria-label="close") × - if errors - for error, i in errors - div.alert.alert-danger.alert-dismissible.fade.show #{ error } - a(class="close", href="#", data-dismiss="alert", aria-label="close") × + if flash.success + div.alert.alert-success.alert-dismissible #{flash.success} + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + if flash.error + div.alert.alert-danger.alert-dismissible.fade.show #{flash.error} + a(class="close", href="#", data-dismiss="alert", aria-label="close") × form(class="needs-validation", method="post", action="/account/changePwd" novalidate) div(class="form-row") div(class='form-group col-md-8') -- GitLab From 19846ed8ea1f755aa431264a4ed15923bbcae754 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Fri, 5 Feb 2021 11:12:17 +0100 Subject: [PATCH 052/163] add classes --- classes/project.js | 44 ++++++++++++++++++++++++++++++++++++++++++++ classes/repo.js | 9 +++++++++ classes/user.js | 46 +++++++++++++++++++++++++++++++++++++++++++--- classes/website.js | 25 +++++++++++++++++++++++++ 4 files changed, 121 insertions(+), 3 deletions(-) create mode 100644 classes/project.js create mode 100644 classes/repo.js create mode 100644 classes/website.js diff --git a/classes/project.js b/classes/project.js new file mode 100644 index 00000000..32e5801d --- /dev/null +++ b/classes/project.js @@ -0,0 +1,44 @@ +class Project { + constructor(ownerGitlabId, id, name, desc, logo) { + this.ownerGitlabId = ownerGitlabId + this.id = id + this.name = name + this.desc = desc + this.logo = logo + } + + // getter + getOwnerGitlabId() { + return this.ownerGitlabId + } + getId() { + return this.id + } + getName() { + return this.name + } + getDesc() { + return this.desc + } + getLogo() { + return this.logo + } + // setter + setOwnerGitlabId(newOwnerGitlabId){ + this.ownerGitlabId = newOwnerGitlabId + } + setId(newId) { + this.id = newId + } + setName(newName) { + this.name = newName + } + setDesc(newDesc) { + this.desc = newDesc + } + setLogo(newLogoUrl){ + this.logo = newLogoUrl + } +} + +module.exports = Project \ No newline at end of file diff --git a/classes/repo.js b/classes/repo.js new file mode 100644 index 00000000..f0fef1f3 --- /dev/null +++ b/classes/repo.js @@ -0,0 +1,9 @@ +const Project = require("./project"); + +class Repo extends Project { + constructor(ownerGitlabId, id, name, desc, logo) { + super(ownerGitlabId, id, name, desc, logo) + } +} + +module.exports = Repo \ No newline at end of file diff --git a/classes/user.js b/classes/user.js index 3549bf00..6589fef8 100644 --- a/classes/user.js +++ b/classes/user.js @@ -1,5 +1,5 @@ class User { - constructor(id, email, salutation, title, firstName, lastName, industry, organisation, speciality, m4lab_idp, gitlabUserId, verificationStatus) { + constructor(id, email, salutation, title, firstName, lastName, industry, organisation, speciality, is_m4lab_idp, gitlabUserId, verificationStatus) { this.id = id this.email = email this.salutation = salutation @@ -9,15 +9,55 @@ class User { this.industry = industry this.organisation = organisation this.speciality = speciality - this.m4lab_idp = m4lab_idp + this.is_m4lab_idp = is_m4lab_idp // 1 or 0 this.gitlabUserId = gitlabUserId this.verificationStatus = verificationStatus } // getter - get fullName() { + getFullName() { return this.firstName+' '+this.lastName } + getIdpStatus() { + return this.is_m4lab_idp + } + getGitlabUserId() { + return this.gitlabUserId + } + // setter + setEmail(email) { + this.email = email + } + setSalutation(salutation) { + this.salutation = salutation + } + setTitle(title) { + this.title = title + } + setFirstName(firstName) { + this.firstName = firstName + } + setLastName(lastName) { + this.lastName = lastName + } + setIndustry(industry) { + this.industry = industry + } + setOrganisation(organisation) { + this.organisation = organisation + } + setSpeciality(speciality) { + this.speciality = speciality + } + setM4lab_idp(m4lab_idp) { + this.m4lab_idp = m4lab_idp + } + setGitlabUserId(newGitlabUserId) { + this.gitlabUserId = newGitlabUserId + } + setVerificationStatus(verificationStatus) { + this.verificationStatus = verificationStatus + } } module.exports = User \ No newline at end of file diff --git a/classes/website.js b/classes/website.js new file mode 100644 index 00000000..28b2e391 --- /dev/null +++ b/classes/website.js @@ -0,0 +1,25 @@ +const Project = require("./project"); + +class Website extends Project { + constructor(ownerGitlabId, id, name, desc, logo, settingUrl, kontaktUrl) { + super(ownerGitlabId, id, name, desc, logo) + this.settingUrl = settingUrl + this.kontaktUrl = kontaktUrl + } + // getter + getSettingUrl() { + return this.settingUrl + } + getKontaktUrl() { + return this.kontaktUrl + } + // setter + setSettingUrl(newSettingUrl) { + this.settingUrl = newSettingUrl + } + setKontaktUrl(newKontaktUrl) { + this.kontaktUrl = newKontaktUrl + } +} + +module.exports = Website \ No newline at end of file -- GitLab From d3c7037382333081ffdbcf114c21c4ea5f11a4f3 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Thu, 11 Feb 2021 18:55:15 +0100 Subject: [PATCH 053/163] update contructor/getter/setter --- classes/user.js | 6 ++++++ classes/website.js | 6 +++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/classes/user.js b/classes/user.js index 6589fef8..8e14ba5f 100644 --- a/classes/user.js +++ b/classes/user.js @@ -15,6 +15,9 @@ class User { } // getter + getEmail() { + return this.email + } getFullName() { return this.firstName+' '+this.lastName } @@ -24,6 +27,9 @@ class User { getGitlabUserId() { return this.gitlabUserId } + getVerificationStatus() { + return this.verificationStatus + } // setter setEmail(email) { this.email = email diff --git a/classes/website.js b/classes/website.js index 28b2e391..2906e015 100644 --- a/classes/website.js +++ b/classes/website.js @@ -1,10 +1,11 @@ const Project = require("./project"); class Website extends Project { - constructor(ownerGitlabId, id, name, desc, logo, settingUrl, kontaktUrl) { + constructor(ownerGitlabId, id, name, desc, logo, settingUrl, kontaktUrl, isPublished) { super(ownerGitlabId, id, name, desc, logo) this.settingUrl = settingUrl this.kontaktUrl = kontaktUrl + this.isPublished = isPublished } // getter getSettingUrl() { @@ -13,6 +14,9 @@ class Website extends Project { getKontaktUrl() { return this.kontaktUrl } + getIsPublished() { + return this.isPublished + } // setter setSettingUrl(newSettingUrl) { this.settingUrl = newSettingUrl -- GitLab From 4990ada171c61ad54a40819874c393cf5b1285b0 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Thu, 11 Feb 2021 18:57:28 +0100 Subject: [PATCH 054/163] update createNewPages and add updateProject --- routes/gitlab.js | 62 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 50 insertions(+), 12 deletions(-) diff --git a/routes/gitlab.js b/routes/gitlab.js index 67b300a0..49e89807 100644 --- a/routes/gitlab.js +++ b/routes/gitlab.js @@ -27,15 +27,14 @@ var gitlab = { callback(res) }) }, - // todo: fixing callback - createNewPages: function(newPagesdata, callback) { + createNewPages: function(newPagesData, newLogoFile, callback) { let data = new formData() - data.append('avatar', fs.createReadStream(newPagesdata.avatar)) + data.append('avatar', fs.createReadStream(newLogoFile)) let dataConfig = { method: 'post', - url: 'https://transfer.hft-stuttgart.de/gitlab/api/v4/projects/user/'+newPagesdata.gitlabUserId+ - '?name='+newPagesdata.name+'&description='+newPagesdata.description+'&tag_list=website'+ + url: 'https://transfer.hft-stuttgart.de/gitlab/api/v4/projects/user/'+newPagesData.getOwnerGitlabId()+ + '?name='+newPagesData.getName()+'&description='+newPagesData.getDesc()+'&tag_list=website'+ '&use_custom_template=true&template_name=page_basic', headers: { 'Authorization': 'Bearer '+config.gitlab.token_readWriteProjects, @@ -45,13 +44,52 @@ var gitlab = { } axios(dataConfig) - .then(function (response) { - callback(response.data) + .then(response => { + let res = { + error: false, + data: response.data} + callback(res) + }) + .catch(err => { + console.log(err) + let res = { + error: true, + data: err.response.data} + callback(res) + }) + }, + updateProject: function(updatedProjectData, newLogoFile, callback){ + console.log(updatedProjectData) + let data = new formData() + if (newLogoFile) { + data.append('avatar', fs.createReadStream(newLogoFile)) + } + + let dataConfig = { + method: 'put', + url: 'https://transfer.hft-stuttgart.de/gitlab/api/v4/projects/'+updatedProjectData.getId()+ + '?name='+updatedProjectData.getName()+'&description='+updatedProjectData.getDesc(), + headers: { + 'Authorization': 'Bearer '+config.gitlab.token_readWriteProjects, + ...data.getHeaders() + }, + data : data + } + + axios(dataConfig) + .then(response => { + let res = { + error: false, + data: response.data} + callback(res) + }) + .catch(err => { + console.log(err) + let res = { + error: true, + data: err.response.data} + callback(res) }) - .catch(function (err) { - if(err) - callback(err.response.data) - }) }, getUserProjects: function(gitlabUserId, callback) { axios.get('https://transfer.hft-stuttgart.de/gitlab/api/v4/users/'+gitlabUserId+'/projects?private_token='+ @@ -65,7 +103,7 @@ var gitlab = { .catch(err => { let res = { error: true, - data: err} + data: err.message} callback(res) }) }, -- GitLab From a860c7ec388166073b2bfc1a91295a88564bfe3d Mon Sep 17 00:00:00 2001 From: Rosanny Date: Thu, 11 Feb 2021 18:58:24 +0100 Subject: [PATCH 055/163] rename a page --- .../{newPages.pug => newInformation.pug} | 70 ++++++++----------- 1 file changed, 28 insertions(+), 42 deletions(-) rename views/DE/account/{newPages.pug => newInformation.pug} (63%) diff --git a/views/DE/account/newPages.pug b/views/DE/account/newInformation.pug similarity index 63% rename from views/DE/account/newPages.pug rename to views/DE/account/newInformation.pug index 00f11d21..4b6c48a6 100644 --- a/views/DE/account/newPages.pug +++ b/views/DE/account/newInformation.pug @@ -4,8 +4,8 @@ html(lang="de") title= "Setup a new website" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") - link(rel="stylesheet", type="text/css", href="/css/m4lab.css") + link(rel="stylesheet", type="text/css", href="https://m4lab.hft-stuttgart.de/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="https://m4lab.hft-stuttgart.de/css/m4lab.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") body div(class="container") @@ -16,7 +16,7 @@ html(lang="de") ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") li(class="nav-item") a(class="nav-link pl-0 text-nowrap" href="/account/") - span(class="font-weight-bold" style="color:black;") #{user.firstName} #{user.lastName} + span(class="font-weight-bold" style="color:black;") #{user.fullName} li(class="nav-item") a(class="nav-link pl-0" href="/account/profile") i(class="fa fa-user fa-fw") @@ -35,15 +35,13 @@ html(lang="de") i(class="fa fa-sign-out-alt fa-fw") span(class="d-none d-md-inline") Logout main(class="col bg-faded py-3 flex-grow-1") - if successes - for success in successes - div.alert.alert-success.alert-dismissible #{ success } - a(class="close", href="#", data-dismiss="alert", aria-label="close") × - if errors - for error, i in errors - div.alert.alert-danger.alert-dismissible.fade.show #{ error } - a(class="close", href="#", data-dismiss="alert", aria-label="close") × - h3(class="pb-2") New Website + if flash.success + div.alert.alert-success.alert-dismissible #{flash.success} + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + if flash.error + div.alert.alert-danger.alert-dismissible.fade.show #{flash.error} + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + h3(class="pb-2") New Information div(class="mx-4") h4(class="pb-1") Step 1: Setup p Please fill-in all fields @@ -51,45 +49,33 @@ html(lang="de") div(class='form-group row') label(for="name", class="col-sm-2") Name div(class="col-sm-8") - input#name(name="name", type="text", class="form-control", value=project.name, placeholder="Name", maxlength="75" required) + input#name(name="name", type="text", class="form-control", placeholder="Name", maxlength="75" required) |

your website will be published on this URL: https://transfer.hft-stuttgart.de/pages/

div(class="form-group row") label(for="description", class="col-sm-2") Description div(class="col-sm-8") - textarea#description(name="description", type="text", class="form-control", placeholder="Description", maxlength="500" required) #{project.description} + textarea#description(name="description", type="text", class="form-control", placeholder="Description", maxlength="500" required) div(class="form-group row") label(for="logo", class="col-sm-2") Logo div(class="col-sm-8") - input#logo(name="logo", class="form-control-file", value=project.avatar, type="file" required) - input(type="submit", class="btn btn-primary", value="Set") + input#logo(name="logo", class="form-control-file", type="file" required) + input(type="submit", class="btn btn-primary", value="Submit") hr - if project.webUrl - div#step2(class="mx-4") - h4(class="pb-1") Step 2: Complete - //p Your website has been created, but not yet published. Please make sure you have completed the following before you publish your website. - p Please make sure you have completed the following before you publish your website. - ul - li project name, link, logo: setting.js - li contact person: kontakt.html - else - div#step2(class="mx-4", style="color: gray;") - h4(class="pb-1") Step 2: Complete - //p Your website has been created, but not yet published. Please make sure you have completed the following before you publish your website. - p Please make sure you have completed the following before you publish your website. - ul - li project name, link, logo: setting.js - li contact person: kontakt.html + div(class="mx-4", style="color: gray;") + h4(class="pb-1") Step 2: Complete + p Please make sure you have completed the following before you publish your website. + ul + li project name, link, logo: setting.js + li contact person: kontakt.html hr - if project.webUrl - div#step3(class="mx-4") - h4(class="pb-1") Step 3: Publish - p bla bla bla - input(type="submit", class="btn btn-primary", value="Publish") - else - div#step3(class="mx-4", style="color: gray;") - h4(class="pb-1") Step 3: Publish - p bla bla bla - input(type="submit", class="btn btn-primary", value="Publish" disabled) + div(class="mx-4", style="color: gray;") + h4(class="pb-1") Step 3: Publish + p The following request email will be sent to the Transferportal Admin to publish your new website/information: + table(class="table-secondary") + tr + td Guten Tag,

hiermit beantrage Ich die Freischaltung einer Webseite auf dem Transferportal für folgendes Projekt:
project-name.

Vielen Dank,
#{user.fullName} + br + input(type="submit", class="btn btn-primary", value="Send Request" disabled) // jQuery script(src="https://code.jquery.com/jquery-3.3.1.min.js") -- GitLab From 2b59b1269ec6f3a00a9db990393cb1a28745e273 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Thu, 11 Feb 2021 18:59:01 +0100 Subject: [PATCH 056/163] UI update --- views/DE/account/home.pug | 2 +- views/DE/account/services.pug | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/views/DE/account/home.pug b/views/DE/account/home.pug index 95898ac4..a12bd695 100644 --- a/views/DE/account/home.pug +++ b/views/DE/account/home.pug @@ -25,7 +25,7 @@ html(lang="de") ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") li(class="nav-item") a(class="nav-link pl-0 text-nowrap" href="#") - span(class="font-weight-bold" style="color:black;") #{user.firstname} #{user.lastname} + span(class="font-weight-bold" style="color:black;") #{user.fullName} li(class="nav-item") a(class="nav-link pl-0" href="/account/profile") i(class="fa fa-user fa-fw") diff --git a/views/DE/account/services.pug b/views/DE/account/services.pug index 305bf025..86f526dc 100644 --- a/views/DE/account/services.pug +++ b/views/DE/account/services.pug @@ -16,7 +16,7 @@ html(lang="de") ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") li(class="nav-item") a(class="nav-link pl-0 text-nowrap" href="/") - span(class="font-weight-bold" style="color:black;") #{user.firstname} #{user.lastname} + span(class="font-weight-bold" style="color:black;") #{user.fullName} li(class="nav-item") a(class="nav-link pl-0" href="/account/profile") i(class="fa fa-user fa-fw") @@ -49,17 +49,21 @@ html(lang="de") div(class="row pb-1") div(class="col font-weight-bold") Projektinformationen div(class="col text-right") - a(href="/newPages" class="btn btn-sm btn-success" role="button") New Information + a(href="/newInformation" class="btn btn-sm btn-success" role="button") New Information table(class="table") for item in gitlabPages - - var img = item.avatar_url + - let img = item.logo + - let editNewPageLink = "/account/updateInformation?id="+item.id tr td img(src=img, width="45", height="45") - td #{item.name} if item.isPublished + td + a(href=editNewPageLink+"&s=y" class="link-dark") #{item.name} td published else + td + a(href=editNewPageLink+"&s=n" class="link-dark") #{item.name} td not published yet div(class="container") div(class="row pb-1") @@ -68,7 +72,7 @@ html(lang="de") button(type="button", class="btn btn-sm btn-success") New Code and Data table(class="table") for item in gitlabRepos - - var img = item.avatar_url + - let img = item.logo tr td img(src=img, width="45", height="45") -- GitLab From f60fbdd97aec5d0b98fcf5de40b61c91d755c14d Mon Sep 17 00:00:00 2001 From: Rosanny Date: Thu, 11 Feb 2021 18:59:31 +0100 Subject: [PATCH 057/163] add a new page --- views/DE/account/updateInformation.pug | 118 +++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 views/DE/account/updateInformation.pug diff --git a/views/DE/account/updateInformation.pug b/views/DE/account/updateInformation.pug new file mode 100644 index 00000000..dbf7d5c9 --- /dev/null +++ b/views/DE/account/updateInformation.pug @@ -0,0 +1,118 @@ +doctype html +html(lang="de") + head + title= "Update a website" + meta(charset="UTF-8") + meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") + link(rel="stylesheet", type="text/css", href="https://m4lab.hft-stuttgart.de/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="https://m4lab.hft-stuttgart.de/css/m4lab.css") + link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") + body + div(class="container") + div(class="row min-vh-100 flex-column flex-md-row") + aside(class="col-12 col-md-3 p-0 flex-shrink-1") + nav(class="navbar navbar-expand flex-md-column flex-row align-items-start py-2") + div(class="collapse navbar-collapse") + ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") + li(class="nav-item") + a(class="nav-link pl-0 text-nowrap" href="/account/") + span(class="font-weight-bold" style="color:black;") #{user.fullName} + li(class="nav-item") + a(class="nav-link pl-0" href="/account/profile") + i(class="fa fa-user fa-fw") + span(class="d-none d-md-inline") Benutzerprofil + if user.m4lab_idp == 1 + li(class="nav-item") + a(class="nav-link pl-0" href="/account/security") + i(class="fa fa-lock fa-fw") + span(class="d-none d-md-inline") Sicherheitseinstellungen + li(class="nav-item") + a(class="nav-link pl-0" href="/account/services") + i(class="fa fa-tasks fa-fw" style="color:black;") + span(class="d-none d-md-inline" style="color:black;") Projekte und Dienste + li(class="nav-item") + a(class="nav-link pl-0" href="/logout" style="color:red;") + i(class="fa fa-sign-out-alt fa-fw") + span(class="d-none d-md-inline") Logout + main(class="col bg-faded py-3 flex-grow-1") + if flash.success + div.alert.alert-success.alert-dismissible #{flash.success} + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + if flash.error + div.alert.alert-danger.alert-dismissible.fade.show #{flash.error} + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + h3(class="pb-2") Update Information + div(class="mx-4") + if !information.isPublished + h4(class="pb-1") Step 1: Setup + p Please fill-in all fields + form(method="POST", encType="multipart/form-data") + div(class='form-group row') + label(for="name", class="col-sm-2") Name + div(class="col-sm-8") + input#name(name="name", type="text", class="form-control", value=information.name, placeholder="Name", maxlength="75" required) + |

your website will be published on this URL: https://transfer.hft-stuttgart.de/pages/

+ div(class="form-group row") + label(for="description", class="col-sm-2") Description + div(class="col-sm-8") + textarea#description(name="description", type="text", class="form-control", placeholder="Description", maxlength="500" required) #{information.desc} + div(class="form-group row") + label(for="logo", class="col-sm-2") Logo + div(class="col-sm-8") + div(class="form-group row") + img(src=information.logo, width="100" height="100") + div(class="form-group row") + input#logo(name="logo", class="form-control-file", type="file") + input(type="submit", class="btn btn-primary", value="Update") + hr + div(class="mx-4") + if !information.isPublished + h4(class="pb-1") Step 2: Complete + p Please make sure you have completed the following before you publish your website. + ul + li project name, link, logo: setting.js + li contact person: kontakt.html + else + p NOTE: + ul + li Some parameters(?) can be updated here: setting.js + li and the Contact Person here: kontakt.html + hr + div(class="mx-4") + if !information.isPublished + h4(class="pb-1") Step 3: Publish + p The following request email will be sent to the Transferportal Admin to publish your new website/information: + table(class="table-secondary") + tr + td Guten Tag,

hiermit beantrage Ich die Freischaltung einer Webseite auf dem Transferportal für folgendes Projekt:
#{information.name}

Vielen Dank,
#{user.fullName} + br + button(type="button", class="btn btn-primary", onclick="sendPublishRequest()") Send Request + + // jQuery + script(src="https://code.jquery.com/jquery-3.3.1.min.js") + script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous") + // Bootstrap + script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") + // M4_LAB + script(src="/js/headfoot.js") + script. + function showWebsiteURL() { + if ($("#name").val()) { + $("#nameInfo").show(); + let webName = $("#name").val().toLowerCase().replace(/\s/g, '-'); + document.getElementById("websiteName").innerText = webName; + } + else { + $("#nameInfo").hide() + } + } + $('#name').on('input',function(e){ + showWebsiteURL() + }) + showWebsiteURL() + + function sendPublishRequest() { + $.post("/sendPublishRequest", {projectName: $("#name").val()}, function(resp){ + alert(resp) + }) + } \ No newline at end of file -- GitLab From 8293a53e5c7df1b9634cc8e1ffe17d781ba14ea7 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Thu, 11 Feb 2021 19:07:26 +0100 Subject: [PATCH 058/163] update routes for creating/updating a website --- routes/routes-account.js | 471 +++++++++++++++++++++++---------------- 1 file changed, 277 insertions(+), 194 deletions(-) diff --git a/routes/routes-account.js b/routes/routes-account.js index ba892df8..157ecf62 100644 --- a/routes/routes-account.js +++ b/routes/routes-account.js @@ -12,12 +12,17 @@ const async = require('async') const crypto = require('crypto') const mailer = require('./mailer') const axios = require('axios') +const logoDir = 'public/upload/' +const tpGitlabURL = 'https://transfer.hft-stuttgart.de/gitlab/' -const myUser = require('../classes/user') -var loggedInUser +const portalUser = require('../classes/user') +const projectInformation = require('../classes/website') +const projectRepo = require('../classes/repo') module.exports = function (app, config, passport, i18n) { + var loggedInUser + // =========== PASSPORT ======= passport.serializeUser(function (user, done) { done(null, user); @@ -105,12 +110,6 @@ module.exports = function (app, config, passport, i18n) { // ======== APP ROUTES - ACCOUNT ==================== var updatePasswordMailSubject = "Ihr Passwort für das Transferportal wurde gespeichert." - // var mailSignature = "Mit den besten Grüßen,\ndas Transferportal-Team der HFT Stuttgart\n\n"+ - // "Transferportal der Hochschule für Technik Stuttgart\n"+ - // "Schellingstr. 24\n"+ - // "70174 Stuttgart\n"+ - // "m4lab@hft-stuttgart.de\n"+ - // "https://transfer.hft-stuttgart.de" var updatePasswordMailContent = '
Lieber Nutzer,

Ihr Passwort wurde erfolgreich geändert.

' + mailSignature + '
'; app.get('/', function (req, res) { @@ -119,29 +118,22 @@ module.exports = function (app, config, passport, i18n) { if (!err) { // Initialize user if (!loggedInUser) { - loggedInUser = new myUser() - loggedInUser.id = data.id - loggedInUser.email = req.user.email - loggedInUser.salutation = data.salutation - loggedInUser.title = data.title - loggedInUser.firstName = data.firstname - loggedInUser.lastName = data.lastname - loggedInUser.industry = data.industry - loggedInUser.organisation = data.organisation - loggedInUser.speciality = data.speciality - loggedInUser.m4lab_idp = data.m4lab_idp - loggedInUser.verificationStatus = data.verificationStatus - + loggedInUser = new portalUser( + data.id, req.user.email, data.salutation, data.title, data.firstname, data.lastname, data.industry, data.organisation, data.speciality, data.m4lab_idp, null, data.verificationStatus + ) methods.getGitlabId(data.id, function(gitlabUserId, err){ if(!err) { - loggedInUser.gitlabUserId = gitlabUserId + loggedInUser.setGitlabUserId(gitlabUserId) } - //console.log(loggedInUser) }) } + let userData = { + fullName: loggedInUser.getFullName(), + m4lab_idp: loggedInUser.getIdpStatus(), + verificationStatus: loggedInUser.getVerificationStatus()} res.render(lang+'/account/home', { - user: data + user: userData }); } }) @@ -181,6 +173,8 @@ module.exports = function (app, config, passport, i18n) { app.get('/profile', function (req, res) { if (req.isAuthenticated()) { + // RS: to be updated = get data from loggedinuser + console.log(loggedInUser) methods.getUserByEmail(req.user.email, function(data, err){ if (!err) { if (data.verificationStatus == 1) { @@ -202,39 +196,28 @@ module.exports = function (app, config, passport, i18n) { } }); - app.get('/services', function (req, res) { - if (req.isAuthenticated() && loggedInUser) { - if (loggedInUser.verificationStatus == 1) { + app.get('/services', function(req, res){ + if(!req.isAuthenticated() && !loggedInUser) { + res.redirect('/login') + } else { + let userData = { + fullName: loggedInUser.getFullName(), + m4lab_idp: loggedInUser.getIdpStatus()} + + if(loggedInUser.getVerificationStatus() != 1) { + res.render(lang+'/account/home', { + user: userData + }) + } else { let gitlabReposArr = [] let gitlabPagesArr = [] - let userData = { - firstname: loggedInUser.firstName, - lastname: loggedInUser.lastName, - m4lab_idp: loggedInUser.m4lab_idp} - if (loggedInUser.gitlabUserId) { - // GitLab is already activated for this user. Allow project creation. - /* - waterfall([ - function(callback){ - callback(null, 'one', 'two'); - }, - function(arg1, arg2, callback){ - callback(null, 'three'); - }, - function(arg1, callback){ - // arg1 now equals 'three' - callback(null, 'done'); - } - ], function (err, result) { - // result now equals 'done' - }); - */ + if(loggedInUser.getGitlabUserId()) { async.waterfall([ // check projects in runners function(callback) { let gitlabRunnersProjectIdsArr - gitlab.getProjectIdsFromRunners (loggedInUser.gitlabUserId, function(data){ + gitlab.getProjectIdsFromRunners(loggedInUser.getGitlabUserId(), function(data){ if(data.error) return res.status(500).send(data.data) gitlabRunnersProjectIdsArr = data.data @@ -243,7 +226,7 @@ module.exports = function (app, config, passport, i18n) { } ], function(err, gitlabRunnersProjectIdsArr) { // get user projects - gitlab.getUserProjects (loggedInUser.gitlabUserId, function(data){ + gitlab.getUserProjects (loggedInUser.getGitlabUserId(), function(data){ if (data.error) return res.status(500).send(data.data) let gitlabData = data.data @@ -251,22 +234,15 @@ module.exports = function (app, config, passport, i18n) { if (gitlabData[i].tag_list.includes('website')) { let idxRunners = gitlabRunnersProjectIdsArr.indexOf(gitlabData[i].id) let isWebsitePublished = false + //let isWebsitePublished = true if (idxRunners > 0) { isWebsitePublished = true } - let page = { - name: gitlabData[i].name, - description: gitlabData[i].description, - avatar_url: gitlabData[i].avatar_url, - web_url: gitlabData[i].web_url, - isPublished: isWebsitePublished} + let page = new projectInformation(loggedInUser.getGitlabUserId(), gitlabData[i].id, gitlabData[i].name, gitlabData[i].description, + gitlabData[i].avatar_url, null, null, isWebsitePublished) gitlabPagesArr.push(page) } else { - let repo = { - name: gitlabData[i].name, - description: gitlabData[i].description, - avatar_url: gitlabData[i].avatar_url, - web_url: gitlabData[i].web_url} + let repo = new projectRepo(loggedInUser.getGitlabUserId(), gitlabData[i].id, gitlabData[i].name, gitlabData[i].description, gitlabData[i].avatar_url) gitlabReposArr.push(repo) } } @@ -279,6 +255,7 @@ module.exports = function (app, config, passport, i18n) { }) }) } else { + // ========== to do next =================== gitlab.getUserIdByEmail(req.user.email, function(data){ if (!data.error) { let gitlabActivationData = { @@ -297,18 +274,13 @@ module.exports = function (app, config, passport, i18n) { } }) } - } else { - res.render(lang+'/account/home', { - user: data - }) } - } else { - res.redirect('/login') } }) app.get('/security', function (req, res) { if (req.isAuthenticated()) { + // RS: to be updated = get data from loggedinuser methods.getUserByEmail(req.user.email, function(data, err){ if (!err) { if (data.verificationStatus == 1 && data.m4lab_idp == 1) { @@ -343,15 +315,14 @@ module.exports = function (app, config, passport, i18n) { if (req.isAuthenticated()) { if (userData.email) { dbconn.user.query('UPDATE user SET ? WHERE email = "' +userData.email+'"', userData, function (err, rows, fields) { - //if (err) throw err; if (err) { - req.flash('error', "Failed"); + res.flash('error', "Failed") } else { - //req.flash('success', 'Profile updated!'); - req.flash('success', 'Ihr Benutzerprofil wurde aktualisiert!'); + res.flash('success', 'Ihr Benutzerprofil wurde aktualisiert!') } res.redirect('/account/profile'); + // RS: to be updated = update loggedinuser }) } } else { @@ -365,6 +336,7 @@ module.exports = function (app, config, passport, i18n) { var newPwd = req.body.inputNewPwd var retypePwd = req.body.inputConfirm + // RS: to be updated = get data from loggedinuser methods.getUserIdByEmail(req.user.email, function(userId, err) { if (!err) { // Load hashed passwd from DB @@ -386,15 +358,15 @@ module.exports = function (app, config, passport, i18n) { }) } else if (!isMatch) { - //req.flash('error', "Sorry, your password was incorrect. Please double-check your password.") - req.flash('error', "Das Passwort ist leider falsch. Bitte überprüfen Sie Ihre Eingabe.") + //res.flash('error', "Sorry, your password was incorrect. Please double-check your password.") + res.flash('error', "Das Passwort ist leider falsch. Bitte überprüfen Sie Ihre Eingabe.") //res.redirect('/security') res.redirect('/account/security') } else { if ( newPwd != retypePwd ) { - //req.flash('error', "Passwords do no match. Please make sure you re-type your new password correctly.") - req.flash('error', 'Passwörter stimmen nicht überein. Bitte stellen Sie sicher, dass Sie das Passwort beide Male genau gleich eingeben.') + //res.flash('error', "Passwords do no match. Please make sure you re-type your new password correctly.") + res.flash('error', 'Passwörter stimmen nicht überein. Bitte stellen Sie sicher, dass Sie das Passwort beide Male genau gleich eingeben.') res.redirect('/account/security') } else { @@ -407,13 +379,13 @@ module.exports = function (app, config, passport, i18n) { } methods.updateCredential(credentialData, function(err){ if (err) { - //req.flash('error', "Database error: Password cannot be modified.") - req.flash('error', "Datenbankfehler: Passwort kann nicht geändert werden.") + //res.flash('error', "Database error: Password cannot be modified.") + res.flash('error', "Datenbankfehler: Passwort kann nicht geändert werden.") throw err } else { - //req.flash('success', "Pasword updated!") - req.flash('success', "Passwort aktualisiert!") + //res.flash('success', "Pasword updated!") + res.flash('success', "Passwort aktualisiert!") mailer.options.to = req.user.email //mailOptions.subject = "Your M4_LAB Password has been updated." mailer.options.subject = updatePasswordMailSubject @@ -509,12 +481,12 @@ module.exports = function (app, config, passport, i18n) { } ], function(err) { if (err) { - //req.flash('error', 'An error occured. Please try again.'); - req.flash('error', 'Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut.'); + //res.flash('error', 'An error occured. Please try again.'); + res.flash('error', 'Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut.'); } else { - //req.flash('success', 'If your email is registered, an e-mail has been sent to ' + emailAddress + ' with further instructions.'); - req.flash('success', 'Wenn Ihre E-Mail-Adresse registriert ist, wurde eine E-Mail mit dem weiteren Vorgehen an ' + emailAddress + ' versendet.'); + //res.flash('success', 'If your email is registered, an e-mail has been sent to ' + emailAddress + ' with further instructions.'); + res.flash('success', 'Wenn Ihre E-Mail-Adresse registriert ist, wurde eine E-Mail mit dem weiteren Vorgehen an ' + emailAddress + ' versendet.'); } //res.redirect('/forgotPwd'); // deployment res.redirect('/account/forgotPwd'); // localhost @@ -524,8 +496,8 @@ module.exports = function (app, config, passport, i18n) { app.get('/reset/:token', function(req, res) { methods.getUserByToken(req.params.token, function(err, user){ if (!user) { - //req.flash('error', 'Password reset token is invalid or has expired.'); - req.flash('error', 'Der Schlüssel zum zurücksetzen des Passworts ist ungültig oder abgelaufen.'); + //res.flash('error', 'Password reset token is invalid or has expired.'); + res.flash('error', 'Der Schlüssel zum zurücksetzen des Passworts ist ungültig oder abgelaufen.'); //res.redirect('/forgotPwd'); // deployment res.redirect('/account/forgotPwd'); // deployment } @@ -549,13 +521,13 @@ module.exports = function (app, config, passport, i18n) { // update password methods.updateCredential(credentialData, function(err){ if (err) { - //req.flash('error', "Database error: Password cannot be modified.") - req.flash('error', "Datenbankfehler: Passwort kann nicht geändert werden.") + //res.flash('error', "Database error: Password cannot be modified.") + res.flash('error', "Datenbankfehler: Passwort kann nicht geändert werden.") throw err } else { - //req.flash('success', "Your pasword has been updated.") - req.flash('success', "Passwort aktualisiert!") + //res.flash('success', "Your pasword has been updated.") + res.flash('success', "Passwort aktualisiert!") // send notifiaction email mailer.options.to = user.email mailer.options.subject = updatePasswordMailSubject @@ -573,7 +545,7 @@ module.exports = function (app, config, passport, i18n) { }); } else { - req.flash('error', "User not found.") + res.flash('error', "User not found.") res.redirect('/login') } }); @@ -581,117 +553,226 @@ module.exports = function (app, config, passport, i18n) { }); // ============= NEW GITLAB PAGES =========================== - app.get('/newPages', function(req, res){ - if (req.isAuthenticated() && loggedInUser) { + + app.get('/newInformation', function(req, res){ + if (!req.isAuthenticated() && !loggedInUser) { + res.redirect('/login') + } else { let userData = { - firstName: loggedInUser.firstName, - lastName: loggedInUser.lastName, - m4lab_idp: loggedInUser.m4lab_idp - } - let projectData = { - name: null, - description: null, - avatar: null + fullName: loggedInUser.getFullName(), + m4lab_idp: loggedInUser.getIdpStatus() } - res.render(lang+'/account/newPages', { - user: userData, - project: projectData + res.render(lang+'/account/newInformation', { + user: userData }) } - else { - res.redirect('/login'); + }) + app.post('/newInformation', function(req, res) { + if(!req.isAuthenticated() && !loggedInUser) { + res.redirect('/login') + } else { + if (!req.body.name && !req.body.description) { + res.flash('error', 'Please provide the required data') + //res.redirect('/account/newInformation') + res.redirect('/newInformation') + } else { + let projectName = req.body.name.toLowerCase().replace(/\s/g, '-') + let projectDesc = req.body.description + let newInformation = new projectInformation(loggedInUser.getGitlabUserId(), null, projectName, projectDesc, null, null, null, false) + + if (!req.files) { + res.flash('error', 'Please choose a project logo') + //res.redirect('/account/newInformation') + res.redirect('/newInformation') + } else { + let newLogoFile = req.files.logo + async.waterfall([ + function(callback){ // upload logo + newLogoFile.mv(logoDir + newLogoFile.name, function(err) { + newLogoFile = logoDir+newLogoFile.name + callback(err, newLogoFile) + }) + }, + function(newLogoFile, callback){ // create a new GitLab Page + gitlab.createNewPages(newInformation, newLogoFile, function(data){ + let result = data.data + if (data.error) { + if(result.message.name == "has already been taken") { + res.flash("error", "Project name '"+newInformation.getName()+"' has already been taken, please choose another name.") + } else { + res.flash("error", "Something went wrong. Please try again.") + } + //res.redirect('/account/newInformation') + res.redirect('/newInformation') + } else { + newInformation.setId(result.id) + newInformation.setLogo(result.avatar_url) + newInformation.setSettingUrl(tpGitlabURL+result.namespace.path+'/'+result.name+'/-/edit/master/public/settings.js') + newInformation.setKontaktUrl(tpGitlabURL+result.namespace.path+'/'+result.name+'/-/edit/master/public/kontakt.html') + + res.flash("success", "Your website has been created, but not published yet. Please continue to Step 2 and Step 3 to have your new website published.") + //res.redirect('/account/updateInformation?id='+newInformation.getId()) + res.redirect('/updateInformation?id='+newInformation.getId()) + } + callback(null) + }) + } + ], function (err) { + if(err) console.log(err) + // remove logo + fs.unlink(newLogoFile, (err) => { + if(err) console.log(err) + }) + }) + } + } } }) - app.post('/newPages', function(req, res) { - if (req.isAuthenticated() && loggedInUser) { - if (req.files && req.body.name && req.body.description) { + app.get('/updateInformation', function(req, res){ + if(!req.isAuthenticated() && !loggedInUser) { + res.redirect('/login') + } else { + let userData = { + fullName: loggedInUser.getFullName(), + m4lab_idp: loggedInUser.getIdpStatus()} + + if(!req.query.id) { + res.redirect('/account/services') + } else { + gitlab.getUserProjects(loggedInUser.getGitlabUserId(), function(data){ + if (data.error) { + res.status(500).render(lang+'/500', { + error: data.data + }) + } else { + // quick way to decide whether a website is already published or not + let informationStatus + if(req.query.s != "y" && req.query.s != "n") { + res.redirect('/account/services') + } else { + if(req.query.s == "y") { + informationStatus = true + } else if(req.query.s == "n") { + informationStatus = false + } + let gitlabData = data.data + let curInformation = new projectInformation(loggedInUser.getGitlabUserId(), req.query.id, null, null, null, null, null, informationStatus) + for(let i = 0; i < gitlabData.length; i++){ + if (gitlabData[i].id == req.query.id) { + curInformation.setName(gitlabData[i].name) + curInformation.setDesc(gitlabData[i].description) + curInformation.setLogo(gitlabData[i].avatar_url) + curInformation.setSettingUrl(tpGitlabURL+gitlabData[i].namespace.path+'/'+gitlabData[i].name+'/-/edit/master/public/settings.js') + curInformation.setKontaktUrl(tpGitlabURL+gitlabData[i].namespace.path+'/'+gitlabData[i].name+'/-/edit/master/public/kontakt.html') + + break + } + } + res.render(lang+'/account/updateInformation', { + user: userData, + information: curInformation + }) + } + } + }) + } + } + }) + app.post('/updateInformation', function(req, res){ + if(!req.isAuthenticated() && !loggedInUser) { + res.redirect('/login') + } else { + if (!req.body.name && !req.body.description) { + res.flash('error', 'Please provide the required data') + //res.redirect('/account/updateInformation') + res.redirect('/updateInformation') + } else { let projectName = req.body.name.toLowerCase().replace(/\s/g, '-') let projectDesc = req.body.description - let projectAvatar = req.files.logo - let avatarDir = 'public/upload/' - - let userData = { - firstName: loggedInUser.firstName, - lastName: loggedInUser.lastName, - m4lab_idp: loggedInUser.m4lab_idp} + let updatedInformation = new projectInformation(loggedInUser.getGitlabUserId(), req.query.id, projectName, projectDesc, null, null, null, req.body.isPublished) + let newLogoFile async.waterfall([ - // upload avatar - function(done) { - projectAvatar.mv(avatarDir + projectAvatar.name, function(err) { - if (err) - return res.status(500).send(err) - console.log('avatar uploaded') - done(err) - }) + function(callback){ // upload logo + if(!req.files) { + callback(null, newLogoFile) + } else { + newLogoFile = req.files.logo + newLogoFile.mv(logoDir + newLogoFile.name, function(err) { + newLogoFile = logoDir + newLogoFile.name + callback(err, newLogoFile) + }) + } }, - // call gitlab - function(done) { - let newPagesData = { - gitlabUserId: loggedInUser.gitlabUserId, - name: projectName, - description: projectDesc, - avatar: avatarDir+projectAvatar.name} - gitlab.createNewPages(newPagesData, function(msg, err){ - if (err) { callback(err) } - else { - console.log(msg) - if(msg.message) { - if(msg.message.name == "has already been taken") { - let data = { - status: "error", - msg: "project name has already been taken, please choose another name"} - let projectData = { - name: projectName, - description: projectDesc, - avatar: projectAvatar} - - req.flash("error", data.msg) - res.render(lang+'/account/newPages', { - user: userData, - project: projectData - }) - } + function(newLogoFile, callback){ // update gitlab page + gitlab.updateProject(updatedInformation, newLogoFile, function(data){ + let result = data.data + if (data.error) { + if(result.message.name == "has already been taken") { + res.flash("error", "Project name has already been taken, please choose another name.") + } else { + res.flash("error", "Something went wrong. Please try again.") } - else { - let data = { - status: "success", - msg: "success"} - let projectData = { - name: projectName, - description: projectDesc, - avatar: projectAvatar, - webUrl: msg.web_url} - - req.flash("success", data.msg) - res.render(lang+'/account/newPages', { - user: userData, - project: projectData - }) - } + } else { + updatedInformation.setLogo(result.avatar_url) + updatedInformation.setSettingUrl(tpGitlabURL+result.namespace.path+'/'+result.name+'/-/edit/master/public/settings.js') + updatedInformation.setKontaktUrl(tpGitlabURL+result.namespace.path+'/'+result.name+'/-/edit/master/public/kontakt.html') + res.flash("success", "Your website has been updated") } - done(err) + //res.redirect('/account/updateInformation?id='+updatedInformation.getId()) + res.redirect('/updateInformation?id='+updatedInformation.getId()) + + callback(null) }) - }, - // delete avatar from /public/avatar - function(){ - fs.unlink(avatarDir+projectAvatar.name, (err) => { - if (err) throw err; - console.log('avatar is successfully deleted'); + } + ], function (err) { + if(err) console.log(err) + if(newLogoFile){ // remove logo + fs.unlink(newLogoFile, (err) => { + if(err) console.log(err) }) } - ]) - } - else { - console.log('Please provide the data') + }) } } - else { - res.redirect('/login'); + }) + + // RS: delete projektInformation? + + app.post('/sendPublishRequest', function(req, res) { + if (!req.isAuthenticated() && loggedInUser) { + res.redirect('/login') + } else { + let emailAddress = loggedInUser.getEmail() + let supportAddress = "support-transfer@hft-stuttgart.de" + //let supportAddress = "rosanny.sihombing@hft-stuttgart.de" + let projectName = req.body.projectName + let emailContent = "Guten Tag, \n\nhiermit beantrage Ich die Freischaltung einer Webseite auf dem Transferportal für folgendes Projekt: \n" + +projectName+"\n\nVielen Dank,\n"+loggedInUser.getFullName() + let emailSubject = "M4_LAB New Website Publish Request" + async.waterfall([ + function(done) { + mailer.options.to = supportAddress + mailer.options.cc = emailAddress + mailer.options.subject = emailSubject + mailer.options.text = emailContent + mailer.transport.sendMail(mailer.options, function(err) { + done(err, 'done') + }) + } + ], function(err) { + if (err) { + console.log(err) + res.send('Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut.') + } + else { + res.send('Vielen Dank für Ihre Anfrage. Eine Kopie Ihrer Anfrage wurde an ' + emailAddress + ' versandt.') + } + }) } }) - + // ============= NEW USERS REGISTRATION =========================== app.get('/registration', function(req, res) { res.render(lang+'/account/registration') @@ -717,8 +798,8 @@ module.exports = function (app, config, passport, i18n) { var emailDomain = userEmail.slice(pos, emailLength); if ( emailDomain.toLowerCase() == "@hft-stuttgart.de") { - req.flash('error', "Fehlgeschlagen: HFT-Account") - res.redirect('/account/registration'); + res.flash('error', "Fehlgeschlagen: HFT-Account") + res.redirect('/account/registration') } else { let token @@ -746,7 +827,7 @@ module.exports = function (app, config, passport, i18n) { function(newAccount, err) { methods.registerNewUser(newAccount, function(err){ if (err) { - req.flash('error', "Fehlgeschlagen") + res.flash('error', "Fehlgeschlagen") } else { // send email @@ -772,7 +853,7 @@ module.exports = function (app, config, passport, i18n) { } }) // user feedback - req.flash('success', 'Vielen Dank für Ihre Registrierung!'+'\r\n\r\n'+ + res.flash('success', 'Vielen Dank für Ihre Registrierung!'+'\r\n\r\n'+ 'Wir haben Ihnen eine E-Mail an Ihre verwendete Adresse gesendet. Diese enthält einen Link zur Bestätigung Ihres Accounts.'+'\r\n'+ 'Wenn Sie die Mail nicht in ihrem Postfach vorfinden, prüfen Sie bitte auch Ihren Spam-Ordner.') } @@ -784,6 +865,7 @@ module.exports = function (app, config, passport, i18n) { }) // ============= USER VERIFICATION ================================ + // RS: update loggedInUser status after successfull verification? app.get("/verifyAccount", function(req, res){ console.log(req.query) methods.getUserIdByVerificationToken(req.query.token, function(userId, err){ @@ -899,10 +981,10 @@ module.exports = function (app, config, passport, i18n) { }) app.get('/contact', function (req, res) { - res.render(lang+'/account/contact', { - user: req.user - }); - }); + res.render(lang+'/account/contact', { + user: req.user + }) + }) app.post('/contact', function(req, res, next) { //methods.currentDate(); @@ -925,13 +1007,14 @@ module.exports = function (app, config, passport, i18n) { } ], function(err) { if (err) { - req.flash('error', 'Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut.'); + res.flash('error', 'Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut.'); } else { - req.flash('success', 'Vielen Dank für Ihre Anfrage. Wir melden uns baldmöglichst bei Ihnen. Eine Kopie Ihrer Anfrage wurde an ' + emailAddress + ' versandt.'); + res.flash('success', 'Vielen Dank für Ihre Anfrage. Wir melden uns baldmöglichst bei Ihnen. Eine Kopie Ihrer Anfrage wurde an ' + emailAddress + ' versandt.'); } //res.redirect('/forgotPwd'); // deployment res.redirect('/account/contact'); // localhost - }); - }); -}; \ No newline at end of file + }) + }) + +} \ No newline at end of file -- GitLab From 8087d4b4c221b5087027bbb952b17e1a9370db97 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Fri, 12 Feb 2021 15:25:50 +0100 Subject: [PATCH 059/163] update UI --- views/DE/account/newInformation.pug | 6 +++--- views/DE/account/updateInformation.pug | 18 +++++++++++------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/views/DE/account/newInformation.pug b/views/DE/account/newInformation.pug index 4b6c48a6..838423dd 100644 --- a/views/DE/account/newInformation.pug +++ b/views/DE/account/newInformation.pug @@ -64,9 +64,9 @@ html(lang="de") div(class="mx-4", style="color: gray;") h4(class="pb-1") Step 2: Complete p Please make sure you have completed the following before you publish your website. - ul - li project name, link, logo: setting.js - li contact person: kontakt.html + ol + li Anpassen der Standardwerte in settings.js + li Anpassen der Kontaktperson in kontakt.html hr div(class="mx-4", style="color: gray;") h4(class="pb-1") Step 3: Publish diff --git a/views/DE/account/updateInformation.pug b/views/DE/account/updateInformation.pug index dbf7d5c9..4f42ca21 100644 --- a/views/DE/account/updateInformation.pug +++ b/views/DE/account/updateInformation.pug @@ -69,14 +69,18 @@ html(lang="de") if !information.isPublished h4(class="pb-1") Step 2: Complete p Please make sure you have completed the following before you publish your website. - ul - li project name, link, logo: setting.js - li contact person: kontakt.html else - p NOTE: - ul - li Some parameters(?) can be updated here: setting.js - li and the Contact Person here: kontakt.html + p NOTE: + div(class="card") + div(class="card-header") 1. Anpassen der Standardwerte in settings.js + div(class="card-body") Passen Sie die Werte für projektname und projektseitenlink an, indem Sie die entsprechenden Werte in die Anführungszeichen schreiben. + img(src="https://m4lab.hft-stuttgart.de/img/help/edit_settings.png", class="img-fluid", style="border: 1px solid gray;", alt="setting.js") + p Klicken Sie anschließend auf commit changes, um die Änderungen zu speichern. + div(class="card") + div(class="card-header") 2. Anpassen der Kontaktperson in kontakt.html + div(class="card-body") Passen Sie die Kontaktperson und die Mailadresse an, indem Sie alle Vorkommen von Max Mustermann und die Mailadresse durch Ihre Werte ersetzen. + img(src="https://m4lab.hft-stuttgart.de/img/help/edit_contact.png", class="img-fluid", style="border: 1px solid gray;", alt="kontakt.html") + p Klicken Sie anschließend auf commit changes, um die Änderungen zu speichern. hr div(class="mx-4") if !information.isPublished -- GitLab From fc9ff73803dfd5ea7a7276a39867595a9794ec75 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Fri, 12 Feb 2021 15:26:55 +0100 Subject: [PATCH 060/163] small UI updates --- views/DE/account/home.pug | 2 +- views/DE/account/profile.pug | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/views/DE/account/home.pug b/views/DE/account/home.pug index a12bd695..6a4f3863 100644 --- a/views/DE/account/home.pug +++ b/views/DE/account/home.pug @@ -25,7 +25,7 @@ html(lang="de") ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") li(class="nav-item") a(class="nav-link pl-0 text-nowrap" href="#") - span(class="font-weight-bold" style="color:black;") #{user.fullName} + span(class="font-weight-bold" style="color:black;") #{user.firstName} #{user.lastName} li(class="nav-item") a(class="nav-link pl-0" href="/account/profile") i(class="fa fa-user fa-fw") diff --git a/views/DE/account/profile.pug b/views/DE/account/profile.pug index fcb01429..be76107d 100644 --- a/views/DE/account/profile.pug +++ b/views/DE/account/profile.pug @@ -16,7 +16,7 @@ html(lang="de") ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") li(class="nav-item") a(class="nav-link pl-0 text-nowrap" href="/account/") - span(class="font-weight-bold" style="color:black;") #{user.firstname} #{user.lastname} + span(class="font-weight-bold" style="color:black;") #{user.firstName} #{user.lastName} li(class="nav-item") a(class="nav-link pl-0" href="/account/profile") i(class="fa fa-user fa-fw" style="color:black;") @@ -71,14 +71,14 @@ html(lang="de") } div(class='form-group col-md-2') label(for="firstname") Vorname - input#inputFirstname(name="inputFirstname", type="text", class="form-control", placeholder="Vorname", value=user.firstname, maxlength="45" required) + input#inputFirstname(name="inputFirstname", type="text", class="form-control", placeholder="Vorname", value=user.firstName, maxlength="45" required) div(class='form-group col-md-2') label(for="lastname") Nachname - input#inputLastname(name="inputLastname", type="text", class="form-control", placeholder="Nachname", value=user.lastname, maxlength="45" required) + input#inputLastname(name="inputLastname", type="text", class="form-control", placeholder="Nachname", value=user.lastName, maxlength="45" required) div(class="form-row") div(class='form-group col-md-8') label(for="email") E-mail Adresse - input#inputEmail(name="inputEmail", type="email", class="form-control", placeholder="Email", value=email, maxlength="45" required) + input#inputEmail(name="inputEmail", type="email", class="form-control", placeholder="Email", value=user.email, maxlength="45" required) div(class="form-row") div(class='form-group col-md-8') label(for="organisation") Unternehmen -- GitLab From 6836e43cc3a98de9e2761aa554d6b9a4ab7a0240 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Fri, 12 Feb 2021 22:28:22 +0100 Subject: [PATCH 061/163] clean up codes --- routes/routes-account.js | 320 ++++++++++++++------------------------- 1 file changed, 113 insertions(+), 207 deletions(-) diff --git a/routes/routes-account.js b/routes/routes-account.js index 157ecf62..fe64fd54 100644 --- a/routes/routes-account.js +++ b/routes/routes-account.js @@ -11,7 +11,6 @@ const salt = 64; // salt length const async = require('async') const crypto = require('crypto') const mailer = require('./mailer') -const axios = require('axios') const logoDir = 'public/upload/' const tpGitlabURL = 'https://transfer.hft-stuttgart.de/gitlab/' @@ -113,7 +112,9 @@ module.exports = function (app, config, passport, i18n) { var updatePasswordMailContent = '
Lieber Nutzer,

Ihr Passwort wurde erfolgreich geändert.

' + mailSignature + '
'; app.get('/', function (req, res) { - if (req.isAuthenticated()) { + if ( !req.isAuthenticated() ) { + res.redirect('/login') + } else { methods.getUserByEmail(req.user.email, function(data, err){ if (!err) { // Initialize user @@ -128,17 +129,11 @@ module.exports = function (app, config, passport, i18n) { }) } - let userData = { - fullName: loggedInUser.getFullName(), - m4lab_idp: loggedInUser.getIdpStatus(), - verificationStatus: loggedInUser.getVerificationStatus()} res.render(lang+'/account/home', { - user: userData + user: loggedInUser }); } }) - } else { - res.redirect('/login'); // localhost } }); @@ -172,47 +167,30 @@ module.exports = function (app, config, passport, i18n) { }); app.get('/profile', function (req, res) { - if (req.isAuthenticated()) { - // RS: to be updated = get data from loggedinuser - console.log(loggedInUser) - methods.getUserByEmail(req.user.email, function(data, err){ - if (!err) { - if (data.verificationStatus == 1) { - console.log(data) - res.render(lang+'/account/profile', { - user: data, - email: req.user.email - }) - } - else { - res.render(lang+'/account/home', { - user: data - }); - } - } - }) + if(!req.isAuthenticated() && !loggedInUser) { + res.redirect('/login') } else { - res.redirect('/login'); + if(loggedInUser.getVerificationStatus() != 1) { + res.redirect('/account/') + } else { + res.render(lang+'/account/profile', { + user: loggedInUser + }) + } } - }); + }) app.get('/services', function(req, res){ if(!req.isAuthenticated() && !loggedInUser) { res.redirect('/login') } else { - let userData = { - fullName: loggedInUser.getFullName(), - m4lab_idp: loggedInUser.getIdpStatus()} - - if(loggedInUser.getVerificationStatus() != 1) { - res.render(lang+'/account/home', { - user: userData - }) + if(loggedInUser.getVerificationStatus() != 1) { // unverified users + res.redirect('/account/') } else { let gitlabReposArr = [] let gitlabPagesArr = [] - if(loggedInUser.getGitlabUserId()) { + if(loggedInUser.getGitlabUserId()) { // for users who have activated their gitlab account async.waterfall([ // check projects in runners function(callback) { @@ -234,7 +212,6 @@ module.exports = function (app, config, passport, i18n) { if (gitlabData[i].tag_list.includes('website')) { let idxRunners = gitlabRunnersProjectIdsArr.indexOf(gitlabData[i].id) let isWebsitePublished = false - //let isWebsitePublished = true if (idxRunners > 0) { isWebsitePublished = true } @@ -248,29 +225,28 @@ module.exports = function (app, config, passport, i18n) { } res.render(lang+'/account/services', { - user: userData, + user: loggedInUser, gitlabRepos: gitlabReposArr, gitlabPages: gitlabPagesArr }) }) }) - } else { - // ========== to do next =================== - gitlab.getUserIdByEmail(req.user.email, function(data){ - if (!data.error) { + } else { // for users who have not activated their gitlab account yet + gitlab.getUserIdByEmail(loggedInUser.getEmail(), function(data){ + if (data.error) { + res.status(500).render(lang+'/500', { error: data.data }) + } else { let gitlabActivationData = { - user_id: loggedInUser.id, + user_id: loggedInUser.getId(), gitlab_userId: data.data} methods.addGitlabUser(gitlabActivationData, function(err){ - if(!err) { - loggedInUser.gitlabUserId = gitlabActivationData.gitlab_userId - res.redirect('/services') + if(err) { + res.status(500).render(lang+'/500', { error: err }) + } else { + loggedInUser.setGitlabUserId(gitlabActivationData.gitlab_userId) + res.redirect('/account/services') } }) - } else { - res.render(lang+'/account/services', { - user: userData - }) } }) } @@ -279,26 +255,18 @@ module.exports = function (app, config, passport, i18n) { }) app.get('/security', function (req, res) { - if (req.isAuthenticated()) { - // RS: to be updated = get data from loggedinuser - methods.getUserByEmail(req.user.email, function(data, err){ - if (!err) { - if (data.verificationStatus == 1 && data.m4lab_idp == 1) { - res.render(lang+'/account/security', { - user: data - }) - } - else { - res.render(lang+'/account/home', { - user: data - }); - } - } - }) + if (!req.isAuthenticated() && !loggedInUser) { + res.redirect('/login') } else { - res.redirect('/login'); + if(loggedInUser.getVerificationStatus() == 1 && loggedInUser.getIdpStatus() == 1) { + res.render(lang+'/account/security', { + user: loggedInUser + }) + } else { + res.redirect('/account/') + } } - }); + }) app.post('/updateProfile', function (req, res) { var userData = { @@ -312,104 +280,83 @@ module.exports = function (app, config, passport, i18n) { speciality: req.body.inputSpeciality, } - if (req.isAuthenticated()) { + if (!req.isAuthenticated() && !loggedInUser) { + res.redirect('/login') + } else { if (userData.email) { dbconn.user.query('UPDATE user SET ? WHERE email = "' +userData.email+'"', userData, function (err, rows, fields) { if (err) { res.flash('error', "Failed") } else { + loggedInUser.updateProfile(userData.salutation, userData.title, userData.firstname, userData.lastname, userData.email, + userData.organisation, userData.industry, userData.speciality) res.flash('success', 'Ihr Benutzerprofil wurde aktualisiert!') } res.redirect('/account/profile'); - // RS: to be updated = update loggedinuser }) } - } else { - res.redirect('/login'); } }); app.post('/changePwd', function (req, res) { - if (req.isAuthenticated()) { + if(!req.isAuthenticated() && !loggedInUser) { + res.redirect('/login') + } else { var currPwd = req.body.inputCurrPwd var newPwd = req.body.inputNewPwd var retypePwd = req.body.inputConfirm - // RS: to be updated = get data from loggedinuser - methods.getUserIdByEmail(req.user.email, function(userId, err) { - if (!err) { - // Load hashed passwd from DB - dbconn.user.query('SELECT password FROM credential WHERE user_id='+userId, function (err, rows, fields) { - if (err) { - console.error(err) - res.status(500).render(lang+'/500', { - error: err - }) - } - var userPwd = rows[0].password + // update - get userId from loggedInUser + dbconn.user.query('SELECT password FROM credential WHERE user_id='+loggedInUser.getId(), function (err, rows, fields) { + if (err) { + console.error(err) + res.status(500).render(lang+'/500', { error: err }) + } + var userPwd = rows[0].password - // check if the password is correct - bcrypt.compare(currPwd, userPwd, function(err, isMatch) { - if (err) { - console.error(err) - res.status(500).render(lang+'/500', { - error: err - }) - } - else if (!isMatch) { - //res.flash('error', "Sorry, your password was incorrect. Please double-check your password.") - res.flash('error', "Das Passwort ist leider falsch. Bitte überprüfen Sie Ihre Eingabe.") - //res.redirect('/security') - res.redirect('/account/security') - } - else { - if ( newPwd != retypePwd ) { - //res.flash('error', "Passwords do no match. Please make sure you re-type your new password correctly.") - res.flash('error', 'Passwörter stimmen nicht überein. Bitte stellen Sie sicher, dass Sie das Passwort beide Male genau gleich eingeben.') - res.redirect('/account/security') - } - else { - // update password - bcrypt.genSalt(saltRounds, function(err, salt) { - bcrypt.hash(newPwd, salt, function(err, hash) { - var credentialData = { - password: hash, - user_id: userId - } - methods.updateCredential(credentialData, function(err){ - if (err) { - //res.flash('error', "Database error: Password cannot be modified.") - res.flash('error', "Datenbankfehler: Passwort kann nicht geändert werden.") - throw err - } - else { - //res.flash('success', "Pasword updated!") - res.flash('success', "Passwort aktualisiert!") - mailer.options.to = req.user.email - //mailOptions.subject = "Your M4_LAB Password has been updated." - mailer.options.subject = updatePasswordMailSubject - mailer.options.html = updatePasswordMailContent - mailer.transport.sendMail(mailer.options, function(err) { - if (err) { - console.log(err) - } - }); - } - res.redirect('/account/security') - }) - }); - }); - } - } - }) + // check if the password is correct + bcrypt.compare(currPwd, userPwd, function(err, isMatch) { + if (err) { + console.error(err) + res.status(500).render(lang+'/500', { error: err }) + } else if (!isMatch) { + res.flash('error', "Das Passwort ist leider falsch. Bitte überprüfen Sie Ihre Eingabe.") + res.redirect('/account/security') + } else { + if ( newPwd != retypePwd ) { + res.flash('error', 'Passwörter stimmen nicht überein. Bitte stellen Sie sicher, dass Sie das Passwort beide Male genau gleich eingeben.') + res.redirect('/account/security') + } else { + // update password + bcrypt.genSalt(saltRounds, function(err, salt) { + bcrypt.hash(newPwd, salt, function(err, hash) { + var credentialData = { + password: hash, + user_id: userId + } + methods.updateCredential(credentialData, function(err){ + if (err) { + res.flash('error', "Datenbankfehler: Passwort kann nicht geändert werden.") + throw err + } else { + res.flash('success', "Passwort aktualisiert!") + mailer.options.to = req.user.email + mailer.options.subject = updatePasswordMailSubject + mailer.options.html = updatePasswordMailContent + mailer.transport.sendMail(mailer.options, function(err) { + if (err) { console.log(err) } + }); + } + res.redirect('/account/security') + }) + }); + }); + } + } }) - } }) } - else { - res.redirect('/login'); - } }); app.get('/forgotPwd', function (req, res) { @@ -419,14 +366,7 @@ module.exports = function (app, config, passport, i18n) { }); app.post('/forgotPwd', function(req, res, next) { - //methods.currentDate(); - - var emailAddress = req.body.inputEmail; - /* var emailContent = "Hi there,\n\n"+ - "we've received a request to reset your password. However, this email address is not on our database of registered users.\n\n"+ - "Thanks,\nM4_LAB Team"; - var emailSubject = "Account Access Attempted"; */ - + let emailAddress = req.body.inputEmail async.waterfall([ function(done) { crypto.randomBytes(20, function(err, buf) { @@ -438,17 +378,10 @@ module.exports = function (app, config, passport, i18n) { methods.checkUserEmail(emailAddress, function(err, user){ if (user) { console.log("email: user found"); - //var emailSubject = "M4_LAB Password Reset"; var emailSubject = "Ihre Passwort-Anfrage an das Transferportal der HFT Stuttgart"; - /* var emailContent = "Hi User,\n\n"+ - "we've received a request to reset your password. If you didn't make the request, just ignore this email.\n\n"+ - "Otherwise, you can reset your password using this link: http://m4lab.hft-stuttgart.de/account/reset/" + token + "\n" + - "This password reset is only valid for 1 hour.\n\n"+ - "Thanks,\nM4_LAB Team" */ // var emailContent = "Lieber Nutzer,\n\n"+ // "wir haben Ihre Anfrage zur Erneuerung Ihres Passwortes erhalten. Falls Sie diese Anfrage nicht gesendet haben, ignorieren Sie bitte diese E-Mail.\n\n"+ - // "Sie können Ihr Passwort mit dem Klick auf diesen Link ändern: http://m4lab.hft-stuttgart.de/account/reset/" + token + "\n" + // test server - // //"Sie können Ihr Passwort mit dem Klick auf diesen Link ändern: http://localhost:9989/reset/" + token + "\n" + // localhost + // "Sie können Ihr Passwort mit dem Klick auf diesen Link ändern: http://localhost:9989/reset/" + token + "\n" + // localhost // "Dieser Link ist aus Sicherheitsgründen nur für 1 Stunde gültig.\n\n"+mailSignature var emailContent = '
Lieber Nutzer, Varun

' + @@ -474,35 +407,29 @@ module.exports = function (app, config, passport, i18n) { }); } else { - //done(err, null, null); done(err, 'no user found'); } }); } ], function(err) { if (err) { - //res.flash('error', 'An error occured. Please try again.'); res.flash('error', 'Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut.'); } else { - //res.flash('success', 'If your email is registered, an e-mail has been sent to ' + emailAddress + ' with further instructions.'); res.flash('success', 'Wenn Ihre E-Mail-Adresse registriert ist, wurde eine E-Mail mit dem weiteren Vorgehen an ' + emailAddress + ' versendet.'); } - //res.redirect('/forgotPwd'); // deployment - res.redirect('/account/forgotPwd'); // localhost + res.redirect('/account/forgotPwd'); }); }); app.get('/reset/:token', function(req, res) { methods.getUserByToken(req.params.token, function(err, user){ if (!user) { - //res.flash('error', 'Password reset token is invalid or has expired.'); - res.flash('error', 'Der Schlüssel zum zurücksetzen des Passworts ist ungültig oder abgelaufen.'); - //res.redirect('/forgotPwd'); // deployment - res.redirect('/account/forgotPwd'); // deployment + res.flash('error', 'Der Schlüssel zum zurücksetzen des Passworts ist ungültig oder abgelaufen.') + res.redirect('/account/forgotPwd') } else { - res.render(lang+'/account/reset'); + res.render(lang+'/account/reset') } }); }); @@ -521,12 +448,10 @@ module.exports = function (app, config, passport, i18n) { // update password methods.updateCredential(credentialData, function(err){ if (err) { - //res.flash('error', "Database error: Password cannot be modified.") res.flash('error', "Datenbankfehler: Passwort kann nicht geändert werden.") throw err } else { - //res.flash('success', "Your pasword has been updated.") res.flash('success', "Passwort aktualisiert!") // send notifiaction email mailer.options.to = user.email @@ -558,12 +483,8 @@ module.exports = function (app, config, passport, i18n) { if (!req.isAuthenticated() && !loggedInUser) { res.redirect('/login') } else { - let userData = { - fullName: loggedInUser.getFullName(), - m4lab_idp: loggedInUser.getIdpStatus() - } res.render(lang+'/account/newInformation', { - user: userData + user: loggedInUser }) } }) @@ -573,8 +494,7 @@ module.exports = function (app, config, passport, i18n) { } else { if (!req.body.name && !req.body.description) { res.flash('error', 'Please provide the required data') - //res.redirect('/account/newInformation') - res.redirect('/newInformation') + res.redirect('/account/newInformation') } else { let projectName = req.body.name.toLowerCase().replace(/\s/g, '-') let projectDesc = req.body.description @@ -582,8 +502,7 @@ module.exports = function (app, config, passport, i18n) { if (!req.files) { res.flash('error', 'Please choose a project logo') - //res.redirect('/account/newInformation') - res.redirect('/newInformation') + res.redirect('/account/newInformation') } else { let newLogoFile = req.files.logo async.waterfall([ @@ -602,8 +521,7 @@ module.exports = function (app, config, passport, i18n) { } else { res.flash("error", "Something went wrong. Please try again.") } - //res.redirect('/account/newInformation') - res.redirect('/newInformation') + res.redirect('/account/newInformation') } else { newInformation.setId(result.id) newInformation.setLogo(result.avatar_url) @@ -611,8 +529,7 @@ module.exports = function (app, config, passport, i18n) { newInformation.setKontaktUrl(tpGitlabURL+result.namespace.path+'/'+result.name+'/-/edit/master/public/kontakt.html') res.flash("success", "Your website has been created, but not published yet. Please continue to Step 2 and Step 3 to have your new website published.") - //res.redirect('/account/updateInformation?id='+newInformation.getId()) - res.redirect('/updateInformation?id='+newInformation.getId()) + res.redirect('/account/updateInformation?id='+newInformation.getId()) } callback(null) }) @@ -633,18 +550,12 @@ module.exports = function (app, config, passport, i18n) { if(!req.isAuthenticated() && !loggedInUser) { res.redirect('/login') } else { - let userData = { - fullName: loggedInUser.getFullName(), - m4lab_idp: loggedInUser.getIdpStatus()} - if(!req.query.id) { res.redirect('/account/services') } else { gitlab.getUserProjects(loggedInUser.getGitlabUserId(), function(data){ if (data.error) { - res.status(500).render(lang+'/500', { - error: data.data - }) + res.status(500).render(lang+'/500', { error: data.data }) } else { // quick way to decide whether a website is already published or not let informationStatus @@ -670,7 +581,7 @@ module.exports = function (app, config, passport, i18n) { } } res.render(lang+'/account/updateInformation', { - user: userData, + user: loggedInUser, information: curInformation }) } @@ -685,8 +596,7 @@ module.exports = function (app, config, passport, i18n) { } else { if (!req.body.name && !req.body.description) { res.flash('error', 'Please provide the required data') - //res.redirect('/account/updateInformation') - res.redirect('/updateInformation') + res.redirect('/account/updateInformation') } else { let projectName = req.body.name.toLowerCase().replace(/\s/g, '-') let projectDesc = req.body.description @@ -720,9 +630,8 @@ module.exports = function (app, config, passport, i18n) { updatedInformation.setKontaktUrl(tpGitlabURL+result.namespace.path+'/'+result.name+'/-/edit/master/public/kontakt.html') res.flash("success", "Your website has been updated") } - //res.redirect('/account/updateInformation?id='+updatedInformation.getId()) - res.redirect('/updateInformation?id='+updatedInformation.getId()) - + res.redirect('/account/updateInformation?id='+updatedInformation.getId()) + callback(null) }) } @@ -746,7 +655,6 @@ module.exports = function (app, config, passport, i18n) { } else { let emailAddress = loggedInUser.getEmail() let supportAddress = "support-transfer@hft-stuttgart.de" - //let supportAddress = "rosanny.sihombing@hft-stuttgart.de" let projectName = req.body.projectName let emailContent = "Guten Tag, \n\nhiermit beantrage Ich die Freischaltung einer Webseite auf dem Transferportal für folgendes Projekt: \n" +projectName+"\n\nVielen Dank,\n"+loggedInUser.getFullName() @@ -865,7 +773,6 @@ module.exports = function (app, config, passport, i18n) { }) // ============= USER VERIFICATION ================================ - // RS: update loggedInUser status after successfull verification? app.get("/verifyAccount", function(req, res){ console.log(req.query) methods.getUserIdByVerificationToken(req.query.token, function(userId, err){ @@ -890,9 +797,6 @@ module.exports = function (app, config, passport, i18n) { else { // send email var emailSubject = "Herzlich willkommen" - // var emailContent = "Lieber Nutzer,\n\n"+ - // "herzlich willkommen beim Transferportal der HFT Stuttgart!\n"+ - // "Sie können nun alle Dienste des Portals nutzen.\n\n"+mailSignature var emailContent = '
Lieber Nutzer,

' + '

herzlich willkommen beim Transferportal der HFT Stuttgart!
' + 'Sie können nun alle Dienste des Portals nutzen.


' + mailSignature; @@ -908,6 +812,9 @@ module.exports = function (app, config, passport, i18n) { } }) + if(!loggedInUser) { + loggedInUser.setVerificationStatus(userData.verificationStatus) + } res.render(lang+'/account/verification', { status: true }); @@ -1012,8 +919,7 @@ module.exports = function (app, config, passport, i18n) { else { res.flash('success', 'Vielen Dank für Ihre Anfrage. Wir melden uns baldmöglichst bei Ihnen. Eine Kopie Ihrer Anfrage wurde an ' + emailAddress + ' versandt.'); } - //res.redirect('/forgotPwd'); // deployment - res.redirect('/account/contact'); // localhost + res.redirect('/account/contact') }) }) -- GitLab From 0b3430b40d275b65248ab6aeeb079a4798a19ca1 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Fri, 12 Feb 2021 22:29:09 +0100 Subject: [PATCH 062/163] add new functions --- classes/user.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/classes/user.js b/classes/user.js index 8e14ba5f..94f07edd 100644 --- a/classes/user.js +++ b/classes/user.js @@ -15,6 +15,9 @@ class User { } // getter + getId() { + return this.id + } getEmail() { return this.email } @@ -64,6 +67,17 @@ class User { setVerificationStatus(verificationStatus) { this.verificationStatus = verificationStatus } + + updateProfile(newSalutation, newTitle, newFirstname, newLastname, newEmail, newOrganisation, newIndustry, newSpeciality) { + this.salutation = newSalutation + this.title = newTitle + this.firstName = newFirstname + this.lastName = newLastname + this.email = newEmail + this.organisation = newOrganisation + this.industry = newIndustry + this.speciality = newSpeciality + } } module.exports = User \ No newline at end of file -- GitLab From 12318b8d358d89d7ed0c71fc20e6c00b384e4cac Mon Sep 17 00:00:00 2001 From: Rosanny Date: Fri, 12 Feb 2021 22:34:12 +0100 Subject: [PATCH 063/163] update UI --- views/DE/account/home.pug | 2 +- views/DE/account/newInformation.pug | 8 ++++---- views/DE/account/profile.pug | 2 +- views/DE/account/security.pug | 2 +- views/DE/account/services.pug | 12 ++++++------ views/DE/account/updateInformation.pug | 8 ++++---- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/views/DE/account/home.pug b/views/DE/account/home.pug index 6a4f3863..104778eb 100644 --- a/views/DE/account/home.pug +++ b/views/DE/account/home.pug @@ -30,7 +30,7 @@ html(lang="de") a(class="nav-link pl-0" href="/account/profile") i(class="fa fa-user fa-fw") span(class="d-none d-md-inline") Benutzerprofil - if user.m4lab_idp == 1 + if user.is_m4lab_idp li(class="nav-item") a(class="nav-link pl-0" href="/account/security") i(class="fa fa-lock fa-fw") diff --git a/views/DE/account/newInformation.pug b/views/DE/account/newInformation.pug index 838423dd..8a862dfb 100644 --- a/views/DE/account/newInformation.pug +++ b/views/DE/account/newInformation.pug @@ -4,8 +4,8 @@ html(lang="de") title= "Setup a new website" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://m4lab.hft-stuttgart.de/css/bootstrap.min.css") - link(rel="stylesheet", type="text/css", href="https://m4lab.hft-stuttgart.de/css/m4lab.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") body div(class="container") @@ -16,12 +16,12 @@ html(lang="de") ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") li(class="nav-item") a(class="nav-link pl-0 text-nowrap" href="/account/") - span(class="font-weight-bold" style="color:black;") #{user.fullName} + span(class="font-weight-bold" style="color:black;") #{user.firstName} #{user.lastName} li(class="nav-item") a(class="nav-link pl-0" href="/account/profile") i(class="fa fa-user fa-fw") span(class="d-none d-md-inline") Benutzerprofil - if user.m4lab_idp == 1 + if user.is_m4lab_idp li(class="nav-item") a(class="nav-link pl-0" href="/account/security") i(class="fa fa-lock fa-fw") diff --git a/views/DE/account/profile.pug b/views/DE/account/profile.pug index be76107d..a7c6f99f 100644 --- a/views/DE/account/profile.pug +++ b/views/DE/account/profile.pug @@ -21,7 +21,7 @@ html(lang="de") a(class="nav-link pl-0" href="/account/profile") i(class="fa fa-user fa-fw" style="color:black;") span(class="d-none d-md-inline" style="color:black;") Benutzerprofil - if user.m4lab_idp == 1 + if user.is_m4lab_idp li(class="nav-item") a(class="nav-link pl-0" href="/account/security") i(class="fa fa-lock fa-fw") diff --git a/views/DE/account/security.pug b/views/DE/account/security.pug index 60dbd2be..55e0494f 100644 --- a/views/DE/account/security.pug +++ b/views/DE/account/security.pug @@ -20,7 +20,7 @@ html(lang="de") ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") li(class="nav-item") a(class="nav-link pl-0 text-nowrap" href="/account/") - span(class="font-weight-bold" style="color:black;") #{user.firstname} #{user.lastname} + span(class="font-weight-bold" style="color:black;") #{user.firstName} #{user.lastName} li(class="nav-item") a(class="nav-link pl-0" href="/account/profile") i(class="fa fa-user fa-fw") diff --git a/views/DE/account/services.pug b/views/DE/account/services.pug index 86f526dc..4d678f8b 100644 --- a/views/DE/account/services.pug +++ b/views/DE/account/services.pug @@ -4,8 +4,8 @@ html(lang="de") title= "User Profile" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://m4lab.hft-stuttgart.de/css/bootstrap.min.css") - link(rel="stylesheet", type="text/css", href="https://m4lab.hft-stuttgart.de/css/m4lab.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") body div(class="container") @@ -16,12 +16,12 @@ html(lang="de") ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") li(class="nav-item") a(class="nav-link pl-0 text-nowrap" href="/") - span(class="font-weight-bold" style="color:black;") #{user.fullName} + span(class="font-weight-bold" style="color:black;") #{user.firstName} #{user.lastName} li(class="nav-item") a(class="nav-link pl-0" href="/account/profile") i(class="fa fa-user fa-fw") span(class="d-none d-md-inline") Benutzerprofil - if user.m4lab_idp == 1 + if user.is_m4lab_idp li(class="nav-item") a(class="nav-link pl-0" href="/account/security") i(class="fa fa-lock fa-fw") @@ -49,7 +49,7 @@ html(lang="de") div(class="row pb-1") div(class="col font-weight-bold") Projektinformationen div(class="col text-right") - a(href="/newInformation" class="btn btn-sm btn-success" role="button") New Information + a(href="/account/newInformation" class="btn btn-sm btn-success" role="button") New Information table(class="table") for item in gitlabPages - let img = item.logo @@ -69,7 +69,7 @@ html(lang="de") div(class="row pb-1") div(class="col font-weight-bold") Projektcode und -daten div(class="col text-right") - button(type="button", class="btn btn-sm btn-success") New Code and Data + button(type="button", class="btn btn-sm btn-success" disabled) New Code and Data table(class="table") for item in gitlabRepos - let img = item.logo diff --git a/views/DE/account/updateInformation.pug b/views/DE/account/updateInformation.pug index 4f42ca21..45602d05 100644 --- a/views/DE/account/updateInformation.pug +++ b/views/DE/account/updateInformation.pug @@ -4,8 +4,8 @@ html(lang="de") title= "Update a website" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") - link(rel="stylesheet", type="text/css", href="https://m4lab.hft-stuttgart.de/css/bootstrap.min.css") - link(rel="stylesheet", type="text/css", href="https://m4lab.hft-stuttgart.de/css/m4lab.css") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab.css") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") body div(class="container") @@ -16,12 +16,12 @@ html(lang="de") ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") li(class="nav-item") a(class="nav-link pl-0 text-nowrap" href="/account/") - span(class="font-weight-bold" style="color:black;") #{user.fullName} + span(class="font-weight-bold" style="color:black;") #{user.firstName} #{user.lastName} li(class="nav-item") a(class="nav-link pl-0" href="/account/profile") i(class="fa fa-user fa-fw") span(class="d-none d-md-inline") Benutzerprofil - if user.m4lab_idp == 1 + if user.is_m4lab_idp li(class="nav-item") a(class="nav-link pl-0" href="/account/security") i(class="fa fa-lock fa-fw") -- GitLab From e4ba2b558bed29e94430c1a9b426e76228031f49 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Thu, 18 Feb 2021 19:59:48 +0100 Subject: [PATCH 064/163] fix path issue --- routes/routes-account.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routes/routes-account.js b/routes/routes-account.js index fe64fd54..b40246c2 100644 --- a/routes/routes-account.js +++ b/routes/routes-account.js @@ -574,8 +574,8 @@ module.exports = function (app, config, passport, i18n) { curInformation.setName(gitlabData[i].name) curInformation.setDesc(gitlabData[i].description) curInformation.setLogo(gitlabData[i].avatar_url) - curInformation.setSettingUrl(tpGitlabURL+gitlabData[i].namespace.path+'/'+gitlabData[i].name+'/-/edit/master/public/settings.js') - curInformation.setKontaktUrl(tpGitlabURL+gitlabData[i].namespace.path+'/'+gitlabData[i].name+'/-/edit/master/public/kontakt.html') + curInformation.setSettingUrl(tpGitlabURL+gitlabData[i].path_with_namespace+'/-/edit/master/public/settings.js') + curInformation.setKontaktUrl(tpGitlabURL+gitlabData[i].path_with_namespace+'/-/edit/master/public/kontakt.html') break } -- GitLab From 0bd70889d7940f4f92b49c573913cf644939003b Mon Sep 17 00:00:00 2001 From: Rosanny Date: Wed, 3 Mar 2021 15:03:00 +0100 Subject: [PATCH 065/163] add German wordings --- routes/routes-account.js | 28 ++++++++++-------- views/DE/account/newInformation.pug | 34 +++++++++++++--------- views/DE/account/services.pug | 10 +++---- views/DE/account/updateInformation.pug | 40 ++++++++++++++++---------- 4 files changed, 66 insertions(+), 46 deletions(-) diff --git a/routes/routes-account.js b/routes/routes-account.js index b40246c2..16f38832 100644 --- a/routes/routes-account.js +++ b/routes/routes-account.js @@ -493,7 +493,7 @@ module.exports = function (app, config, passport, i18n) { res.redirect('/login') } else { if (!req.body.name && !req.body.description) { - res.flash('error', 'Please provide the required data') + res.flash('error', 'Bitte geben Sie die benötigten Daten ein') res.redirect('/account/newInformation') } else { let projectName = req.body.name.toLowerCase().replace(/\s/g, '-') @@ -501,7 +501,7 @@ module.exports = function (app, config, passport, i18n) { let newInformation = new projectInformation(loggedInUser.getGitlabUserId(), null, projectName, projectDesc, null, null, null, false) if (!req.files) { - res.flash('error', 'Please choose a project logo') + res.flash('error', 'Bitte geben Sie ein Projektlogo an.') res.redirect('/account/newInformation') } else { let newLogoFile = req.files.logo @@ -517,9 +517,9 @@ module.exports = function (app, config, passport, i18n) { let result = data.data if (data.error) { if(result.message.name == "has already been taken") { - res.flash("error", "Project name '"+newInformation.getName()+"' has already been taken, please choose another name.") + res.flash("error", "Der Projektname '"+newInformation.getName()+"' ist bereits vergeben, bitte wählen Sie einen anderen Namen.") } else { - res.flash("error", "Something went wrong. Please try again.") + res.flash("error", "Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut. ") } res.redirect('/account/newInformation') } else { @@ -527,9 +527,9 @@ module.exports = function (app, config, passport, i18n) { newInformation.setLogo(result.avatar_url) newInformation.setSettingUrl(tpGitlabURL+result.namespace.path+'/'+result.name+'/-/edit/master/public/settings.js') newInformation.setKontaktUrl(tpGitlabURL+result.namespace.path+'/'+result.name+'/-/edit/master/public/kontakt.html') - - res.flash("success", "Your website has been created, but not published yet. Please continue to Step 2 and Step 3 to have your new website published.") - res.redirect('/account/updateInformation?id='+newInformation.getId()) + + res.flash("success", "Ihre Webseite wurde erstellt, aber noch nicht veröffentlicht. Bitte fahren Sie mit Schritten 2 und 3 fort, um Ihre Webseite zu veröffentlichen.") + res.redirect('/account/updateInformation?id='+newInformation.getId()+'&s=n') } callback(null) }) @@ -595,12 +595,16 @@ module.exports = function (app, config, passport, i18n) { res.redirect('/login') } else { if (!req.body.name && !req.body.description) { - res.flash('error', 'Please provide the required data') + res.flash('error', 'Bitte geben Sie die benötigten Daten ein') res.redirect('/account/updateInformation') } else { let projectName = req.body.name.toLowerCase().replace(/\s/g, '-') let projectDesc = req.body.description - let updatedInformation = new projectInformation(loggedInUser.getGitlabUserId(), req.query.id, projectName, projectDesc, null, null, null, req.body.isPublished) + let isProjectPublished = true + if (req.body.isPublished == "false") { + isProjectPublished = false + } + let updatedInformation = new projectInformation(loggedInUser.getGitlabUserId(), req.query.id, projectName, projectDesc, null, null, null, isProjectPublished) let newLogoFile async.waterfall([ @@ -620,9 +624,9 @@ module.exports = function (app, config, passport, i18n) { let result = data.data if (data.error) { if(result.message.name == "has already been taken") { - res.flash("error", "Project name has already been taken, please choose another name.") + res.flash("error", "Der Projektname ist bereits vergeben, bitte wählen Sie einen anderen Namen.") } else { - res.flash("error", "Something went wrong. Please try again.") + res.flash("error", "Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut. ") } } else { updatedInformation.setLogo(result.avatar_url) @@ -658,7 +662,7 @@ module.exports = function (app, config, passport, i18n) { let projectName = req.body.projectName let emailContent = "Guten Tag, \n\nhiermit beantrage Ich die Freischaltung einer Webseite auf dem Transferportal für folgendes Projekt: \n" +projectName+"\n\nVielen Dank,\n"+loggedInUser.getFullName() - let emailSubject = "M4_LAB New Website Publish Request" + let emailSubject = "M4_LAB Anfrage zur Veröffentlichung einer neuen Webseite" async.waterfall([ function(done) { mailer.options.to = supportAddress diff --git a/views/DE/account/newInformation.pug b/views/DE/account/newInformation.pug index 8a862dfb..beec7f09 100644 --- a/views/DE/account/newInformation.pug +++ b/views/DE/account/newInformation.pug @@ -41,45 +41,47 @@ html(lang="de") if flash.error div.alert.alert-danger.alert-dismissible.fade.show #{flash.error} a(class="close", href="#", data-dismiss="alert", aria-label="close") × - h3(class="pb-2") New Information + h3(class="pb-2") Neue Projektinformation div(class="mx-4") - h4(class="pb-1") Step 1: Setup - p Please fill-in all fields + h4(class="pb-1") Schritt 1: Setup + p Bitte füllen Sie alle Felder aus form(method="POST", encType="multipart/form-data") div(class='form-group row') label(for="name", class="col-sm-2") Name div(class="col-sm-8") input#name(name="name", type="text", class="form-control", placeholder="Name", maxlength="75" required) - |

your website will be published on this URL: https://transfer.hft-stuttgart.de/pages/

+ |

Ihre Webseite wird unter folgender URL veröffentlicht: https://transfer.hft-stuttgart.de/pages/

div(class="form-group row") - label(for="description", class="col-sm-2") Description + label(for="description", class="col-sm-2") Beschreibung div(class="col-sm-8") - textarea#description(name="description", type="text", class="form-control", placeholder="Description", maxlength="500" required) + textarea#description(name="description", type="text", class="form-control", placeholder="Beschreibung", maxlength="500" required) div(class="form-group row") - label(for="logo", class="col-sm-2") Logo + label(for="logo", class="col-sm-2") Projektlogo div(class="col-sm-8") input#logo(name="logo", class="form-control-file", type="file" required) - input(type="submit", class="btn btn-primary", value="Submit") + input(type="submit", class="btn btn-primary", value="Senden") hr div(class="mx-4", style="color: gray;") - h4(class="pb-1") Step 2: Complete - p Please make sure you have completed the following before you publish your website. + h4(class="pb-1") Schritt 2: Dateneingabe + p Bitte stellen Sie sicher, dass sie Folgendes abgeschlossen haben, bevor Sie Ihre Webseite veröffentlichen: ol li Anpassen der Standardwerte in settings.js li Anpassen der Kontaktperson in kontakt.html hr div(class="mx-4", style="color: gray;") - h4(class="pb-1") Step 3: Publish - p The following request email will be sent to the Transferportal Admin to publish your new website/information: + h4(class="pb-1") Schritt 3: Veröffentlichen + p Folgende Anfrage wird an die Administration des Transferportal gesandt, um ihre Webseite/ Informationsseite zu veröffentlichen: table(class="table-secondary") tr td Guten Tag,

hiermit beantrage Ich die Freischaltung einer Webseite auf dem Transferportal für folgendes Projekt:
project-name.

Vielen Dank,
#{user.fullName} br - input(type="submit", class="btn btn-primary", value="Send Request" disabled) + input(type="submit", class="btn btn-primary", value="Nachricht versenden" disabled) // jQuery script(src="https://code.jquery.com/jquery-3.3.1.min.js") script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous") + // jquery-loading-overlay + script(src="https://cdn.jsdelivr.net/npm/gasparesganga-jquery-loading-overlay@2.1.7/dist/loadingoverlay.min.js") // Bootstrap script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") // M4_LAB @@ -98,4 +100,8 @@ html(lang="de") $('#name').on('input',function(e){ showWebsiteURL(); }) - showWebsiteURL(); \ No newline at end of file + showWebsiteURL(); + + $("form").submit(function(){ + $.LoadingOverlay("show") + }); \ No newline at end of file diff --git a/views/DE/account/services.pug b/views/DE/account/services.pug index 4d678f8b..f1a08b61 100644 --- a/views/DE/account/services.pug +++ b/views/DE/account/services.pug @@ -49,7 +49,7 @@ html(lang="de") div(class="row pb-1") div(class="col font-weight-bold") Projektinformationen div(class="col text-right") - a(href="/account/newInformation" class="btn btn-sm btn-success" role="button") New Information + a(href="/account/newInformation" class="btn btn-sm btn-success" role="button") Neue Projektinformation table(class="table") for item in gitlabPages - let img = item.logo @@ -60,16 +60,16 @@ html(lang="de") if item.isPublished td a(href=editNewPageLink+"&s=y" class="link-dark") #{item.name} - td published + td veröffentlicht else td a(href=editNewPageLink+"&s=n" class="link-dark") #{item.name} - td not published yet + td noch nicht veröffentlicht div(class="container") div(class="row pb-1") div(class="col font-weight-bold") Projektcode und -daten div(class="col text-right") - button(type="button", class="btn btn-sm btn-success" disabled) New Code and Data + button(type="button", class="btn btn-sm btn-success" disabled) Neuer Projektdatensatz table(class="table") for item in gitlabRepos - let img = item.logo @@ -79,7 +79,7 @@ html(lang="de") td #{item.name} else p - | Please login to gitlab to activate your access, and then refresh this page. + | Bitte melden Sie sich an der Gitlab-Instanz an, um Ihren Zugang zu aktivieren, und aktualisieren Sie diese Seite. // jQuery script(src="https://code.jquery.com/jquery-3.3.1.min.js") diff --git a/views/DE/account/updateInformation.pug b/views/DE/account/updateInformation.pug index 45602d05..c525c14c 100644 --- a/views/DE/account/updateInformation.pug +++ b/views/DE/account/updateInformation.pug @@ -41,36 +41,40 @@ html(lang="de") if flash.error div.alert.alert-danger.alert-dismissible.fade.show #{flash.error} a(class="close", href="#", data-dismiss="alert", aria-label="close") × - h3(class="pb-2") Update Information + h3(class="pb-2") Information aktualisieren div(class="mx-4") if !information.isPublished - h4(class="pb-1") Step 1: Setup - p Please fill-in all fields + h4(class="pb-1") Schritt 1: Setup + p Bitte füllen Sie alle Felder aus form(method="POST", encType="multipart/form-data") div(class='form-group row') label(for="name", class="col-sm-2") Name div(class="col-sm-8") input#name(name="name", type="text", class="form-control", value=information.name, placeholder="Name", maxlength="75" required) - |

your website will be published on this URL: https://transfer.hft-stuttgart.de/pages/

+ |

Ihre Webseite wird unter folgender URL veröffentlicht: https://transfer.hft-stuttgart.de/pages/

div(class="form-group row") - label(for="description", class="col-sm-2") Description + label(for="description", class="col-sm-2") Beschreibung div(class="col-sm-8") - textarea#description(name="description", type="text", class="form-control", placeholder="Description", maxlength="500" required) #{information.desc} + textarea#description(name="description", type="text", class="form-control", placeholder="Beschreibung", maxlength="500" required) #{information.desc} div(class="form-group row") - label(for="logo", class="col-sm-2") Logo + label(for="logo", class="col-sm-2") Projektlogo div(class="col-sm-8") div(class="form-group row") img(src=information.logo, width="100" height="100") div(class="form-group row") input#logo(name="logo", class="form-control-file", type="file") - input(type="submit", class="btn btn-primary", value="Update") + if !information.isPublished + input(name="isPublished", type="hidden", value="false") + else + input(name="isPublished", type="hidden", value="true") + input(type="submit", class="btn btn-primary", value="Speichern") hr div(class="mx-4") if !information.isPublished - h4(class="pb-1") Step 2: Complete - p Please make sure you have completed the following before you publish your website. + h4(class="pb-1") Schritt 2: Dateneingabe + p Bitte stellen Sie sicher, dass sie Folgendes abgeschlossen haben, bevor Sie Ihre Webseite veröffentlichen: else - p NOTE: + p ANMERKUNG: div(class="card") div(class="card-header") 1. Anpassen der Standardwerte in settings.js div(class="card-body") Passen Sie die Werte für projektname und projektseitenlink an, indem Sie die entsprechenden Werte in die Anführungszeichen schreiben. @@ -84,17 +88,19 @@ html(lang="de") hr div(class="mx-4") if !information.isPublished - h4(class="pb-1") Step 3: Publish - p The following request email will be sent to the Transferportal Admin to publish your new website/information: + h4(class="pb-1") Schritt 3: Veröffentlichen + p Folgende Anfrage wird an die Administration des Transferportal gesandt, um ihre Webseite/ Informationsseite zu veröffentlichen: table(class="table-secondary") tr td Guten Tag,

hiermit beantrage Ich die Freischaltung einer Webseite auf dem Transferportal für folgendes Projekt:
#{information.name}

Vielen Dank,
#{user.fullName} br - button(type="button", class="btn btn-primary", onclick="sendPublishRequest()") Send Request + button(type="button", class="btn btn-primary", onclick="sendPublishRequest()") Nachricht versenden // jQuery script(src="https://code.jquery.com/jquery-3.3.1.min.js") script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous") + // jquery-loading-overlay + script(src="https://cdn.jsdelivr.net/npm/gasparesganga-jquery-loading-overlay@2.1.7/dist/loadingoverlay.min.js") // Bootstrap script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") // M4_LAB @@ -119,4 +125,8 @@ html(lang="de") $.post("/sendPublishRequest", {projectName: $("#name").val()}, function(resp){ alert(resp) }) - } \ No newline at end of file + } + + $("form").submit(function(){ + $.LoadingOverlay("show") + }); \ No newline at end of file -- GitLab From 6d2c45affc227702581dc69830e5569c9a01c8e6 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Wed, 3 Mar 2021 21:10:18 +0100 Subject: [PATCH 066/163] add unit test --- __tests__/gitlab.unit.test.js | 29 + __tests__/method.unit.test.js | 53 + __tests__/routes-account.unit.test.js | 5 + package-lock.json | 7293 +++++++++++++++++++++---- package.json | 7 +- 5 files changed, 6234 insertions(+), 1153 deletions(-) create mode 100644 __tests__/gitlab.unit.test.js create mode 100644 __tests__/method.unit.test.js create mode 100644 __tests__/routes-account.unit.test.js diff --git a/__tests__/gitlab.unit.test.js b/__tests__/gitlab.unit.test.js new file mode 100644 index 00000000..c4cca338 --- /dev/null +++ b/__tests__/gitlab.unit.test.js @@ -0,0 +1,29 @@ +const gitlab = require('../routes/gitlab') +const axios = require('axios') + +beforeAll(() => { + // test gitlab API connection + var config = { + method: 'get', + url: 'https://transfer.hft-stuttgart.de/gitlab/api/v4/projects' + } + + axios(config) + .then(function (response) { + expect(response.statusCode).toBe(200) + }) +}) + +describe('GitLab API test', () => { + test("Get a gitlab userID by email", () => { // email = any email address + gitlab.getUserIdByEmail("test@email.de", function(resp){ + expect(resp).not.toBeNull() + }) + }) + + test("Get the projects of a particular user", () => { // userID = any integer + gitlab.getUserProjects(3, function(resp){ + expect(resp).not.toBeNull() + }) + }) +}) \ No newline at end of file diff --git a/__tests__/method.unit.test.js b/__tests__/method.unit.test.js new file mode 100644 index 00000000..9c856e1d --- /dev/null +++ b/__tests__/method.unit.test.js @@ -0,0 +1,53 @@ +const dbconn = require('../routes/dbconn') +const methods = require('../routes/methods') + +beforeAll(() => { + // test DB connection + dbconn.user.query('SELECT 1 + 5 AS solution', function (err, rows) { + expect(err).toBeNull() + expect(rows[0].solution).toBe(6) + }) + dbconn.project.query('SELECT 10 + 5 AS solution', function (err, rows) { + expect(err).toBeNull() + expect(rows[0].solution).toBe(15) + }) +}) + +describe("DB methohds test", () => { +/* + test("Get a user from DB by email", () => { + let gitlabUserData = "to-be-defined" + methods.addGitlabUser(gitlabUserData, function(data, err){ + expect(data).not.toBeNull() + expect(err).toBeNull() + }) + }) */ + + test("Get a user from DB by email", () => { // email = any email address + methods.getUserByEmail("test@email.de", function(data, err){ + expect(data).not.toBeNull() + expect(err).toBeNull() + }) + }) + + test("Get a user from DB by ID", () => { // ID = any integer + methods.getUserById(100, function(data, err){ + expect(data).not.toBeNull() + expect(err).toBeNull() + }) + }) + + test("Check user email", () => { // email = any email address + methods.checkUserEmail("test@email.de", function(err, data){ + expect(data).not.toBeNull() + expect(err).toBeNull() + }) + }) + + test("Get a user by token", () => { // token = any alphanumeric + methods.checkUserEmail("1abc0qwerty", function(err, data){ + expect(data).not.toBeNull() + expect(err).toBeNull() + }) + }) +}) diff --git a/__tests__/routes-account.unit.test.js b/__tests__/routes-account.unit.test.js new file mode 100644 index 00000000..81f63035 --- /dev/null +++ b/__tests__/routes-account.unit.test.js @@ -0,0 +1,5 @@ +describe('Sample Test', () => { + it('should test that true === true', () => { + expect(true).toBe(true) + }) +}) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index bf8aa98c..9bad77a8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,1173 +4,4776 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@types/babel-types": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.7.tgz", - "integrity": "sha1-Zn6xZA6AOUNgKAVXN9K5mG7jNuM=" + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/compat-data": { + "version": "7.13.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.6.tgz", + "integrity": "sha512-VhgqKOWYVm7lQXlvbJnWOzwfAQATd2nV52koT0HZ/LdDH0m4DUDwkKYsH+IwpXb+bKPyBJzawA4I6nBKqZcpQw==" + }, + "@babel/core": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.1.tgz", + "integrity": "sha512-FzeKfFBG2rmFtGiiMdXZPFt/5R5DXubVi82uYhjGX4Msf+pgYQMCFIqFXZWs5vbIYbf14VeBIgdGI03CDOOM1w==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.0", + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helpers": "^7.13.0", + "@babel/parser": "^7.13.0", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "semver": "7.0.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } }, - "@types/babylon": { - "version": "6.16.5", - "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.5.tgz", - "integrity": "sha1-HFZB22nrjN83jt0ltL53VL7rSLQ=", + "@babel/generator": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.0.tgz", + "integrity": "sha512-zBZfgvBB/ywjx0Rgc2+BwoH/3H+lDtlgD4hBOpEv5LxRnYsm/753iRuLepqnYlynpjC3AdQxtxsoeHJoEEwOAw==", "requires": { - "@types/babel-types": "*" + "@babel/types": "^7.13.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } } }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=" - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", + "@babel/helper-compilation-targets": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.0.tgz", + "integrity": "sha512-SOWD0JK9+MMIhTQiUVd4ng8f3NXhPVQvTv7D3UN4wbp/6cAHnB2EmMaU1zZA2Hh1gwme+THBrVSqTFxHczTh0Q==", "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "@babel/compat-data": "^7.13.0", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.14.5", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" + } } }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" } }, - "ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", "requires": { - "string-width": "^2.0.0" + "@babel/types": "^7.12.13" } }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", + "@babel/helper-member-expression-to-functions": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.0.tgz", + "integrity": "sha512-yvRf8Ivk62JwisqV1rFRMxiSMDGnN6KH1/mDMmIrij4jztpQNRoHqqMG3U6apYbGRPJpgPalhva9Yd06HlUxJQ==", "requires": { - "color-convert": "^1.9.0" + "@babel/types": "^7.13.0" } }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha1-xV7PAhheJGklk5kxDBc84xIzsUI=", + "@babel/helper-module-imports": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz", + "integrity": "sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==", "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "@babel/types": "^7.12.13" } }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" + "@babel/helper-module-transforms": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.0.tgz", + "integrity": "sha512-Ls8/VBwH577+pw7Ku1QkUWIyRRNHpYlts7+qSqBBFCW3I8QteB9DxfcZ5YJpOwH6Ihe/wn8ch7fMGOP1OhEIvw==", + "requires": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-replace-supers": "^7.13.0", + "@babel/helper-simple-access": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0", + "lodash": "^4.17.19" + } }, - "async": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.1.0.tgz", - "integrity": "sha512-4vx/aaY6j/j3Lw3fbCHNWP0pPaTCew3F6F3hYyl/tHs/ndmV1q7NW9T5yuJ2XAGwdQrP+6Wu20x06U4APo/iQQ==" + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "requires": { + "@babel/types": "^7.12.13" + } }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" }, - "axios": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.0.tgz", - "integrity": "sha512-fmkJBknJKoZwem3/IKSSLpkdNXZeBu5Q7GA/aRsr2btgrptmSCxi2oFjZHqGdK9DoTil9PIHlPIZw2EcRJXRvw==", + "@babel/helper-replace-supers": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.0.tgz", + "integrity": "sha512-Segd5me1+Pz+rmN/NFBOplMbZG3SqRJOBlY+mA0SxAv6rjj7zJqr1AVr3SfzUVTLCv7ZLU5FycOM/SBGuLPbZw==", "requires": { - "follow-redirects": "^1.10.0" + "@babel/helper-member-expression-to-functions": "^7.13.0", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" } }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "@babel/helper-simple-access": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz", + "integrity": "sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA==", "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" + "@babel/types": "^7.12.13" } }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - } + "@babel/types": "^7.12.13" } }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha1-ry87iPpvXB5MY00aD46sT1WzleM=" + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "@babel/helper-validator-option": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", + "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==" }, - "basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha1-uZgnm/R844NEtPPPkW1Gebv1Hjo=", + "@babel/helpers": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.0.tgz", + "integrity": "sha512-aan1MeFPxFacZeSz6Ld7YZo5aPuqnKlD7+HZY75xQsueczFccP9A7V05+oe0XpLwHK3oLorPe9eaAUljL7WEaQ==", "requires": { - "safe-buffer": "5.1.2" + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" } }, - "bcryptjs": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", - "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" - }, - "bignumber.js": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", - "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==" - }, - "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha1-I8DfFPaogHf1+YbA0WfsA8PVU3w=" - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io=", + "@babel/highlight": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } }, - "bowser": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.9.0.tgz", - "integrity": "sha512-2ld76tuLBNFekRgmJfT2+3j5MIrP6bFict8WAIT3beq+srz1gcKNAdNKMqHqauQt63NmAa88HfP1/Ypa9Er3HA==" + "@babel/parser": { + "version": "7.13.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.4.tgz", + "integrity": "sha512-uvoOulWHhI+0+1f9L4BoozY7U5cIkZ9PgJqvb041d6vypgUmtVPG4vmGm4pSggjl8BELzvHyUeJSUyEMY6b+qA==" }, - "boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha1-VcbDmouljZxhrSLNh3Uy3rZlogs=", + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "requires": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - } + "@babel/helper-plugin-utils": "^7.8.0" } }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=", + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "requires": { - "fill-range": "^7.0.1" + "@babel/helper-plugin-utils": "^7.12.13" } }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=" - }, - "busboy": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz", - "integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==", + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "requires": { - "dicer": "0.3.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY=" - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" - }, - "camelize": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", - "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" - }, - "capture-stack-trace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", - "integrity": "sha1-psC74fOPOqC5Ijjstv9Cw0TUE10=" - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "chai": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", - "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "requires": { - "assertion-error": "^1.0.1", - "deep-eql": "^0.1.3", - "type-detect": "^1.0.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "chokidar": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", - "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.2.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha1-LKINu5zrMtRSSmgzAzE/AwSx5Jc=" - }, - "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" - } + "@babel/helper-plugin-utils": "^7.8.0" } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "requires": { - "color-name": "1.1.3" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "@babel/plugin-syntax-top-level-await": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", + "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", "requires": { - "delayed-stream": "~1.0.0" + "@babel/helper-plugin-utils": "^7.12.13" } }, - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", "requires": { - "graceful-readlink": ">= 1.0.0" + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" } }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "@babel/traverse": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.0.tgz", + "integrity": "sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ==", "requires": { - "mime-db": ">= 1.43.0 < 2" + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.0", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.0", + "@babel/types": "^7.13.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" }, "dependencies": { - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } } } }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "@babel/types": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.0.tgz", + "integrity": "sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA==", "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" }, "dependencies": { - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" } } }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" }, - "configstore": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha1-xvJd767vJt8S3TNBSwAf6BpUP48=", + "@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", "requires": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" } }, - "constantinople": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz", - "integrity": "sha1-1F7XJPV9PRBQABen06iJwTga5kc=", - "requires": { - "@types/babel-types": "^7.0.0", - "@types/babylon": "^6.16.2", - "babel-types": "^6.26.0", - "babylon": "^6.18.0" + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + } } }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=", - "requires": { - "safe-buffer": "5.1.2" + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" + }, + "@jest/console": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "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==", + "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==", + "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==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "content-security-policy-builder": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/content-security-policy-builder/-/content-security-policy-builder-2.1.0.tgz", - "integrity": "sha512-/MtLWhJVvJNkA9dVLAp6fg9LxD2gfI6R2Fi1hPmfjYXSahJJzcfvoeDOxSyp4NvxMuwWv3WMssE9o31DoULHrQ==" - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=" + "@jest/core": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "requires": { + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "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==", + "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==", + "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==" + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + "@jest/environment": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "requires": { + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" + } + }, + "@jest/fake-timers": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "requires": { + "@jest/types": "^26.6.2", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + } + }, + "@jest/globals": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "requires": { + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" + } + }, + "@jest/reporters": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "node-notifier": "^8.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "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==", + "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==", + "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==" + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } }, - "cookie-parser": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz", - "integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=", + "@jest/source-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", "requires": { - "cookie": "0.3.1", - "cookie-signature": "1.0.6" + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + } } }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "core-js": { - "version": "2.6.10", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz", - "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "@jest/test-result": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", "requires": { - "capture-stack-trace": "^1.0.0" + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" } }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "@jest/test-sequencer": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "@jest/test-result": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + } } }, - "crypto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", - "integrity": "sha1-KvG3ytgXXSTIobB3glV5SiGAMDc=" - }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" - }, - "dasherize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz", - "integrity": "sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg=" + "@jest/transform": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^26.6.2", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "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==", + "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==", + "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==" + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + } + } }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "requires": { - "ms": "2.0.0" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" }, "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "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==", + "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==", + "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==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } } } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "deep-eql": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", - "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "@sinonjs/commons": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.2.tgz", + "integrity": "sha512-sruwd86RJHdsVf/AtBoijDmUqJp3B6hF/DGC23C+JaegnDHaZyewCjoVGTdg3J0uz3Zs7NnIT05OBOmML72lQw==", "requires": { - "type-detect": "0.1.1" + "type-detect": "4.0.8" }, "dependencies": { "type-detect": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", - "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=" + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" } } }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw=" + "@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "requires": { + "@sinonjs/commons": "^1.7.0" + } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "@types/babel__core": { + "version": "7.1.12", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz", + "integrity": "sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ==", + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + "@types/babel__generator": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "requires": { + "@babel/types": "^7.0.0" + } }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "@types/babel__template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", + "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } }, - "dicer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", - "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", + "@types/babel__traverse": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.0.tgz", + "integrity": "sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg==", "requires": { - "streamsearch": "0.1.2" + "@babel/types": "^7.3.0" } }, - "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=" + "@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "requires": { + "@types/node": "*" + } }, - "doctypes": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", - "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=" + "@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" }, - "dont-sniff-mimetype": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.1.0.tgz", - "integrity": "sha512-ZjI4zqTaxveH2/tTlzS1wFp+7ncxNZaIEWYg3lzZRHkKf5zPT/MnEG6WL0BhHMJUabkh8GeU5NL5j+rEUCb7Ug==" + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "requires": { + "@types/istanbul-lib-coverage": "*" + } }, - "dot-prop": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", - "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", "requires": { - "is-obj": "^1.0.0" + "@types/istanbul-lib-report": "*" } }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + "@types/node": { + "version": "14.14.31", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.31.tgz", + "integrity": "sha512-vFHy/ezP5qI0rFgJ7aQnjDXwAMrG0KqqIH7tQG5PPv3BWBayOPIQNBjVc/P6hhdZfMx51REc6tfDNXHUio893g==" }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==" }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + "@types/prettier": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.1.tgz", + "integrity": "sha512-DxZZbyMAM9GWEzXL+BMZROWz9oo6A9EilwwOMET2UVu2uZTqMWS5S69KVtuVKaRjCUpcrOXRalet86/OpG4kqw==" }, - "errorhandler": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.4.3.tgz", - "integrity": "sha1-t7cO2PNZ6duICS8tIMD4MUIK2D8=", + "@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==" + }, + "@types/yargs": { + "version": "15.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", + "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", "requires": { - "accepts": "~1.3.0", - "escape-html": "~1.0.3" + "@types/yargs-parser": "*" } }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "@types/yargs-parser": { + "version": "20.2.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", + "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==" }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=" + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=" }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "mime-types": "~2.1.24", + "negotiator": "0.6.2" } }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ=", + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo=" - } + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" } }, - "express-fileupload": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/express-fileupload/-/express-fileupload-1.1.6.tgz", - "integrity": "sha512-w24zPWT8DkoIxSVkbxYPo9hkTiLpCQQzNsLRTCnecBhfbYv+IkIC5uLw2MIUAxBZ+7UMmXPjGxlhzUXo4RcbZw==", + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "requires": { - "busboy": "^0.3.1" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, - "express-flash-2": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/express-flash-2/-/express-flash-2-1.0.1.tgz", - "integrity": "sha1-8Vn04BcdxL8Z5ccOUxBjqGX5Cgo=", + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", "requires": { - "chai": "^3.5.0", - "mocha": "^3.2.0" + "string-width": "^2.0.0" } }, - "express-session": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.0.tgz", - "integrity": "sha1-m1DbteigPDU3NoE48HJzYVC3+bM=", + "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==", "requires": { - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-headers": "~1.0.2", - "parseurl": "~1.3.3", - "safe-buffer": "5.2.0", - "uid-safe": "~2.1.5" + "type-fest": "^0.11.0" }, "dependencies": { - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo=" - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha1-tpYWPMdXVg0JzyLMj60Vcbeedt8=" - }, - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha1-t02uxJsRSPiMZLaNSbHoFcHy9Rk=" + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" } } }, - "feature-policy": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/feature-policy/-/feature-policy-0.3.0.tgz", - "integrity": "sha512-ZtijOTFN7TzCujt1fnNhfWPFPSHeZkesff9AXZj+UEjYBynWNUIYpC87Ve4wHzyexQsImicLu7WsC2LHq7/xrQ==" + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", "requires": { - "to-regex-range": "^5.0.1" + "color-convert": "^1.9.0" } }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=", + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha1-xV7PAhheJGklk5kxDBc84xIzsUI=", "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, - "follow-redirects": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", - "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==" - }, - "form-data": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", - "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "sprintf-js": "~1.0.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + } } }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" }, - "fs": { - "version": "0.0.1-security", - "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", - "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=" + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "optional": true - }, - "function-bind": { + "array-flatten": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=" + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" }, - "glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, - "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha1-X0wdHnSNMM1zrSlEs1d6gbCB6MI=", + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "requires": { - "is-glob": "^4.0.1" + "safer-buffer": "~2.1.0" } }, - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "requires": { - "ini": "^1.3.4" - } + "assert-never": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz", + "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==" }, - "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "requires": { - "create-error-class": "^3.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" - } + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha1-ShL/G2A3bvCYYsIJPt2Qgyi+hCM=" + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" }, - "growl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=" + "async": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.1.0.tgz", + "integrity": "sha512-4vx/aaY6j/j3Lw3fbCHNWP0pPaTCew3F6F3hYyl/tHs/ndmV1q7NW9T5yuJ2XAGwdQrP+6Wu20x06U4APo/iQQ==" }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", - "requires": { - "function-bind": "^1.1.1" - } + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, - "helmet": { - "version": "3.23.3", - "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.23.3.tgz", - "integrity": "sha512-U3MeYdzPJQhtvqAVBPntVgAvNSOJyagwZwyKsFdyRa8TV3pOKVFljalPOCxbw5Wwf2kncGhmP0qHjyazIdNdSA==", + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", "requires": { - "depd": "2.0.0", - "dont-sniff-mimetype": "1.1.0", - "feature-policy": "0.3.0", - "helmet-crossdomain": "0.4.0", - "helmet-csp": "2.10.0", - "hide-powered-by": "1.1.0", - "hpkp": "2.0.0", - "hsts": "2.2.0", - "nocache": "2.1.0", - "referrer-policy": "1.2.0", - "x-xss-protection": "1.3.0" + "follow-redirects": "^1.10.0" + } + }, + "babel-jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "requires": { + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" }, "dependencies": { - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "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==", + "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==", + "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==" + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } } } }, - "helmet-crossdomain": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/helmet-crossdomain/-/helmet-crossdomain-0.4.0.tgz", - "integrity": "sha512-AB4DTykRw3HCOxovD1nPR16hllrVImeFp5VBV9/twj66lJ2nU75DP8FPL0/Jp4jj79JhTfG+pFI2MD02kWJ+fA==" - }, - "helmet-csp": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.10.0.tgz", - "integrity": "sha512-Rz953ZNEFk8sT2XvewXkYN0Ho4GEZdjAZy4stjiEQV3eN7GDxg1QKmYggH7otDyIA7uGA6XnUMVSgeJwbR5X+w==", + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", "requires": { - "bowser": "2.9.0", - "camelize": "1.0.0", - "content-security-policy-builder": "2.1.0", - "dasherize": "2.0.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" } }, - "hide-powered-by": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.1.0.tgz", - "integrity": "sha512-Io1zA2yOA1YJslkr+AJlWSf2yWFkKjvkcL9Ni1XSUqnGLr/qRQe2UI3Cn/J9MsJht7yEVCe0SscY1HgVMujbgg==" + "babel-plugin-jest-hoist": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } }, - "hpkp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hpkp/-/hpkp-2.0.0.tgz", - "integrity": "sha1-EOFCJk52IVpdMMROxD3mTe5tFnI=" + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } }, - "hsts": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/hsts/-/hsts-2.2.0.tgz", - "integrity": "sha512-ToaTnQ2TbJkochoVcdXYm4HOCliNozlviNsg+X2XQLQvZNI/kCHR9rZxVYpJB3UPcHz80PgxRyWQ7PdU1r+VBQ==", + "babel-preset-jest": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", "requires": { - "depd": "2.0.0" - }, - "dependencies": { - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - } + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" } }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=", + "babel-walk": { + "version": "3.0.0-canary-5", + "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", + "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "@babel/types": "^7.9.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" }, "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" } } }, - "i18n": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/i18n/-/i18n-0.8.5.tgz", - "integrity": "sha512-6UgLbhJGgn4XFeuZc/dDdrrri0ij24EK4hxv4Pbi5hloYAZ1B2+0eQchEryBFezLKYOHhVGV/5+H4i0oxng94w==", + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha1-uZgnm/R844NEtPPPkW1Gebv1Hjo=", "requires": { - "debug": "*", - "make-plural": "^6.0.1", - "math-interval-parser": "^2.0.1", - "messageformat": "^2.3.0", - "mustache": "*", - "sprintf-js": "^1.1.2" + "safe-buffer": "5.1.2" } }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "tweetnacl": "^0.14.3" } }, - "ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=" + "bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + "bignumber.js": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", + "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==" }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha1-I8DfFPaogHf1+YbA0WfsA8PVU3w=" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io=", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "bowser": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.9.0.tgz", + "integrity": "sha512-2ld76tuLBNFekRgmJfT2+3j5MIrP6bFict8WAIT3beq+srz1gcKNAdNKMqHqauQt63NmAa88HfP1/Ypa9Er3HA==" + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha1-VcbDmouljZxhrSLNh3Uy3rZlogs=", + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=", + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=" + }, + "browserslist": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", + "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", + "requires": { + "caniuse-lite": "^1.0.30001181", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.649", + "escalade": "^3.1.1", + "node-releases": "^1.1.70" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "busboy": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz", + "integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==", + "requires": { + "dicer": "0.3.0" + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY=" + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camelize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", + "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" + }, + "caniuse-lite": { + "version": "1.0.30001192", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001192.tgz", + "integrity": "sha512-63OrUnwJj5T1rUmoyqYTdRWBqFFxZFlyZnRRjDR8NSUQFB6A+j/uBORU/SyJ5WzDLg4SPiZH40hQCBNdZ/jmAw==" + }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "requires": { + "rsvp": "^4.8.4" + } + }, + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha1-psC74fOPOqC5Ijjstv9Cw0TUE10=" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "chai": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", + "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", + "requires": { + "assertion-error": "^1.0.1", + "deep-eql": "^0.1.3", + "type-detect": "^1.0.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==" + }, + "character-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", + "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=", + "requires": { + "is-regex": "^1.0.3" + } + }, + "chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + } + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha1-LKINu5zrMtRSSmgzAzE/AwSx5Jc=" + }, + "cjs-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==" + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "requires": { + "graceful-readlink": ">= 1.0.0" + } + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "requires": { + "mime-db": ">= 1.43.0 < 2" + }, + "dependencies": { + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + } + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha1-xvJd767vJt8S3TNBSwAf6BpUP48=", + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "constantinople": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", + "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", + "requires": { + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.1" + } + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-security-policy-builder": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-security-policy-builder/-/content-security-policy-builder-2.1.0.tgz", + "integrity": "sha512-/MtLWhJVvJNkA9dVLAp6fg9LxD2gfI6R2Fi1hPmfjYXSahJJzcfvoeDOxSyp4NvxMuwWv3WMssE9o31DoULHrQ==" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=" + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-parser": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz", + "integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=", + "requires": { + "cookie": "0.3.1", + "cookie-signature": "1.0.6" + } + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", + "integrity": "sha1-KvG3ytgXXSTIobB3glV5SiGAMDc=" + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + } + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "dasherize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz", + "integrity": "sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg=" + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decimal.js": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", + "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==" + }, + "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-eql": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "requires": { + "type-detect": "0.1.1" + }, + "dependencies": { + "type-detect": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=" + } + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw=" + }, + "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=" + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" + }, + "dicer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", + "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", + "requires": { + "streamsearch": "0.1.2" + } + }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=" + }, + "diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==" + }, + "doctypes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", + "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=" + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==" + } + } + }, + "dont-sniff-mimetype": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.1.0.tgz", + "integrity": "sha512-ZjI4zqTaxveH2/tTlzS1wFp+7ncxNZaIEWYg3lzZRHkKf5zPT/MnEG6WL0BhHMJUabkh8GeU5NL5j+rEUCb7Ug==" + }, + "dot-prop": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", + "requires": { + "is-obj": "^1.0.0" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "electron-to-chromium": { + "version": "1.3.674", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.674.tgz", + "integrity": "sha512-DBmEKRVYLZAoQSW+AmLcTF5Bpwhk4RUkobtzXVDlfPPYIlbsH3Jfg3QbBjAfFcRARzMIo4YiMhp3N+RnMuo1Eg==" + }, + "emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==" + }, + "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==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "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==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "errorhandler": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.4.3.tgz", + "integrity": "sha1-t7cO2PNZ6duICS8tIMD4MUIK2D8=", + "requires": { + "accepts": "~1.3.0", + "escape-html": "~1.0.3" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "exec-sh": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==" + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "requires": { + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "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==", + "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==" + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ=", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo=" + } + } + }, + "express-fileupload": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/express-fileupload/-/express-fileupload-1.1.6.tgz", + "integrity": "sha512-w24zPWT8DkoIxSVkbxYPo9hkTiLpCQQzNsLRTCnecBhfbYv+IkIC5uLw2MIUAxBZ+7UMmXPjGxlhzUXo4RcbZw==", + "requires": { + "busboy": "^0.3.1" + } + }, + "express-flash-2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/express-flash-2/-/express-flash-2-1.0.1.tgz", + "integrity": "sha1-8Vn04BcdxL8Z5ccOUxBjqGX5Cgo=", + "requires": { + "chai": "^3.5.0", + "mocha": "^3.2.0" + } + }, + "express-session": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.0.tgz", + "integrity": "sha1-m1DbteigPDU3NoE48HJzYVC3+bM=", + "requires": { + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.0.2", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.0", + "uid-safe": "~2.1.5" + }, + "dependencies": { + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo=" + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha1-tpYWPMdXVg0JzyLMj60Vcbeedt8=" + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha1-t02uxJsRSPiMZLaNSbHoFcHy9Rk=" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "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==" + }, + "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==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "requires": { + "bser": "2.1.1" + } + }, + "feature-policy": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/feature-policy/-/feature-policy-0.3.0.tgz", + "integrity": "sha512-ZtijOTFN7TzCujt1fnNhfWPFPSHeZkesff9AXZj+UEjYBynWNUIYpC87Ve4wHzyexQsImicLu7WsC2LHq7/xrQ==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "follow-redirects": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.2.tgz", + "integrity": "sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA==" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", + "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", + "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=" + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha1-X0wdHnSNMM1zrSlEs1d6gbCB6MI=", + "requires": { + "is-glob": "^4.0.1" + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "requires": { + "ini": "^1.3.4" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha1-ShL/G2A3bvCYYsIJPt2Qgyi+hCM=" + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=" + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "optional": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", + "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.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + }, + "helmet": { + "version": "3.23.3", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.23.3.tgz", + "integrity": "sha512-U3MeYdzPJQhtvqAVBPntVgAvNSOJyagwZwyKsFdyRa8TV3pOKVFljalPOCxbw5Wwf2kncGhmP0qHjyazIdNdSA==", + "requires": { + "depd": "2.0.0", + "dont-sniff-mimetype": "1.1.0", + "feature-policy": "0.3.0", + "helmet-crossdomain": "0.4.0", + "helmet-csp": "2.10.0", + "hide-powered-by": "1.1.0", + "hpkp": "2.0.0", + "hsts": "2.2.0", + "nocache": "2.1.0", + "referrer-policy": "1.2.0", + "x-xss-protection": "1.3.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } + } + }, + "helmet-crossdomain": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/helmet-crossdomain/-/helmet-crossdomain-0.4.0.tgz", + "integrity": "sha512-AB4DTykRw3HCOxovD1nPR16hllrVImeFp5VBV9/twj66lJ2nU75DP8FPL0/Jp4jj79JhTfG+pFI2MD02kWJ+fA==" + }, + "helmet-csp": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.10.0.tgz", + "integrity": "sha512-Rz953ZNEFk8sT2XvewXkYN0Ho4GEZdjAZy4stjiEQV3eN7GDxg1QKmYggH7otDyIA7uGA6XnUMVSgeJwbR5X+w==", + "requires": { + "bowser": "2.9.0", + "camelize": "1.0.0", + "content-security-policy-builder": "2.1.0", + "dasherize": "2.0.0" + } + }, + "hide-powered-by": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.1.0.tgz", + "integrity": "sha512-Io1zA2yOA1YJslkr+AJlWSf2yWFkKjvkcL9Ni1XSUqnGLr/qRQe2UI3Cn/J9MsJht7yEVCe0SscY1HgVMujbgg==" + }, + "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==" + }, + "hpkp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hpkp/-/hpkp-2.0.0.tgz", + "integrity": "sha1-EOFCJk52IVpdMMROxD3mTe5tFnI=" + }, + "hsts": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hsts/-/hsts-2.2.0.tgz", + "integrity": "sha512-ToaTnQ2TbJkochoVcdXYm4HOCliNozlviNsg+X2XQLQvZNI/kCHR9rZxVYpJB3UPcHz80PgxRyWQ7PdU1r+VBQ==", + "requires": { + "depd": "2.0.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } + } + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" + }, + "i18n": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/i18n/-/i18n-0.8.5.tgz", + "integrity": "sha512-6UgLbhJGgn4XFeuZc/dDdrrri0ij24EK4hxv4Pbi5hloYAZ1B2+0eQchEryBFezLKYOHhVGV/5+H4i0oxng94w==", + "requires": { + "debug": "*", + "make-plural": "^6.0.1", + "math-interval-parser": "^2.0.1", + "messageformat": "^2.3.0", + "mustache": "*", + "sprintf-js": "^1.1.2" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=" + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + }, + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + }, + "ipaddr.js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=" + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha1-43ecjuF/zPQoSI9uKBGH8uYyhBw=", + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-docker": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", + "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", + "optional": true + }, + "is-expression": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", + "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", + "requires": { + "acorn": "^7.1.1", + "object-assign": "^4.1.1" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=" + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-potential-custom-element-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", + "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=" + }, + "is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" + }, + "is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + } + }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha1-13hIi9CkZmo76KFIK58rqv7eqLQ=" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "optional": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + } + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", + "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", + "requires": { + "@jest/core": "^26.6.3", + "import-local": "^3.0.2", + "jest-cli": "^26.6.3" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "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==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.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==", + "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==" + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "requires": { + "ci-info": "^2.0.0" + } + }, + "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==" + }, + "jest-cli": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "requires": { + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + } + }, + "string-width": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.1.tgz", + "integrity": "sha512-LL0OLyN6AnfV9xqGQpDBwedT2Rt63737LxvsRxbcwpa2aIeynBApG2Sm//F3TaLHIR1aJBN52DWklc06b94o5Q==", + "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==", + "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==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.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": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + } + } + }, + "jest-changed-files": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "requires": { + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "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==", + "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==", + "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==" + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "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==", + "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==", + "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==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", + "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "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==", + "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==", + "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==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-environment-jsdom": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", + "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", + "requires": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", + "jsdom": "^16.4.0" + } + }, + "jest-environment-node": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", + "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", + "requires": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + } + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==" + }, + "jest-haste-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "requires": { + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + } + } + }, + "jest-jasmine2": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.6.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "throat": "^5.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "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==", + "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==", + "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==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-leak-detector": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", + "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "requires": { + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + } + }, + "jest-matcher-utils": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "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==", + "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==", + "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==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "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==", + "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==", + "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==" + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-mock": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", "requires": { - "once": "^1.3.0", - "wrappy": "1" + "@jest/types": "^26.6.2", + "@types/node": "*" } }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==" }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==" }, - "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "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==", + "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==", + "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==" + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=", + "jest-resolve-dependencies": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", + "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "requires": { + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" + } + }, + "jest-runner": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "requires": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.7.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "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==", + "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==", + "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==" + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-runtime": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "requires": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^0.6.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.4.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "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==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.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==", + "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==" + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==" + }, + "string-width": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.1.tgz", + "integrity": "sha512-LL0OLyN6AnfV9xqGQpDBwedT2Rt63737LxvsRxbcwpa2aIeynBApG2Sm//F3TaLHIR1aJBN52DWklc06b94o5Q==", + "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==", + "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==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.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": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + } + } + }, + "jest-serializer": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", "requires": { - "binary-extensions": "^2.0.0" + "@types/node": "*", + "graceful-fs": "^4.2.4" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + } } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=" + "jest-snapshot": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", + "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "natural-compare": "^1.4.0", + "pretty-format": "^26.6.2", + "semver": "^7.3.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "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==", + "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==", + "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==" + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "requires": { + "lru-cache": "^6.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==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } }, - "is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha1-43ecjuF/zPQoSI9uKBGH8uYyhBw=", + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "requires": { - "ci-info": "^1.5.0" + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "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==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "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==", + "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==" + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "requires": { + "ci-info": "^2.0.0" + } + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-validate": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "requires": { + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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==", + "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==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-watcher": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "requires": { + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.6.2", + "string-length": "^4.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "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==", + "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==", + "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==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "is-expression": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz", - "integrity": "sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8=", + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "requires": { - "acorn": "~4.0.2", - "object-assign": "^4.0.1" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" }, "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } } } }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "js-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", + "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=" }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=", + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "requires": { - "is-extglob": "^2.1.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, - "is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", - "requires": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" - } + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "jsdom": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", + "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", + "requires": { + "abab": "^2.0.3", + "acorn": "^7.1.1", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.2.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.0", + "domexception": "^2.0.1", + "escodegen": "^1.14.1", + "html-encoding-sniffer": "^2.0.1", + "is-potential-custom-element-name": "^1.0.0", + "nwsapi": "^2.2.0", + "parse5": "5.1.1", + "request": "^2.88.2", + "request-promise-native": "^1.0.8", + "saxes": "^5.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0", + "ws": "^7.2.3", + "xml-name-validator": "^3.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, - "is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=" + "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==" }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=" + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "requires": { - "path-is-inside": "^1.0.1" + "minimist": "^1.2.5" } }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" - }, - "is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "requires": { - "has": "^1.0.1" + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" } }, - "is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha1-13hIi9CkZmo76KFIK58rqv7eqLQ=" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "isarray": { + "jstransformer": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "js-stringify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", - "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=" - }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=" + "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", + "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=", + "requires": { + "is-promise": "^2.0.0", + "promise": "^7.0.1" + } }, "kind-of": { "version": "3.2.2", @@ -1180,6 +4783,11 @@ "is-buffer": "^1.1.5" } }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + }, "latest-version": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", @@ -1188,10 +4796,37 @@ "package-json": "^4.0.0" } }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "lodash._baseassign": { "version": "3.2.0", @@ -1252,10 +4887,10 @@ "lodash.isarray": "^3.0.0" } }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" }, "lowercase-keys": { "version": "1.0.1", @@ -1284,6 +4919,27 @@ "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-6.0.1.tgz", "integrity": "sha512-h0uBNi4tpDkiWUyYKrJNj8Kif6q3Ba5zp/8jnfPy3pQE+4XcTj6h3eZM5SYVUyDNX9Zk69Isr/dx0I+78aJUaQ==" }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "requires": { + "tmpl": "1.0.x" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, "math-interval-parser": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/math-interval-parser/-/math-interval-parser-2.0.1.tgz", @@ -1299,6 +4955,11 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, "messageformat": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/messageformat/-/messageformat-2.3.0.tgz", @@ -1334,6 +4995,15 @@ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -1352,6 +5022,11 @@ "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==" + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -1365,6 +5040,25 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", @@ -1460,11 +5154,46 @@ "sqlstring": "2.3.1" } }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + } + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=" }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, "nocache": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz", @@ -1475,6 +5204,70 @@ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" + }, + "node-notifier": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.1.tgz", + "integrity": "sha512-BvEXF+UmsnAfYfoapKM9nGxnP+Wn7P91YfXmrKnfcYCx6VBeoN5Ez5Ogck6I8Bi5k4RlpqRYaw75pAwzX9OphA==", + "optional": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "optional": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "optional": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + } + } + }, + "node-releases": { + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==" + }, "nodemailer": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.3.1.tgz", @@ -1515,6 +5308,17 @@ "abbrev": "1" } }, + "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==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -1528,11 +5332,57 @@ "path-key": "^2.0.0" } }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -1554,11 +5404,58 @@ "wrappy": "1" } }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "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==", + "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" + } + }, + "p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==" + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.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==" + }, "package-json": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", @@ -1570,11 +5467,32 @@ "semver": "^5.1.0" } }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=" }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, "passport": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/passport/-/passport-0.3.2.tgz", @@ -1614,6 +5532,11 @@ "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -1644,6 +5567,11 @@ "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, "picomatch": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.1.1.tgz", @@ -1654,16 +5582,98 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" }, + "pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "requires": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "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==", + "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==" + } + } + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I=" }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + }, + "prompts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, "proxy-addr": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", @@ -1678,213 +5688,152 @@ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, "pstree.remy": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.7.tgz", "integrity": "sha1-x2ljooBH7WFULcNhqibuVaf6FfM=" }, "pug": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.4.tgz", - "integrity": "sha1-7naC7ApgSUs41IqI8F87CskxN30=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.2.tgz", + "integrity": "sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==", "requires": { - "pug-code-gen": "^2.0.2", - "pug-filters": "^3.1.1", - "pug-lexer": "^4.1.0", - "pug-linker": "^3.0.6", - "pug-load": "^2.0.12", - "pug-parser": "^5.0.1", - "pug-runtime": "^2.0.5", - "pug-strip-comments": "^1.0.4" + "pug-code-gen": "^3.0.2", + "pug-filters": "^4.0.0", + "pug-lexer": "^5.0.1", + "pug-linker": "^4.0.0", + "pug-load": "^3.0.0", + "pug-parser": "^6.0.0", + "pug-runtime": "^3.0.1", + "pug-strip-comments": "^2.0.0" } }, "pug-attrs": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.4.tgz", - "integrity": "sha1-svRMQ55OtK1dTvJcrCDRitKMwzY=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", + "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", "requires": { - "constantinople": "^3.0.1", - "js-stringify": "^1.0.1", - "pug-runtime": "^2.0.5" + "constantinople": "^4.0.1", + "js-stringify": "^1.0.2", + "pug-runtime": "^3.0.0" } }, "pug-code-gen": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.2.tgz", - "integrity": "sha1-rQlnFirqB33PeHg42U7RSssCF8I=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.2.tgz", + "integrity": "sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==", "requires": { - "constantinople": "^3.1.2", + "constantinople": "^4.0.1", "doctypes": "^1.1.0", - "js-stringify": "^1.0.1", - "pug-attrs": "^2.0.4", - "pug-error": "^1.3.3", - "pug-runtime": "^2.0.5", - "void-elements": "^2.0.1", - "with": "^5.0.0" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" - }, - "acorn-globals": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", - "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", - "requires": { - "acorn": "^4.0.4" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" - } - } - }, - "constantinople": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz", - "integrity": "sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==", - "requires": { - "@types/babel-types": "^7.0.0", - "@types/babylon": "^6.16.2", - "babel-types": "^6.26.0", - "babylon": "^6.18.0" - } - }, - "with": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz", - "integrity": "sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4=", - "requires": { - "acorn": "^3.1.0", - "acorn-globals": "^3.0.0" - } - } + "js-stringify": "^1.0.2", + "pug-attrs": "^3.0.0", + "pug-error": "^2.0.0", + "pug-runtime": "^3.0.0", + "void-elements": "^3.1.0", + "with": "^7.0.0" } }, "pug-error": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.3.tgz", - "integrity": "sha1-80L7AIdS1YA0wYXeA2At2f/hX6Y=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz", + "integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==" }, "pug-filters": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-3.1.1.tgz", - "integrity": "sha1-qyzILbnuzPV4vaiRMOJSoNsCaqc=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", + "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", "requires": { - "clean-css": "^4.1.11", - "constantinople": "^3.0.1", + "constantinople": "^4.0.1", "jstransformer": "1.0.0", - "pug-error": "^1.3.3", - "pug-walk": "^1.1.8", - "resolve": "^1.1.6", - "uglify-js": "^2.6.1" + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0", + "resolve": "^1.15.1" }, "dependencies": { - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "clean-css": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", - "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", - "requires": { - "source-map": "~0.6.0" - } - }, - "jstransformer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", - "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=", - "requires": { - "is-promise": "^2.0.0", - "promise": "^7.0.1" - } - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "requires": { - "asap": "~2.0.3" + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, "pug-lexer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-4.1.0.tgz", - "integrity": "sha1-UxzeSMfAsfy7wrhUhchmXjFInP0=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz", + "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", "requires": { - "character-parser": "^2.1.1", - "is-expression": "^3.0.0", - "pug-error": "^1.3.3" - }, - "dependencies": { - "character-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", - "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=", - "requires": { - "is-regex": "^1.0.3" - } - } + "character-parser": "^2.2.0", + "is-expression": "^4.0.0", + "pug-error": "^2.0.0" } }, "pug-linker": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.6.tgz", - "integrity": "sha1-9b8hiw79Zc5mcPevxRZY0Pgpifs=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", + "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", "requires": { - "pug-error": "^1.3.3", - "pug-walk": "^1.1.8" + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0" } }, "pug-load": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.12.tgz", - "integrity": "sha1-04yF64X24vcE3qFNzKlBRNNdPns=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", + "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", "requires": { - "object-assign": "^4.1.0", - "pug-walk": "^1.1.8" + "object-assign": "^4.1.1", + "pug-walk": "^2.0.0" } }, "pug-parser": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-5.0.1.tgz", - "integrity": "sha1-A+etpItoQL04Ivhn19kPhC0P/ck=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", + "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", "requires": { - "pug-error": "^1.3.3", - "token-stream": "0.0.1" + "pug-error": "^2.0.0", + "token-stream": "1.0.0" } }, "pug-runtime": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.5.tgz", - "integrity": "sha1-baeXbDa/IvaOczw1kkDYrnoylTo=" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz", + "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==" }, "pug-strip-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz", - "integrity": "sha1-zBtt4fbo9ZMc8C7GbN/9P1Dq+Kg=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", + "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", "requires": { - "pug-error": "^1.3.3" + "pug-error": "^2.0.0" } }, "pug-walk": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.8.tgz", - "integrity": "sha1-tAj2fyeRL4wh2i9FtyMMS9Kl6no=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", + "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "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==" }, "q": { "version": "1.5.1", @@ -1928,6 +5877,39 @@ "strip-json-comments": "~2.0.1" } }, + "react-is": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", + "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==" + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", @@ -1962,10 +5944,14 @@ "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.2.0.tgz", "integrity": "sha512-LgQJIuS6nAy1Jd88DCQRemyE3mS+ispwlqMk3b0yjZ257fI1v9c+/p6SD5gP5FGyXUIgrNOAfmyioHwZtYv2VA==" }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=" + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } }, "registry-auth-token": { "version": "3.4.0", @@ -1984,11 +5970,118 @@ "rc": "^1.0.1" } }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, + "request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "requires": { + "lodash": "^4.17.19" + } + }, + "request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "requires": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "dependencies": { + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, "resolve": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", @@ -1997,29 +6090,257 @@ "path-parse": "^1.0.6" } }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "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": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "requires": { - "align-text": "^0.1.1" + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + } } }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "requires": { + "xmlchars": "^2.2.0" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -2060,39 +6381,245 @@ } } }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=", + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/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", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" + "kind-of": "^3.2.0" } }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=" + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "requires": { - "shebang-regex": "^1.0.0" + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "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==" + }, + "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==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==" + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + } }, "sprintf-js": { "version": "1.1.2", @@ -2104,16 +6631,95 @@ "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", "integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A=" }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + } + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" + }, "streamsearch": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" }, + "string-length": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", + "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -2139,11 +6745,21 @@ "ansi-regex": "^3.0.0" } }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -2157,6 +6773,35 @@ "has-flag": "^3.0.0" } }, + "supports-hyperlinks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", + "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, "term-size": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", @@ -2165,15 +6810,73 @@ "execa": "^0.7.0" } }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + } + } + }, + "throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" + }, "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } }, "to-regex-range": { "version": "5.0.1", @@ -2189,9 +6892,9 @@ "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=" }, "token-stream": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz", - "integrity": "sha1-zu78cXp2xDFvEm0LnbqlXX598Bo=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", + "integrity": "sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ=" }, "touch": { "version": "3.1.0", @@ -2201,11 +6904,55 @@ "nopt": "~1.0.10" } }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "requires": { + "punycode": "^2.1.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + }, "type-detect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=" }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -2215,29 +6962,14 @@ "mime-types": "~2.1.24" } }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } + "is-typedarray": "^1.0.0" } }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "optional": true - }, "uid-safe": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", @@ -2254,6 +6986,17 @@ "debug": "^2.2.0" } }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, "unique-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", @@ -2267,6 +7010,42 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, "unzip-response": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", @@ -2289,6 +7068,19 @@ "xdg-basedir": "^3.0.0" } }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, "url-parse-lax": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", @@ -2297,6 +7089,11 @@ "prepend-http": "^1.0.1" } }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -2307,15 +7104,109 @@ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "optional": true + }, + "v8-to-istanbul": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.0.tgz", + "integrity": "sha512-uXUVqNUCLa0AH1vuVxzi+MI4RfxEOKt9pBgKwHbgH7st8Kv2P1m+jvWNnektzBh5QShF3ODgKmUFCf38LnVz1g==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + }, + "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==", + "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", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha1-YU9/v42AHwu18GYfWy9XhXUOTwk=" + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "requires": { + "makeerror": "1.0.x" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + }, + "whatwg-url": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", + "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^2.0.2", + "webidl-conversions": "^6.1.0" + } }, "which": { "version": "1.3.1", @@ -2325,6 +7216,11 @@ "isexe": "^2.0.0" } }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, "widest-line": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", @@ -2333,10 +7229,82 @@ "string-width": "^2.1.1" } }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + "with": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", + "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", + "requires": { + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", + "assert-never": "^1.2.1", + "babel-walk": "3.0.0-canary-5" + } + }, + "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==" + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "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==", + "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==" + }, + "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==" + }, + "string-width": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.1.tgz", + "integrity": "sha512-LL0OLyN6AnfV9xqGQpDBwedT2Rt63737LxvsRxbcwpa2aIeynBApG2Sm//F3TaLHIR1aJBN52DWklc06b94o5Q==", + "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==", + "requires": { + "ansi-regex": "^5.0.0" + } + } + } }, "wrappy": { "version": "1.0.2", @@ -2353,6 +7321,11 @@ "signal-exit": "^3.0.2" } }, + "ws": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.3.tgz", + "integrity": "sha512-hr6vCR76GsossIRsr8OLR9acVVm1jyfEWvhbNjtgPOrfvAlKzvyeg/P6r8RuDjRyrcQoPQT7K0DGEPc7Ae6jzA==" + }, "x-xss-protection": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.3.0.tgz", @@ -2390,6 +7363,11 @@ "xpath": "0.0.27" } }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + }, "xml2js": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", @@ -2404,6 +7382,11 @@ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, "xmldom": { "version": "0.1.31", "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", @@ -2414,20 +7397,30 @@ "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.27.tgz", "integrity": "sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ==" }, + "y18n": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" + }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + } } } } diff --git a/package.json b/package.json index ff0f1312..aa17a988 100644 --- a/package.json +++ b/package.json @@ -17,11 +17,11 @@ }, "scripts": { "start": "nodemon app.js", - "test": "" + "test": "jest" }, "dependencies": { "async": "^3.1.0", - "axios": "^0.21.0", + "axios": "^0.21.1", "bcryptjs": "^2.4.3", "body-parser": "^1.19.0", "compression": "^1.7.4", @@ -36,13 +36,14 @@ "fs": "0.0.1-security", "helmet": "^3.23.3", "i18n": "^0.8.5", + "jest": "^26.6.3", "morgan": "^1.9.1", "mysql": "^2.17.1", "nodemailer": "^6.3.1", "nodemon": "^2.0.1", "passport": "0.3.2", "passport-saml": "^1.4.2", - "pug": "^2.0.4" + "pug": "^3.0.2" }, "devDependencies": {}, "engines": { -- GitLab From 3a75a61729c4e57828b2009ab71aacc5fb9f1002 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Wed, 3 Mar 2021 21:11:07 +0100 Subject: [PATCH 067/163] minor updates --- routes/{api.js => api_TBD.js} | 0 routes/routes-account.js | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename routes/{api.js => api_TBD.js} (100%) diff --git a/routes/api.js b/routes/api_TBD.js similarity index 100% rename from routes/api.js rename to routes/api_TBD.js diff --git a/routes/routes-account.js b/routes/routes-account.js index 16f38832..6715ddda 100644 --- a/routes/routes-account.js +++ b/routes/routes-account.js @@ -204,7 +204,7 @@ module.exports = function (app, config, passport, i18n) { } ], function(err, gitlabRunnersProjectIdsArr) { // get user projects - gitlab.getUserProjects (loggedInUser.getGitlabUserId(), function(data){ + gitlab.getUserProjects(loggedInUser.getGitlabUserId(), function(data){ if (data.error) return res.status(500).send(data.data) let gitlabData = data.data -- GitLab From c26edde1c791b6c502fd44af675b2c3728c10817 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Thu, 4 Mar 2021 11:41:11 +0100 Subject: [PATCH 068/163] add path and breadcrumb --- classes/project.js | 11 +++++++++-- classes/website.js | 4 ++-- routes/routes-account.js | 14 +++++++++----- views/DE/account/services.pug | 10 +++++++++- views/DE/account/updateInformation.pug | 25 +++++++++---------------- 5 files changed, 38 insertions(+), 26 deletions(-) diff --git a/classes/project.js b/classes/project.js index 32e5801d..85dafab3 100644 --- a/classes/project.js +++ b/classes/project.js @@ -1,10 +1,11 @@ class Project { - constructor(ownerGitlabId, id, name, desc, logo) { + constructor(ownerGitlabId, id, name, desc, logo, path) { this.ownerGitlabId = ownerGitlabId this.id = id this.name = name this.desc = desc this.logo = logo + this.path = path } // getter @@ -23,6 +24,9 @@ class Project { getLogo() { return this.logo } + getPath() { + return this.path + } // setter setOwnerGitlabId(newOwnerGitlabId){ this.ownerGitlabId = newOwnerGitlabId @@ -36,9 +40,12 @@ class Project { setDesc(newDesc) { this.desc = newDesc } - setLogo(newLogoUrl){ + setLogo(newLogoUrl) { this.logo = newLogoUrl } + setPath(newPath) { + this.path = newPath + } } module.exports = Project \ No newline at end of file diff --git a/classes/website.js b/classes/website.js index 2906e015..98189269 100644 --- a/classes/website.js +++ b/classes/website.js @@ -1,8 +1,8 @@ const Project = require("./project"); class Website extends Project { - constructor(ownerGitlabId, id, name, desc, logo, settingUrl, kontaktUrl, isPublished) { - super(ownerGitlabId, id, name, desc, logo) + constructor(ownerGitlabId, id, name, desc, logo, path, settingUrl, kontaktUrl, isPublished) { + super(ownerGitlabId, id, name, desc, logo, path) this.settingUrl = settingUrl this.kontaktUrl = kontaktUrl this.isPublished = isPublished diff --git a/routes/routes-account.js b/routes/routes-account.js index 6715ddda..5baa62a4 100644 --- a/routes/routes-account.js +++ b/routes/routes-account.js @@ -216,10 +216,11 @@ module.exports = function (app, config, passport, i18n) { isWebsitePublished = true } let page = new projectInformation(loggedInUser.getGitlabUserId(), gitlabData[i].id, gitlabData[i].name, gitlabData[i].description, - gitlabData[i].avatar_url, null, null, isWebsitePublished) + gitlabData[i].avatar_url, gitlabData[i].path, null, null, isWebsitePublished) gitlabPagesArr.push(page) } else { - let repo = new projectRepo(loggedInUser.getGitlabUserId(), gitlabData[i].id, gitlabData[i].name, gitlabData[i].description, gitlabData[i].avatar_url) + let repo = new projectRepo(loggedInUser.getGitlabUserId(), gitlabData[i].id, gitlabData[i].name, gitlabData[i].description, + gitlabData[i].avatar_url, gitlabData[i].path) gitlabReposArr.push(repo) } } @@ -498,7 +499,7 @@ module.exports = function (app, config, passport, i18n) { } else { let projectName = req.body.name.toLowerCase().replace(/\s/g, '-') let projectDesc = req.body.description - let newInformation = new projectInformation(loggedInUser.getGitlabUserId(), null, projectName, projectDesc, null, null, null, false) + let newInformation = new projectInformation(loggedInUser.getGitlabUserId(), null, projectName, projectDesc, null, null, null, null, false) if (!req.files) { res.flash('error', 'Bitte geben Sie ein Projektlogo an.') @@ -525,6 +526,7 @@ module.exports = function (app, config, passport, i18n) { } else { newInformation.setId(result.id) newInformation.setLogo(result.avatar_url) + newInformation.setPath(result.path) newInformation.setSettingUrl(tpGitlabURL+result.namespace.path+'/'+result.name+'/-/edit/master/public/settings.js') newInformation.setKontaktUrl(tpGitlabURL+result.namespace.path+'/'+result.name+'/-/edit/master/public/kontakt.html') @@ -568,12 +570,13 @@ module.exports = function (app, config, passport, i18n) { informationStatus = false } let gitlabData = data.data - let curInformation = new projectInformation(loggedInUser.getGitlabUserId(), req.query.id, null, null, null, null, null, informationStatus) + let curInformation = new projectInformation(loggedInUser.getGitlabUserId(), req.query.id, null, null, null, null, null, null, informationStatus) for(let i = 0; i < gitlabData.length; i++){ if (gitlabData[i].id == req.query.id) { curInformation.setName(gitlabData[i].name) curInformation.setDesc(gitlabData[i].description) curInformation.setLogo(gitlabData[i].avatar_url) + curInformation.setPath(gitlabData[i].path) curInformation.setSettingUrl(tpGitlabURL+gitlabData[i].path_with_namespace+'/-/edit/master/public/settings.js') curInformation.setKontaktUrl(tpGitlabURL+gitlabData[i].path_with_namespace+'/-/edit/master/public/kontakt.html') @@ -604,7 +607,7 @@ module.exports = function (app, config, passport, i18n) { if (req.body.isPublished == "false") { isProjectPublished = false } - let updatedInformation = new projectInformation(loggedInUser.getGitlabUserId(), req.query.id, projectName, projectDesc, null, null, null, isProjectPublished) + let updatedInformation = new projectInformation(loggedInUser.getGitlabUserId(), req.query.id, projectName, projectDesc, null, null, null, null, isProjectPublished) let newLogoFile async.waterfall([ @@ -630,6 +633,7 @@ module.exports = function (app, config, passport, i18n) { } } else { updatedInformation.setLogo(result.avatar_url) + updatedInformation.setPath(result.path) updatedInformation.setSettingUrl(tpGitlabURL+result.namespace.path+'/'+result.name+'/-/edit/master/public/settings.js') updatedInformation.setKontaktUrl(tpGitlabURL+result.namespace.path+'/'+result.name+'/-/edit/master/public/kontakt.html') res.flash("success", "Your website has been updated") diff --git a/views/DE/account/services.pug b/views/DE/account/services.pug index f1a08b61..09d2efe5 100644 --- a/views/DE/account/services.pug +++ b/views/DE/account/services.pug @@ -35,6 +35,12 @@ html(lang="de") i(class="fa fa-sign-out-alt fa-fw") span(class="d-none d-md-inline") Logout main(class="col bg-faded py-3 flex-grow-1") + nav(aria-label="breadcrumb") + ol(class="breadcrumb") + li(class="breadcrumb-item") + a(href="/account") Konto + li(class="breadcrumb-item active" aria-current="page") Projekte und Dienste + div(class="container") h3(class="pb-2") Dienste div(class="col-sm-12") @@ -54,13 +60,15 @@ html(lang="de") for item in gitlabPages - let img = item.logo - let editNewPageLink = "/account/updateInformation?id="+item.id + - let websiteURL = "https://transfer.hft-stuttgart.de/pages/"+item.path tr td img(src=img, width="45", height="45") if item.isPublished td a(href=editNewPageLink+"&s=y" class="link-dark") #{item.name} - td veröffentlicht + td + a(href=websiteURL target="_blank" class="link-dark") veröffentlicht else td a(href=editNewPageLink+"&s=n" class="link-dark") #{item.name} diff --git a/views/DE/account/updateInformation.pug b/views/DE/account/updateInformation.pug index c525c14c..4641aea8 100644 --- a/views/DE/account/updateInformation.pug +++ b/views/DE/account/updateInformation.pug @@ -35,6 +35,14 @@ html(lang="de") i(class="fa fa-sign-out-alt fa-fw") span(class="d-none d-md-inline") Logout main(class="col bg-faded py-3 flex-grow-1") + nav(aria-label="breadcrumb") + ol(class="breadcrumb") + li(class="breadcrumb-item") + a(href="/account") Konto + li(class="breadcrumb-item") + a(href="/account/services") Projekte und Dienste + li(class="breadcrumb-item active" aria-current="page") Information aktualisieren + if flash.success div.alert.alert-success.alert-dismissible #{flash.success} a(class="close", href="#", data-dismiss="alert", aria-label="close") × @@ -51,7 +59,7 @@ html(lang="de") label(for="name", class="col-sm-2") Name div(class="col-sm-8") input#name(name="name", type="text", class="form-control", value=information.name, placeholder="Name", maxlength="75" required) - |

Ihre Webseite wird unter folgender URL veröffentlicht: https://transfer.hft-stuttgart.de/pages/

+ |

Ihre Webseite URL: https://transfer.hft-stuttgart.de/pages/#{information.path}

div(class="form-group row") label(for="description", class="col-sm-2") Beschreibung div(class="col-sm-8") @@ -106,21 +114,6 @@ html(lang="de") // M4_LAB script(src="/js/headfoot.js") script. - function showWebsiteURL() { - if ($("#name").val()) { - $("#nameInfo").show(); - let webName = $("#name").val().toLowerCase().replace(/\s/g, '-'); - document.getElementById("websiteName").innerText = webName; - } - else { - $("#nameInfo").hide() - } - } - $('#name').on('input',function(e){ - showWebsiteURL() - }) - showWebsiteURL() - function sendPublishRequest() { $.post("/sendPublishRequest", {projectName: $("#name").val()}, function(resp){ alert(resp) -- GitLab From b0e45392a07135a582219571719a38eee59e101d Mon Sep 17 00:00:00 2001 From: Rosanny Date: Thu, 4 Mar 2021 11:41:38 +0100 Subject: [PATCH 069/163] add breadcrumb --- views/DE/account/newInformation.pug | 9 +++++++++ views/DE/account/profile.pug | 10 +++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/views/DE/account/newInformation.pug b/views/DE/account/newInformation.pug index beec7f09..8055ce0a 100644 --- a/views/DE/account/newInformation.pug +++ b/views/DE/account/newInformation.pug @@ -35,12 +35,21 @@ html(lang="de") i(class="fa fa-sign-out-alt fa-fw") span(class="d-none d-md-inline") Logout main(class="col bg-faded py-3 flex-grow-1") + nav(aria-label="breadcrumb") + ol(class="breadcrumb") + li(class="breadcrumb-item") + a(href="/account") Konto + li(class="breadcrumb-item") + a(href="/account/services") Projekte und Dienste + li(class="breadcrumb-item active" aria-current="page") Neue Projektinformation + if flash.success div.alert.alert-success.alert-dismissible #{flash.success} a(class="close", href="#", data-dismiss="alert", aria-label="close") × if flash.error div.alert.alert-danger.alert-dismissible.fade.show #{flash.error} a(class="close", href="#", data-dismiss="alert", aria-label="close") × + h3(class="pb-2") Neue Projektinformation div(class="mx-4") h4(class="pb-1") Schritt 1: Setup diff --git a/views/DE/account/profile.pug b/views/DE/account/profile.pug index a7c6f99f..282fe411 100644 --- a/views/DE/account/profile.pug +++ b/views/DE/account/profile.pug @@ -1,7 +1,7 @@ doctype html html(lang="de") head - title= "User Profile" + title= "Benutzerprofil" meta(charset="UTF-8") meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") @@ -35,12 +35,20 @@ html(lang="de") i(class="fa fa-sign-out-alt fa-fw") span(class="d-none d-md-inline") Logout main(class="col bg-faded py-3 flex-grow-1") + nav(aria-label="breadcrumb") + ol(class="breadcrumb") + li(class="breadcrumb-item") + a(href="/account") Konto + li(class="breadcrumb-item active" aria-current="page") Benutzerprofil + if flash.success div.alert.alert-success.alert-dismissible #{flash.success} a(class="close", href="#", data-dismiss="alert", aria-label="close") × if flash.error div.alert.alert-danger.alert-dismissible.fade.show #{flash.error} a(class="close", href="#", data-dismiss="alert", aria-label="close") × + + h3(class="pb-2") Mein Profil form#profileForm(method="POST", action="/updateProfile") div(class="form-row") div(class='form-group col-md-2') -- GitLab From 908416f6b8f4e170a5a0b82424ed559b31b3815a Mon Sep 17 00:00:00 2001 From: Rosanny Date: Thu, 4 Mar 2021 11:45:53 +0100 Subject: [PATCH 070/163] minor updates --- app.js | 2 -- routes/dbconn.js | 14 -------------- routes/methods.js | 35 ++++++++++++----------------------- 3 files changed, 12 insertions(+), 39 deletions(-) diff --git a/app.js b/app.js index 737d73fa..e0c604ab 100644 --- a/app.js +++ b/app.js @@ -67,11 +67,9 @@ app.use(function(req, res, next) { }); require('./routes/routes-account')(app, config, passport, i18n); -require('./routes/api')(app, config, passport); // Handle 404 app.use(function (req, res, next) { - //res.status(404).send('404: Page not Found', 404) res.status(404).render('./DE/404') }) diff --git a/routes/dbconn.js b/routes/dbconn.js index a39f7368..c66d0d2d 100644 --- a/routes/dbconn.js +++ b/routes/dbconn.js @@ -17,13 +17,6 @@ userConnection.connect(function(err) { if (err) throw err; }) userConnection.query('USE '+config.database.dbUser) - -// user db connection test -userConnection.query('SELECT 1 + 5 AS solution', function (err, rows, fields) { - if (err) throw err - console.log('Solution = ', rows[0].solution) -}) -//userConnection.end() // ALTERNATIVE approach: close db connection manually after every query /* @@ -62,13 +55,6 @@ projectConnection.connect(function(err) { if (err) throw err; }) projectConnection.query('USE '+config.database.dbProject) - -// projectdb connection test -projectConnection.query('SELECT 10 + 5 AS project', function (err, rows, fields) { - if (err) throw err - console.log('Project = ', rows[0].project) -}) -//projectConnection.end() var connection = { user: userConnection, diff --git a/routes/methods.js b/routes/methods.js index 85745482..4461dea6 100644 --- a/routes/methods.js +++ b/routes/methods.js @@ -1,10 +1,6 @@ const dbconn = require('./dbconn'); var methods = { - // test method - currentDate: function() { - console.log('Current Date is: ' + new Date().toISOString().slice(0, 10)); - }, // ===================== user db ===================== registerNewUser: function(data, callback) { dbconn.user.beginTransaction(function(err) { // START TRANSACTION @@ -70,22 +66,20 @@ var methods = { }, getUserByEmail: function(email, callback) { dbconn.user.query('SELECT id, verificationStatus, salutation, title, firstname, lastname, industry, organisation, speciality, m4lab_idp FROM user WHERE email = "' +email+'"', function (err, rows, fields) { - if (err) { - throw err; - } + let user + if (err) { throw err } else { if ( rows.length > 0) { - user = rows[0]; + user = rows[0] } } - callback(user, err); + callback(user, err) }); }, getUserById: function(userId, callback) { dbconn.user.query('SELECT verificationStatus, email, salutation, title, firstname, lastname, industry, organisation, speciality FROM user WHERE id = ' +userId, function (err, rows, fields) { - if (err) { - throw err; - } + let user + if (err) { throw err } else { if ( rows.length > 0) { user = rows[0]; @@ -96,34 +90,29 @@ var methods = { }, checkUserEmail: function(email, callback) { let user - dbconn.user.query('SELECT id, email FROM user WHERE email = "' +email+'"', function (err, rows, fields) { - if (err) { - throw err; - } + dbconn.user.query('SELECT id, email FROM user WHERE email = "' +email+'"', function (err, rows) { + if (err) { throw err } else { if ( rows.length > 0) { user = rows[0]; } } - callback(err, user); + callback(err, user) }); }, getUserByToken: function(token, callback) { let user dbconn.user.query('SELECT t1.user_id, t2.email FROM userdb.credential AS t1 INNER JOIN userdb.user AS t2 ON t1.user_id = t2.id AND t1.resetPasswordToken = "' +token+'" and resetPasswordExpires > '+Date.now(), function (err, rows, fields) { - if (err) { - throw err; - } + if (err) { throw err } else { if ( rows.length > 0) { user = rows[0] - console.log(user) } } - callback(err, user); + callback(err, user) } - ); + ) }, updateUserById: function(userData, callback) { dbconn.user.query('UPDATE user SET ? WHERE id = ' +userData.id, userData, function (err, rows, fields) { -- GitLab From 70638bdb716577e5ffaf98cd2fc54f96bdc8a1c0 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Mon, 8 Mar 2021 21:40:30 +0100 Subject: [PATCH 071/163] update unit test --- __tests__/gitlab.unit.test.js | 92 +++++++++++++++++++++------ __tests__/method.unit.test.js | 79 ++++++++++++----------- __tests__/routes-account.unit.test.js | 5 -- 3 files changed, 110 insertions(+), 66 deletions(-) delete mode 100644 __tests__/routes-account.unit.test.js diff --git a/__tests__/gitlab.unit.test.js b/__tests__/gitlab.unit.test.js index c4cca338..65d02b22 100644 --- a/__tests__/gitlab.unit.test.js +++ b/__tests__/gitlab.unit.test.js @@ -1,29 +1,79 @@ const gitlab = require('../routes/gitlab') -const axios = require('axios') +//const axios = require('axios') +//jest.mock('axios') -beforeAll(() => { - // test gitlab API connection - var config = { - method: 'get', - url: 'https://transfer.hft-stuttgart.de/gitlab/api/v4/projects' - } - - axios(config) - .then(function (response) { - expect(response.statusCode).toBe(200) +describe('GitLab API', () => { + + /* + test('jest.fn recalls what it has been called with', () => { + const mock = jest.fn() + mock('a', 'b', 'c') + expect(mock).toHaveBeenCalledTimes(1) + expect(mock).toHaveBeenCalledWith('a', 'b', 'c') + }); */ + + // mock +/* it('returns an existing gitlab-userID by an email address', done => { + let resp = { + error: false, + data: 1} + axios.get.mockResolvedValue(resp) + + gitlab.getUserIdByEmail('rosanny.sihombing@hft-stuttgart.de', function(resp){ + try { + expect(resp.error).toBeFalsy() + expect(resp.data).not.toBeNull() + done() + } catch (error) { + done(error) + } + }) + }) +*/ + + it('returns an existing gitlab-userID by an email address', done => { + gitlab.getUserIdByEmail('rosanny.sihombing@hft-stuttgart.de', function(data){ + try { + expect(data.error).toBeFalsy() + expect(data.data).not.toBeNull() + done() + } catch (error) { + done(error) + } + }) + }) + + it('returns an error due to the non-exist user', done => { + gitlab.getUserIdByEmail('test@hft-stuttgart.com', function (data) { + try { + expect(data.error).toBeTruthy() + done() + } catch (error) { + done(error) + } }) -}) + }) -describe('GitLab API test', () => { - test("Get a gitlab userID by email", () => { // email = any email address - gitlab.getUserIdByEmail("test@email.de", function(resp){ - expect(resp).not.toBeNull() - }) + it('returns the projects of a particular userId', done => { + gitlab.getUserProjects(3, function (data) { + try { + expect(data.error).toBeFalsy() + expect(data.data).not.toBeNull() + done() + } catch (error) { + done(error) + } }) + }) - test("Get the projects of a particular user", () => { // userID = any integer - gitlab.getUserProjects(3, function(resp){ - expect(resp).not.toBeNull() - }) + it('returns an error due to the wrong userID', done => { + gitlab.getUserProjects('abc', function (data) { + try { + expect(data.error).toBeTruthy() + done() + } catch (error) { + done(error) + } }) + }) }) \ No newline at end of file diff --git a/__tests__/method.unit.test.js b/__tests__/method.unit.test.js index 9c856e1d..9ad00d8e 100644 --- a/__tests__/method.unit.test.js +++ b/__tests__/method.unit.test.js @@ -1,53 +1,52 @@ -const dbconn = require('../routes/dbconn') const methods = require('../routes/methods') -beforeAll(() => { - // test DB connection - dbconn.user.query('SELECT 1 + 5 AS solution', function (err, rows) { - expect(err).toBeNull() - expect(rows[0].solution).toBe(6) - }) - dbconn.project.query('SELECT 10 + 5 AS solution', function (err, rows) { - expect(err).toBeNull() - expect(rows[0].solution).toBe(15) - }) -}) - describe("DB methohds test", () => { -/* - test("Get a user from DB by email", () => { - let gitlabUserData = "to-be-defined" - methods.addGitlabUser(gitlabUserData, function(data, err){ - expect(data).not.toBeNull() - expect(err).toBeNull() - }) - }) */ - - test("Get a user from DB by email", () => { // email = any email address - methods.getUserByEmail("test@email.de", function(data, err){ - expect(data).not.toBeNull() - expect(err).toBeNull() - }) + + it('returns a user from DB by email', done => { + methods.getUserByEmail('rosanny.sihombing@hft-stuttgart.de', function(resp, err){ + try { + expect(resp).not.toBeNull() + expect(err).toBeNull() + done() + } catch (error) { + done(error) + } + }) }) - test("Get a user from DB by ID", () => { // ID = any integer - methods.getUserById(100, function(data, err){ - expect(data).not.toBeNull() - expect(err).toBeNull() - }) + it("returns a user from DB by ID", done => { + methods.getUserById(10, function(resp, err){ + try { + expect(resp).not.toBeNull() + expect(err).toBeNull() + done() + } catch (error) { + done(error) + } + }) }) - test("Check user email", () => { // email = any email address - methods.checkUserEmail("test@email.de", function(err, data){ - expect(data).not.toBeNull() - expect(err).toBeNull() + it("checks user email", done => { + methods.checkUserEmail("test@email.de", function(err, resp){ + try { + expect(resp).not.toBeNull() + expect(err).toBeNull() + done() + } catch (error) { + done(error) + } }) }) - test("Get a user by token", () => { // token = any alphanumeric - methods.checkUserEmail("1abc0qwerty", function(err, data){ - expect(data).not.toBeNull() - expect(err).toBeNull() + it("returns a user by token", done => { + methods.checkUserEmail("1abc0qwerty", function(err, resp){ // token = any alphanumeric + try { + expect(resp).not.toBeNull() + expect(err).toBeNull() + done() + } catch (error) { + done(error) + } }) }) }) diff --git a/__tests__/routes-account.unit.test.js b/__tests__/routes-account.unit.test.js deleted file mode 100644 index 81f63035..00000000 --- a/__tests__/routes-account.unit.test.js +++ /dev/null @@ -1,5 +0,0 @@ -describe('Sample Test', () => { - it('should test that true === true', () => { - expect(true).toBe(true) - }) -}) \ No newline at end of file -- GitLab From a2d207dc5009d073ec85e20529aef8842f44ba92 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Wed, 24 Mar 2021 19:31:42 +0100 Subject: [PATCH 072/163] cosmetic update --- views/DE/account/newInformation.pug | 34 +++++++++++------------ views/DE/account/services.pug | 30 ++++++++++---------- views/DE/account/updateInformation.pug | 38 ++++++-------------------- 3 files changed, 39 insertions(+), 63 deletions(-) diff --git a/views/DE/account/newInformation.pug b/views/DE/account/newInformation.pug index 8055ce0a..8ec6aebd 100644 --- a/views/DE/account/newInformation.pug +++ b/views/DE/account/newInformation.pug @@ -55,11 +55,19 @@ html(lang="de") h4(class="pb-1") Schritt 1: Setup p Bitte füllen Sie alle Felder aus form(method="POST", encType="multipart/form-data") + div(class='form-group row') + label(for="template", class="col-sm-2") Template + div(class="col-sm-8") + select#templateSelector(name="template", class="form-control") + option(value="generic") generic + option(value="simple_raw") simple_raw + option(value="simple_thesis") simple_thesis + | See the demo: generic, simple_raw, simple_thesis div(class='form-group row') label(for="name", class="col-sm-2") Name div(class="col-sm-8") input#name(name="name", type="text", class="form-control", placeholder="Name", maxlength="75" required) - |

Ihre Webseite wird unter folgender URL veröffentlicht: https://transfer.hft-stuttgart.de/pages/

+ p(id="nameInfo" class="font-italic font-weight-light") Ihre Webseite wird unter folgender URL veröffentlicht: https://transfer.hft-stuttgart.de/pages/#{gitlabUsername}/ div(class="form-group row") label(for="description", class="col-sm-2") Beschreibung div(class="col-sm-8") @@ -74,17 +82,8 @@ html(lang="de") h4(class="pb-1") Schritt 2: Dateneingabe p Bitte stellen Sie sicher, dass sie Folgendes abgeschlossen haben, bevor Sie Ihre Webseite veröffentlichen: ol + li index.html li Anpassen der Standardwerte in settings.js - li Anpassen der Kontaktperson in kontakt.html - hr - div(class="mx-4", style="color: gray;") - h4(class="pb-1") Schritt 3: Veröffentlichen - p Folgende Anfrage wird an die Administration des Transferportal gesandt, um ihre Webseite/ Informationsseite zu veröffentlichen: - table(class="table-secondary") - tr - td Guten Tag,

hiermit beantrage Ich die Freischaltung einer Webseite auf dem Transferportal für folgendes Projekt:
project-name.

Vielen Dank,
#{user.fullName} - br - input(type="submit", class="btn btn-primary", value="Nachricht versenden" disabled) // jQuery script(src="https://code.jquery.com/jquery-3.3.1.min.js") @@ -96,20 +95,21 @@ html(lang="de") // M4_LAB script(src="/js/headfoot.js") script. + // website URL function showWebsiteURL() { if ($("#name").val()) { - $("#nameInfo").show(); - let webName = $("#name").val().toLowerCase().replace(/\s/g, '-'); - document.getElementById("websiteName").innerText = webName; + $("#nameInfo").show() + let webName = $("#name").val().toLowerCase().replace(/\s/g, '-') + document.getElementById("websiteName").innerText = webName+"/home/" } else { - $("#nameInfo").hide(); + $("#nameInfo").hide() } } $('#name').on('input',function(e){ - showWebsiteURL(); + showWebsiteURL() }) - showWebsiteURL(); + showWebsiteURL() $("form").submit(function(){ $.LoadingOverlay("show") diff --git a/views/DE/account/services.pug b/views/DE/account/services.pug index 09d2efe5..cd9e05e9 100644 --- a/views/DE/account/services.pug +++ b/views/DE/account/services.pug @@ -50,31 +50,29 @@ html(lang="de") div(class="container") h3(class="pb-2") Projekte div(class="col-sm-12") - if gitlabPages + if user.gitlabUserId div(class="container") - div(class="row pb-1") + div(class="row py-2 bg-light") div(class="col font-weight-bold") Projektinformationen div(class="col text-right") a(href="/account/newInformation" class="btn btn-sm btn-success" role="button") Neue Projektinformation table(class="table") - for item in gitlabPages - - let img = item.logo - - let editNewPageLink = "/account/updateInformation?id="+item.id - - let websiteURL = "https://transfer.hft-stuttgart.de/pages/"+item.path + if gitlabPages.length == 0 tr - td - img(src=img, width="45", height="45") - if item.isPublished - td - a(href=editNewPageLink+"&s=y" class="link-dark") #{item.name} + td Currently you have no project information + else + for item in gitlabPages + - let editNewPageLink = "/account/updateInformation?id="+item.projectInformation.id + - let websiteURL = "https://transfer.hft-stuttgart.de/pages/"+item.projectInformation.path+"/home/" + tr td - a(href=websiteURL target="_blank" class="link-dark") veröffentlicht - else + img(src=item.projectInformation.logo, width="45", height="45") td - a(href=editNewPageLink+"&s=n" class="link-dark") #{item.name} - td noch nicht veröffentlicht + a(href=editNewPageLink class="link-dark") #{item.projectInformation.name} + td + a(href=websiteURL class="link-dark" target="_blank") visit website div(class="container") - div(class="row pb-1") + div(class="row py-2 bg-light") div(class="col font-weight-bold") Projektcode und -daten div(class="col text-right") button(type="button", class="btn btn-sm btn-success" disabled) Neuer Projektdatensatz diff --git a/views/DE/account/updateInformation.pug b/views/DE/account/updateInformation.pug index 4641aea8..b1bf17ae 100644 --- a/views/DE/account/updateInformation.pug +++ b/views/DE/account/updateInformation.pug @@ -51,15 +51,11 @@ html(lang="de") a(class="close", href="#", data-dismiss="alert", aria-label="close") × h3(class="pb-2") Information aktualisieren div(class="mx-4") - if !information.isPublished - h4(class="pb-1") Schritt 1: Setup - p Bitte füllen Sie alle Felder aus form(method="POST", encType="multipart/form-data") div(class='form-group row') label(for="name", class="col-sm-2") Name div(class="col-sm-8") input#name(name="name", type="text", class="form-control", value=information.name, placeholder="Name", maxlength="75" required) - |

Ihre Webseite URL: https://transfer.hft-stuttgart.de/pages/#{information.path}

div(class="form-group row") label(for="description", class="col-sm-2") Beschreibung div(class="col-sm-8") @@ -71,38 +67,20 @@ html(lang="de") img(src=information.logo, width="100" height="100") div(class="form-group row") input#logo(name="logo", class="form-control-file", type="file") - if !information.isPublished - input(name="isPublished", type="hidden", value="false") - else - input(name="isPublished", type="hidden", value="true") input(type="submit", class="btn btn-primary", value="Speichern") hr - div(class="mx-4") - if !information.isPublished - h4(class="pb-1") Schritt 2: Dateneingabe - p Bitte stellen Sie sicher, dass sie Folgendes abgeschlossen haben, bevor Sie Ihre Webseite veröffentlichen: - else - p ANMERKUNG: + div(class="mx-4") + p ANMERKUNG: (Guidelines to complete your website) div(class="card") - div(class="card-header") 1. Anpassen der Standardwerte in settings.js + - let indexLink = "https://transfer.hft-stuttgart.de/gitlab/"+information.path+"/-/edit/master/public/home/index.html" + - let settingLink = "https://transfer.hft-stuttgart.de/gitlab/"+information.path+"/-/edit/master/public/settings.js" + div(class="card-header") 1. index.html + div(class="card-body") + p Klicken Sie anschließend auf commit changes, um die Änderungen zu speichern. + div(class="card-header") 2. Anpassen der Standardwerte in settings.js div(class="card-body") Passen Sie die Werte für projektname und projektseitenlink an, indem Sie die entsprechenden Werte in die Anführungszeichen schreiben. img(src="https://m4lab.hft-stuttgart.de/img/help/edit_settings.png", class="img-fluid", style="border: 1px solid gray;", alt="setting.js") p Klicken Sie anschließend auf commit changes, um die Änderungen zu speichern. - div(class="card") - div(class="card-header") 2. Anpassen der Kontaktperson in kontakt.html - div(class="card-body") Passen Sie die Kontaktperson und die Mailadresse an, indem Sie alle Vorkommen von Max Mustermann und die Mailadresse durch Ihre Werte ersetzen. - img(src="https://m4lab.hft-stuttgart.de/img/help/edit_contact.png", class="img-fluid", style="border: 1px solid gray;", alt="kontakt.html") - p Klicken Sie anschließend auf commit changes, um die Änderungen zu speichern. - hr - div(class="mx-4") - if !information.isPublished - h4(class="pb-1") Schritt 3: Veröffentlichen - p Folgende Anfrage wird an die Administration des Transferportal gesandt, um ihre Webseite/ Informationsseite zu veröffentlichen: - table(class="table-secondary") - tr - td Guten Tag,

hiermit beantrage Ich die Freischaltung einer Webseite auf dem Transferportal für folgendes Projekt:
#{information.name}

Vielen Dank,
#{user.fullName} - br - button(type="button", class="btn btn-primary", onclick="sendPublishRequest()") Nachricht versenden // jQuery script(src="https://code.jquery.com/jquery-3.3.1.min.js") -- GitLab From 344319f57226c2e2ddf7d517d646492151924e6b Mon Sep 17 00:00:00 2001 From: Rosanny Date: Wed, 24 Mar 2021 19:37:05 +0100 Subject: [PATCH 073/163] functionality updates --- classes/repo.js | 4 +- classes/website.js | 22 +--- routes/gitlab.js | 169 ++++++++++++------------ routes/routes-account.js | 269 ++++++++++++++------------------------- 4 files changed, 177 insertions(+), 287 deletions(-) diff --git a/classes/repo.js b/classes/repo.js index f0fef1f3..c99ac66f 100644 --- a/classes/repo.js +++ b/classes/repo.js @@ -1,8 +1,8 @@ const Project = require("./project"); class Repo extends Project { - constructor(ownerGitlabId, id, name, desc, logo) { - super(ownerGitlabId, id, name, desc, logo) + constructor(ownerGitlabId, id, name, desc, logo, path) { + super(ownerGitlabId, id, name, desc, logo, path) } } diff --git a/classes/website.js b/classes/website.js index 98189269..1d05c400 100644 --- a/classes/website.js +++ b/classes/website.js @@ -1,28 +1,8 @@ const Project = require("./project"); class Website extends Project { - constructor(ownerGitlabId, id, name, desc, logo, path, settingUrl, kontaktUrl, isPublished) { + constructor(ownerGitlabId, id, name, desc, logo, path) { super(ownerGitlabId, id, name, desc, logo, path) - this.settingUrl = settingUrl - this.kontaktUrl = kontaktUrl - this.isPublished = isPublished - } - // getter - getSettingUrl() { - return this.settingUrl - } - getKontaktUrl() { - return this.kontaktUrl - } - getIsPublished() { - return this.isPublished - } - // setter - setSettingUrl(newSettingUrl) { - this.settingUrl = newSettingUrl - } - setKontaktUrl(newKontaktUrl) { - this.kontaktUrl = newKontaktUrl } } diff --git a/routes/gitlab.js b/routes/gitlab.js index 49e89807..8766d917 100644 --- a/routes/gitlab.js +++ b/routes/gitlab.js @@ -5,67 +5,52 @@ const fs = require('fs') var formData = require('form-data') var gitlab = { - getUserIdByEmail: function(email, callback) { - let dataConfig = { + // todo: GraphQL currentUser + + getUserByEmail: async function(email) { + return axios({ method: 'get', url: 'https://transfer.hft-stuttgart.de/gitlab/api/v4/users?search='+email, headers: { 'Authorization': 'Bearer '+config.gitlab.token_readWriteProjects} - } - - axios(dataConfig) - .then(function (response) { - let res = { - error: false, - data: response.data[0].id} - callback(res) }) - .catch(function (err) { - let res = { - error: true, - data: err} - callback(res) + .then(res => userData = { + id: res.data[0].id, + username: res.data[0].username }) + .catch(err => console.error(err)) }, - createNewPages: function(newPagesData, newLogoFile, callback) { + createNewPages: async function(newPagesData, newLogoFile, template) { let data = new formData() data.append('avatar', fs.createReadStream(newLogoFile)) - let dataConfig = { + return axios({ method: 'post', url: 'https://transfer.hft-stuttgart.de/gitlab/api/v4/projects/user/'+newPagesData.getOwnerGitlabId()+ '?name='+newPagesData.getName()+'&description='+newPagesData.getDesc()+'&tag_list=website'+ - '&use_custom_template=true&template_name=page_basic', + '&use_custom_template=true&template_name='+template, headers: { 'Authorization': 'Bearer '+config.gitlab.token_readWriteProjects, ...data.getHeaders() }, - data : data - } - - axios(dataConfig) - .then(response => { - let res = { - error: false, - data: response.data} - callback(res) + data: data }) - .catch(err => { - console.log(err) - let res = { - error: true, - data: err.response.data} - callback(res) + .then(res => res = { + error: false, + data: res.data + }) + .catch(err => res = { + error: true, + data: err.response.data }) }, - updateProject: function(updatedProjectData, newLogoFile, callback){ - console.log(updatedProjectData) + updateProject: async function(updatedProjectData, newLogoFile){ let data = new formData() if (newLogoFile) { data.append('avatar', fs.createReadStream(newLogoFile)) } - - let dataConfig = { + + return axios({ method: 'put', url: 'https://transfer.hft-stuttgart.de/gitlab/api/v4/projects/'+updatedProjectData.getId()+ '?name='+updatedProjectData.getName()+'&description='+updatedProjectData.getDesc(), @@ -74,68 +59,70 @@ var gitlab = { ...data.getHeaders() }, data : data - } - - axios(dataConfig) - .then(response => { - let res = { - error: false, - data: response.data} - callback(res) }) - .catch(err => { - console.log(err) - let res = { - error: true, - data: err.response.data} - callback(res) + .then(res => res = { + error: false, + data: res.data + }) + .catch(err => res = { + error: true, + data: err.response.data + }) + }, + getUserProjects: async function(gitlabUserId) { + return axios({ + method: 'get', + url: 'https://transfer.hft-stuttgart.de/gitlab/api/v4/users/'+gitlabUserId+'/projects?private_token='+ + config.gitlab.token_readWriteProjects+'&owned=true&simple=true&visibility=public' }) + .then(res => res.data) + .catch(err => console.error(err)) }, - getUserProjects: function(gitlabUserId, callback) { - axios.get('https://transfer.hft-stuttgart.de/gitlab/api/v4/users/'+gitlabUserId+'/projects?private_token='+ - config.gitlab.token_readWriteProjects+'&owned=true&simple=true&visibility=public') - .then(response => { - let res = { - error: false, - data: response.data} - callback(res) + getProjectById: async function(projectId) { + return axios({ + method: 'get', + url: 'https://transfer.hft-stuttgart.de/gitlab/api/v4/projects/'+projectId+'?private_token='+ + config.gitlab.token_readWriteProjects }) - .catch(err => { - let res = { - error: true, - data: err.message} - callback(res) + .then(res => res.data) + .catch(err => console.error(err)) + }, + getProjectPipelineLatestStatus: async function(projectId) { + return axios({ + method: 'get', + url: 'https://transfer.hft-stuttgart.de/gitlab/api/v4/projects/'+projectId+'/pipelines' }) + .then(res => res.data[0].status) + .catch(err => console.error(err)) }, - getProjectIdsFromRunners: function(gitlabUserId, callback) { - let projectIds = [] - let dataConfig = { + // delete peoject: https://docs.gitlab.com/ee/api/projects.html#delete-project + // + // test GraphQL + getGraphqlTest: function(callback) { + axios({ + url: 'https://gitlab.com/api/graphql', method: 'get', - url: 'https://transfer.hft-stuttgart.de/gitlab/api/v4/runners/7', - headers: { - 'Authorization': 'Bearer '+config.gitlab.token_readWriteProjects} - } - - axios(dataConfig) - .then(function (response) { - let projects = response.data.projects - projects.forEach((project) => { - if(project.namespace.id == gitlabUserId) { - projectIds.push(project.id) + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer '+config.gitlab.token_readWriteProjects + }, + data: { + query: `{ + currentUser { + id + username + } + }` + /* query: `{ + projects { + nodes { + id + } } - }) - let res = { - error: false, - data: projectIds} - - callback(res) - }) - .catch(function (err) { - let res = { - error: true, - data: err} - - callback(res) + }` */ + } + }).then((result) => { + console.log(JSON.stringify(result.data)) }); } } diff --git a/routes/routes-account.js b/routes/routes-account.js index 5baa62a4..269ab1ff 100644 --- a/routes/routes-account.js +++ b/routes/routes-account.js @@ -13,6 +13,7 @@ const crypto = require('crypto') const mailer = require('./mailer') const logoDir = 'public/upload/' const tpGitlabURL = 'https://transfer.hft-stuttgart.de/gitlab/' +const tpGitlabPagesURL = 'https://transfer.hft-stuttgart.de/pages/' const portalUser = require('../classes/user') const projectInformation = require('../classes/website') @@ -128,7 +129,6 @@ module.exports = function (app, config, passport, i18n) { } }) } - res.render(lang+'/account/home', { user: loggedInUser }); @@ -180,7 +180,7 @@ module.exports = function (app, config, passport, i18n) { } }) - app.get('/services', function(req, res){ + app.get('/services', async function(req, res){ if(!req.isAuthenticated() && !loggedInUser) { res.redirect('/login') } else { @@ -189,65 +189,45 @@ module.exports = function (app, config, passport, i18n) { } else { let gitlabReposArr = [] let gitlabPagesArr = [] - + if(loggedInUser.getGitlabUserId()) { // for users who have activated their gitlab account - async.waterfall([ - // check projects in runners - function(callback) { - let gitlabRunnersProjectIdsArr - gitlab.getProjectIdsFromRunners(loggedInUser.getGitlabUserId(), function(data){ - if(data.error) - return res.status(500).send(data.data) - gitlabRunnersProjectIdsArr = data.data - callback(null, gitlabRunnersProjectIdsArr) - }) - } - ], function(err, gitlabRunnersProjectIdsArr) { - // get user projects - gitlab.getUserProjects(loggedInUser.getGitlabUserId(), function(data){ - if (data.error) - return res.status(500).send(data.data) - let gitlabData = data.data - for(let i = 0; i < gitlabData.length; i++){ - if (gitlabData[i].tag_list.includes('website')) { - let idxRunners = gitlabRunnersProjectIdsArr.indexOf(gitlabData[i].id) - let isWebsitePublished = false - if (idxRunners > 0) { - isWebsitePublished = true - } - let page = new projectInformation(loggedInUser.getGitlabUserId(), gitlabData[i].id, gitlabData[i].name, gitlabData[i].description, - gitlabData[i].avatar_url, gitlabData[i].path, null, null, isWebsitePublished) - gitlabPagesArr.push(page) - } else { - let repo = new projectRepo(loggedInUser.getGitlabUserId(), gitlabData[i].id, gitlabData[i].name, gitlabData[i].description, - gitlabData[i].avatar_url, gitlabData[i].path) - gitlabReposArr.push(repo) - } + let userProjects = await gitlab.getUserProjects(loggedInUser.getGitlabUserId()) + if (!userProjects) + res.status(500).send("something went wrong :/") + + for (project in userProjects) { + if (userProjects[project].tag_list.includes('website')) { + let page = { + projectInformation: new projectInformation(loggedInUser.getGitlabUserId(), userProjects[project].id, userProjects[project].name, + userProjects[project].description, userProjects[project].avatar_url, userProjects[project].path_with_namespace), + pipelineStatus: await gitlab.getProjectPipelineLatestStatus(userProjects[project].id) } - - res.render(lang+'/account/services', { - user: loggedInUser, - gitlabRepos: gitlabReposArr, - gitlabPages: gitlabPagesArr - }) - }) + gitlabPagesArr.push(page) + } else { + let repo = new projectRepo(loggedInUser.getGitlabUserId(), userProjects[project].id, userProjects[project].name, + userProjects[project].description, userProjects[project].avatar_url, userProjects[project].path_with_namespace) + gitlabReposArr.push(repo) + } + } + + res.render(lang+'/account/services', { + user: loggedInUser, + gitlabRepos: gitlabReposArr, + gitlabPages: gitlabPagesArr }) } else { // for users who have not activated their gitlab account yet - gitlab.getUserIdByEmail(loggedInUser.getEmail(), function(data){ - if (data.error) { - res.status(500).render(lang+'/500', { error: data.data }) + let gitlabUser = await gitlab.getUserByEmail(loggedInUser.getEmail()) + // RS: if error, then what? + let gitlabActivationData = { + user_id: loggedInUser.getId(), + gitlab_userId: gitlabUser.id} + // RS: update to await + methods.addGitlabUser(gitlabActivationData, function(err){ + if(err) { + res.status(500).render(lang+'/500', { error: err }) } else { - let gitlabActivationData = { - user_id: loggedInUser.getId(), - gitlab_userId: data.data} - methods.addGitlabUser(gitlabActivationData, function(err){ - if(err) { - res.status(500).render(lang+'/500', { error: err }) - } else { - loggedInUser.setGitlabUserId(gitlabActivationData.gitlab_userId) - res.redirect('/account/services') - } - }) + loggedInUser.setGitlabUserId(gitlabActivationData.gitlab_userId) + res.redirect('/account/services') } }) } @@ -480,13 +460,19 @@ module.exports = function (app, config, passport, i18n) { // ============= NEW GITLAB PAGES =========================== - app.get('/newInformation', function(req, res){ + app.get('/newInformation', async function(req, res){ if (!req.isAuthenticated() && !loggedInUser) { res.redirect('/login') } else { - res.render(lang+'/account/newInformation', { - user: loggedInUser - }) + let gitlabUser = await gitlab.getUserByEmail(loggedInUser.getEmail()) + if (!gitlabUser) { // no user found + res.redirect('/account/service') + } else { + res.render(lang+'/account/newInformation', { + user: loggedInUser, + gitlabUsername: gitlabUser.username + }) + } } }) app.post('/newInformation', function(req, res) { @@ -499,7 +485,8 @@ module.exports = function (app, config, passport, i18n) { } else { let projectName = req.body.name.toLowerCase().replace(/\s/g, '-') let projectDesc = req.body.description - let newInformation = new projectInformation(loggedInUser.getGitlabUserId(), null, projectName, projectDesc, null, null, null, null, false) + let projectTemplate = req.body.template + let newInformation = new projectInformation(loggedInUser.getGitlabUserId(), null, projectName, projectDesc, null, null) if (!req.files) { res.flash('error', 'Bitte geben Sie ein Projektlogo an.') @@ -513,28 +500,23 @@ module.exports = function (app, config, passport, i18n) { callback(err, newLogoFile) }) }, - function(newLogoFile, callback){ // create a new GitLab Page - gitlab.createNewPages(newInformation, newLogoFile, function(data){ - let result = data.data - if (data.error) { - if(result.message.name == "has already been taken") { - res.flash("error", "Der Projektname '"+newInformation.getName()+"' ist bereits vergeben, bitte wählen Sie einen anderen Namen.") - } else { - res.flash("error", "Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut. ") - } - res.redirect('/account/newInformation') + async function(newLogoFile){ // create a new GitLab Page + let newPages = await gitlab.createNewPages(newInformation, newLogoFile, projectTemplate) + if (newPages.error) { + if(newPages.data.message.name == "has already been taken") { + res.flash("error", "Der Projektname '"+newInformation.getName()+"' ist bereits vergeben, bitte wählen Sie einen anderen Namen.") } else { - newInformation.setId(result.id) - newInformation.setLogo(result.avatar_url) - newInformation.setPath(result.path) - newInformation.setSettingUrl(tpGitlabURL+result.namespace.path+'/'+result.name+'/-/edit/master/public/settings.js') - newInformation.setKontaktUrl(tpGitlabURL+result.namespace.path+'/'+result.name+'/-/edit/master/public/kontakt.html') - - res.flash("success", "Ihre Webseite wurde erstellt, aber noch nicht veröffentlicht. Bitte fahren Sie mit Schritten 2 und 3 fort, um Ihre Webseite zu veröffentlichen.") - res.redirect('/account/updateInformation?id='+newInformation.getId()+'&s=n') + res.flash("error", "Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut. ") } - callback(null) - }) + res.redirect('/account/newInformation') + } else { + let newPagesData = newPages.data + + //res.flash("success", "Ihre Webseite wurde erstellt, aber noch nicht veröffentlicht. Bitte fahren Sie mit Schritten 2 und 3 fort, um Ihre Webseite zu veröffentlichen.") + res.flash("success", "Your website will be published AFTER you complete your website by following the provided guideline below."+ + "\r\n Your website URL: "+tpGitlabPagesURL+newPagesData.path_with_namespace+"/home/") + res.redirect('/account/updateInformation?id='+newPagesData.id) + } } ], function (err) { if(err) console.log(err) @@ -548,51 +530,33 @@ module.exports = function (app, config, passport, i18n) { } }) - app.get('/updateInformation', function(req, res){ + app.get('/updateInformation', async function(req, res){ if(!req.isAuthenticated() && !loggedInUser) { res.redirect('/login') } else { if(!req.query.id) { res.redirect('/account/services') } else { - gitlab.getUserProjects(loggedInUser.getGitlabUserId(), function(data){ - if (data.error) { - res.status(500).render(lang+'/500', { error: data.data }) - } else { - // quick way to decide whether a website is already published or not - let informationStatus - if(req.query.s != "y" && req.query.s != "n") { - res.redirect('/account/services') - } else { - if(req.query.s == "y") { - informationStatus = true - } else if(req.query.s == "n") { - informationStatus = false - } - let gitlabData = data.data - let curInformation = new projectInformation(loggedInUser.getGitlabUserId(), req.query.id, null, null, null, null, null, null, informationStatus) - for(let i = 0; i < gitlabData.length; i++){ - if (gitlabData[i].id == req.query.id) { - curInformation.setName(gitlabData[i].name) - curInformation.setDesc(gitlabData[i].description) - curInformation.setLogo(gitlabData[i].avatar_url) - curInformation.setPath(gitlabData[i].path) - curInformation.setSettingUrl(tpGitlabURL+gitlabData[i].path_with_namespace+'/-/edit/master/public/settings.js') - curInformation.setKontaktUrl(tpGitlabURL+gitlabData[i].path_with_namespace+'/-/edit/master/public/kontakt.html') - - break - } - } - res.render(lang+'/account/updateInformation', { - user: loggedInUser, - information: curInformation - }) - } - } - }) + let project = await gitlab.getProjectById(req.query.id) + if (!project) { + console.log(" =================== error or no project found") + res.redirect('/account/services') + } else if (project.owner.id != loggedInUser.getGitlabUserId()) { + console.log(" =================== not your project") + res.redirect('/account/services') + } else { + let curInformation = new projectInformation(loggedInUser.getGitlabUserId(), req.query.id, project.name, project.description, + project.avatar_url, project.path_with_namespace) + + res.render(lang+'/account/updateInformation', { + user: loggedInUser, + information: curInformation + }) + } } } }) + app.post('/updateInformation', function(req, res){ if(!req.isAuthenticated() && !loggedInUser) { res.redirect('/login') @@ -603,13 +567,9 @@ module.exports = function (app, config, passport, i18n) { } else { let projectName = req.body.name.toLowerCase().replace(/\s/g, '-') let projectDesc = req.body.description - let isProjectPublished = true - if (req.body.isPublished == "false") { - isProjectPublished = false - } - let updatedInformation = new projectInformation(loggedInUser.getGitlabUserId(), req.query.id, projectName, projectDesc, null, null, null, null, isProjectPublished) - + let updatedInformation = new projectInformation(loggedInUser.getGitlabUserId(), req.query.id, projectName, projectDesc, null, null) let newLogoFile + async.waterfall([ function(callback){ // upload logo if(!req.files) { @@ -622,26 +582,21 @@ module.exports = function (app, config, passport, i18n) { }) } }, - function(newLogoFile, callback){ // update gitlab page - gitlab.updateProject(updatedInformation, newLogoFile, function(data){ - let result = data.data - if (data.error) { - if(result.message.name == "has already been taken") { - res.flash("error", "Der Projektname ist bereits vergeben, bitte wählen Sie einen anderen Namen.") - } else { - res.flash("error", "Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut. ") - } + async function(newLogoFile, callback){ // update gitlab page + let updatedPages = await gitlab.updateProject(updatedInformation, newLogoFile) + let pagesData = updatedPages.data + if (pagesData.error) { + if(pagesData.message.name == "has already been taken") { + res.flash("error", "Der Projektname ist bereits vergeben, bitte wählen Sie einen anderen Namen.") } else { - updatedInformation.setLogo(result.avatar_url) - updatedInformation.setPath(result.path) - updatedInformation.setSettingUrl(tpGitlabURL+result.namespace.path+'/'+result.name+'/-/edit/master/public/settings.js') - updatedInformation.setKontaktUrl(tpGitlabURL+result.namespace.path+'/'+result.name+'/-/edit/master/public/kontakt.html') - res.flash("success", "Your website has been updated") + res.flash("error", "Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut. ") } - res.redirect('/account/updateInformation?id='+updatedInformation.getId()) - - callback(null) - }) + } else { + updatedInformation.setLogo(pagesData.avatar_url) + updatedInformation.setPath(pagesData.path) + res.flash("success", "Your website has been updated") + } + res.redirect('/account/updateInformation?id='+updatedInformation.getId()) } ], function (err) { if(err) console.log(err) @@ -657,38 +612,6 @@ module.exports = function (app, config, passport, i18n) { // RS: delete projektInformation? - app.post('/sendPublishRequest', function(req, res) { - if (!req.isAuthenticated() && loggedInUser) { - res.redirect('/login') - } else { - let emailAddress = loggedInUser.getEmail() - let supportAddress = "support-transfer@hft-stuttgart.de" - let projectName = req.body.projectName - let emailContent = "Guten Tag, \n\nhiermit beantrage Ich die Freischaltung einer Webseite auf dem Transferportal für folgendes Projekt: \n" - +projectName+"\n\nVielen Dank,\n"+loggedInUser.getFullName() - let emailSubject = "M4_LAB Anfrage zur Veröffentlichung einer neuen Webseite" - async.waterfall([ - function(done) { - mailer.options.to = supportAddress - mailer.options.cc = emailAddress - mailer.options.subject = emailSubject - mailer.options.text = emailContent - mailer.transport.sendMail(mailer.options, function(err) { - done(err, 'done') - }) - } - ], function(err) { - if (err) { - console.log(err) - res.send('Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut.') - } - else { - res.send('Vielen Dank für Ihre Anfrage. Eine Kopie Ihrer Anfrage wurde an ' + emailAddress + ' versandt.') - } - }) - } - }) - // ============= NEW USERS REGISTRATION =========================== app.get('/registration', function(req, res) { res.render(lang+'/account/registration') -- GitLab From 4447a18eea05cf19e37daae0eb7b904058508379 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Wed, 24 Mar 2021 20:13:50 +0100 Subject: [PATCH 074/163] update unit test --- __tests__/gitlab.unit.test.js | 62 +++++++++++++---------------------- 1 file changed, 22 insertions(+), 40 deletions(-) diff --git a/__tests__/gitlab.unit.test.js b/__tests__/gitlab.unit.test.js index 65d02b22..8c453038 100644 --- a/__tests__/gitlab.unit.test.js +++ b/__tests__/gitlab.unit.test.js @@ -30,50 +30,32 @@ describe('GitLab API', () => { }) }) */ - - it('returns an existing gitlab-userID by an email address', done => { - gitlab.getUserIdByEmail('rosanny.sihombing@hft-stuttgart.de', function(data){ - try { - expect(data.error).toBeFalsy() - expect(data.data).not.toBeNull() - done() - } catch (error) { - done(error) - } - }) - }) - it('returns an error due to the non-exist user', done => { - gitlab.getUserIdByEmail('test@hft-stuttgart.com', function (data) { - try { - expect(data.error).toBeTruthy() - done() - } catch (error) { - done(error) - } - }) + test('returns an existing gitlab user by an email address', async () => { + let user = await gitlab.getUserByEmail('putavaliduseremailaddress@here.com') + expect(user).not.toBeNull() + }) + test('returns an undefined user', async () => { + let user = await gitlab.getUserByEmail('johndoe@nowhere.com') + expect(user).toBeUndefined() }) - it('returns the projects of a particular userId', done => { - gitlab.getUserProjects(3, function (data) { - try { - expect(data.error).toBeFalsy() - expect(data.data).not.toBeNull() - done() - } catch (error) { - done(error) - } - }) + test('returns users project', async () => { + let userProjects = await gitlab.getUserProjects('put a valid user id in integer here') + expect(userProjects).toBeDefined() + }) + test('returns undefined projects, due to non-existing gitlab user ID', async () => { + let userProjects = await gitlab.getUserProjects(0) + expect(userProjects).toBeUndefined() }) - it('returns an error due to the wrong userID', done => { - gitlab.getUserProjects('abc', function (data) { - try { - expect(data.error).toBeTruthy() - done() - } catch (error) { - done(error) - } - }) + test('returns a project by ID', async () => { + let project = await gitlab.getProjectById(13) // m4lab_landing_page + expect(project).toBeDefined() + }) + test('returns undefined, due to invalid project ID', async () => { + let project = await gitlab.getProjectById(0) + expect(project).toBeUndefined() }) + }) \ No newline at end of file -- GitLab From 162899310fbc5faa6e77bc945a3942f849cf5854 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Thu, 25 Mar 2021 09:26:54 +0100 Subject: [PATCH 075/163] remove unused codes --- __tests__/gitlab.unit.test.js | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/__tests__/gitlab.unit.test.js b/__tests__/gitlab.unit.test.js index 8c453038..5159e0b2 100644 --- a/__tests__/gitlab.unit.test.js +++ b/__tests__/gitlab.unit.test.js @@ -3,34 +3,6 @@ const gitlab = require('../routes/gitlab') //jest.mock('axios') describe('GitLab API', () => { - - /* - test('jest.fn recalls what it has been called with', () => { - const mock = jest.fn() - mock('a', 'b', 'c') - expect(mock).toHaveBeenCalledTimes(1) - expect(mock).toHaveBeenCalledWith('a', 'b', 'c') - }); */ - - // mock -/* it('returns an existing gitlab-userID by an email address', done => { - let resp = { - error: false, - data: 1} - axios.get.mockResolvedValue(resp) - - gitlab.getUserIdByEmail('rosanny.sihombing@hft-stuttgart.de', function(resp){ - try { - expect(resp.error).toBeFalsy() - expect(resp.data).not.toBeNull() - done() - } catch (error) { - done(error) - } - }) - }) -*/ - test('returns an existing gitlab user by an email address', async () => { let user = await gitlab.getUserByEmail('putavaliduseremailaddress@here.com') expect(user).not.toBeNull() @@ -57,5 +29,4 @@ describe('GitLab API', () => { let project = await gitlab.getProjectById(0) expect(project).toBeUndefined() }) - }) \ No newline at end of file -- GitLab From c40a4119945290da5bd141a264c0c3955d30f8b0 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Thu, 25 Mar 2021 09:48:09 +0100 Subject: [PATCH 076/163] fix broken links --- app.js | 6 +++--- views/DE/account/newInformation.pug | 2 +- views/DE/account/services.pug | 2 +- views/DE/account/updateInformation.pug | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app.js b/app.js index e0c604ab..8ff8ef12 100644 --- a/app.js +++ b/app.js @@ -69,14 +69,14 @@ app.use(function(req, res, next) { require('./routes/routes-account')(app, config, passport, i18n); // Handle 404 -app.use(function (req, res, next) { - res.status(404).render('./DE/404') +app.use(function (req, res) { + res.status(404).render('DE/404') }) // Handle 500 - any server error app.use(function (err, req, res, next) { console.error(err.stack) - res.status(500).render('./DE/500', { + res.status(500).render('DE/500', { error: err }) }) diff --git a/views/DE/account/newInformation.pug b/views/DE/account/newInformation.pug index 8ec6aebd..179770cd 100644 --- a/views/DE/account/newInformation.pug +++ b/views/DE/account/newInformation.pug @@ -38,7 +38,7 @@ html(lang="de") nav(aria-label="breadcrumb") ol(class="breadcrumb") li(class="breadcrumb-item") - a(href="/account") Konto + a(href="/account/") Konto li(class="breadcrumb-item") a(href="/account/services") Projekte und Dienste li(class="breadcrumb-item active" aria-current="page") Neue Projektinformation diff --git a/views/DE/account/services.pug b/views/DE/account/services.pug index cd9e05e9..7d3b56aa 100644 --- a/views/DE/account/services.pug +++ b/views/DE/account/services.pug @@ -38,7 +38,7 @@ html(lang="de") nav(aria-label="breadcrumb") ol(class="breadcrumb") li(class="breadcrumb-item") - a(href="/account") Konto + a(href="/account/") Konto li(class="breadcrumb-item active" aria-current="page") Projekte und Dienste div(class="container") diff --git a/views/DE/account/updateInformation.pug b/views/DE/account/updateInformation.pug index b1bf17ae..d2a4fd15 100644 --- a/views/DE/account/updateInformation.pug +++ b/views/DE/account/updateInformation.pug @@ -38,7 +38,7 @@ html(lang="de") nav(aria-label="breadcrumb") ol(class="breadcrumb") li(class="breadcrumb-item") - a(href="/account") Konto + a(href="/account/") Konto li(class="breadcrumb-item") a(href="/account/services") Projekte und Dienste li(class="breadcrumb-item active" aria-current="page") Information aktualisieren -- GitLab From ed99c33df8645c26e72d2adbd9b44430f49d03aa Mon Sep 17 00:00:00 2001 From: Rosanny Date: Thu, 25 Mar 2021 11:24:28 +0100 Subject: [PATCH 077/163] DE translation --- routes/routes-account.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routes/routes-account.js b/routes/routes-account.js index 269ab1ff..0a62ba0f 100644 --- a/routes/routes-account.js +++ b/routes/routes-account.js @@ -594,7 +594,7 @@ module.exports = function (app, config, passport, i18n) { } else { updatedInformation.setLogo(pagesData.avatar_url) updatedInformation.setPath(pagesData.path) - res.flash("success", "Your website has been updated") + res.flash("success", "Ihre Website wurde aktualisiert") } res.redirect('/account/updateInformation?id='+updatedInformation.getId()) } -- GitLab From 932aed28aabce6b29b4650fc182997084cfe54d1 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Thu, 25 Mar 2021 11:28:57 +0100 Subject: [PATCH 078/163] update README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0de3d946..4c51fd33 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ User Account Management -Re-implementation of https://transfer.hft-stuttgart.de/gitlab/sihombing/portal/tree/master/app-useracc using NodeJS and ExpressJS \ No newline at end of file +MLAB-481 branch should be created from this branch \ No newline at end of file -- GitLab From a9b7d1c848671a972e5d5e9a7871a17729dac46e Mon Sep 17 00:00:00 2001 From: Rosanny Date: Fri, 26 Mar 2021 10:48:03 +0100 Subject: [PATCH 079/163] test: gitlab user id --- views/DE/account/newInformation.pug | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/views/DE/account/newInformation.pug b/views/DE/account/newInformation.pug index 179770cd..b2b90516 100644 --- a/views/DE/account/newInformation.pug +++ b/views/DE/account/newInformation.pug @@ -16,7 +16,7 @@ html(lang="de") ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") li(class="nav-item") a(class="nav-link pl-0 text-nowrap" href="/account/") - span(class="font-weight-bold" style="color:black;") #{user.firstName} #{user.lastName} + span(class="font-weight-bold" style="color:black;") #{user.firstName} #{user.lastName} - #{user.gitlabUserId} li(class="nav-item") a(class="nav-link pl-0" href="/account/profile") i(class="fa fa-user fa-fw") @@ -72,10 +72,14 @@ html(lang="de") label(for="description", class="col-sm-2") Beschreibung div(class="col-sm-8") textarea#description(name="description", type="text", class="form-control", placeholder="Beschreibung", maxlength="500" required) - div(class="form-group row") + div(class="form-group row") label(for="logo", class="col-sm-2") Projektlogo div(class="col-sm-8") - input#logo(name="logo", class="form-control-file", type="file" required) + div(class="form-group row px-4") + - let defaultLogo = "https://m4lab.hft-stuttgart.de/img/footer/M4_LAB_LOGO_Graustufen.png" + img(src=defaultLogo, width="100" height="100") + div(class="form-group row px-3") + input#logo(name="logo", class="form-control-file", type="file") input(type="submit", class="btn btn-primary", value="Senden") hr div(class="mx-4", style="color: gray;") -- GitLab From 4fead12ba426cd109fc99c6b4e9ff08c67e39952 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Wed, 31 Mar 2021 20:22:50 +0200 Subject: [PATCH 080/163] path update --- views/DE/account/profile.pug | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/DE/account/profile.pug b/views/DE/account/profile.pug index 282fe411..135678b7 100644 --- a/views/DE/account/profile.pug +++ b/views/DE/account/profile.pug @@ -38,7 +38,7 @@ html(lang="de") nav(aria-label="breadcrumb") ol(class="breadcrumb") li(class="breadcrumb-item") - a(href="/account") Konto + a(href="/account/") Konto li(class="breadcrumb-item active" aria-current="page") Benutzerprofil if flash.success -- GitLab From 0b5fb9dbd7a79f2501f9c25aa25be89d9fe90608 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Wed, 31 Mar 2021 20:23:35 +0200 Subject: [PATCH 081/163] libs update --- package-lock.json | 168 ++++++++++++++++++++++++++++++++++------------ package.json | 3 +- 2 files changed, 126 insertions(+), 45 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9bad77a8..5879f569 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2020,6 +2020,11 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, + "denque": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", + "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==" + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -2598,6 +2603,14 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=" }, + "generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "requires": { + "is-property": "^1.0.2" + } + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -3150,6 +3163,11 @@ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" + }, "is-redirect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", @@ -4892,6 +4910,11 @@ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -5154,6 +5177,57 @@ "sqlstring": "2.3.1" } }, + "mysql2": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.2.5.tgz", + "integrity": "sha512-XRqPNxcZTpmFdXbJqb+/CtYVLCx14x1RTeNMD4954L331APu75IC74GDqnZMEt1kwaXy6TySo55rF2F3YJS78g==", + "requires": { + "denque": "^1.4.1", + "generate-function": "^2.3.1", + "iconv-lite": "^0.6.2", + "long": "^4.0.0", + "lru-cache": "^6.0.0", + "named-placeholders": "^1.1.2", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "sqlstring": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", + "integrity": "sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "named-placeholders": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", + "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", + "requires": { + "lru-cache": "^4.1.3" + } + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -5503,26 +5577,25 @@ } }, "passport-saml": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/passport-saml/-/passport-saml-1.4.2.tgz", - "integrity": "sha512-RJXtuiv4KWazi4zmZGVqN5pf3bV2aFbOygYzUCDEBDdeOD0yHFL4ymPOpLPXg35HvilFYTzB94JRWqwLdI2ecw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/passport-saml/-/passport-saml-2.1.0.tgz", + "integrity": "sha512-czrh1ymuAOkDi7vIl1WEa2MLHQiqKKZEEOtaf0JUlMS0UaXbqCTj12wnYkZJdkKR/l1EkmmHcudvtCSsAoYpUQ==", "requires": { - "debug": "^3.1.0", + "debug": "^4.3.1", "passport-strategy": "*", - "q": "^1.5.0", - "xml-crypto": "^2.0.0", - "xml-encryption": "1.2.1", - "xml2js": "0.4.x", - "xmlbuilder": "^11.0.0", - "xmldom": "0.1.x" + "xml-crypto": "^2.1.1", + "xml-encryption": "^1.2.3", + "xml2js": "^0.4.23", + "xmlbuilder": "^15.1.1", + "xmldom": "0.5.x" }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } } } @@ -5835,11 +5908,6 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" - }, "qs": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", @@ -6381,6 +6449,11 @@ } } }, + "seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" + }, "serve-static": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", @@ -7337,30 +7410,30 @@ "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" }, "xml-crypto": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xml-crypto/-/xml-crypto-2.0.0.tgz", - "integrity": "sha512-/a04qr7RpONRZHOxROZ6iIHItdsQQjN3sj8lJkYDDss8tAkEaAs0VrFjb3tlhmS5snQru5lTs9/5ISSMdPDHlg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/xml-crypto/-/xml-crypto-2.1.1.tgz", + "integrity": "sha512-M+m4+HIJa83lu/CnspQjA7ap8gmanNDxxRjSisU8mPD4bqhxbo5N2bdpvG2WgVYOrPpOIOq55iY8Cz8Ai40IeQ==", "requires": { - "xmldom": "0.1.27", - "xpath": "0.0.27" - }, - "dependencies": { - "xmldom": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", - "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=" - } + "xmldom": "0.5.0", + "xpath": "0.0.32" } }, "xml-encryption": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/xml-encryption/-/xml-encryption-1.2.1.tgz", - "integrity": "sha512-hn5w3l5p2+nGjlmM0CAhMChDzVGhW+M37jH35Z+GJIipXbn9PUlAIRZ6I5Wm7ynlqZjFrMAr83d/CIp9VZJMTA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/xml-encryption/-/xml-encryption-1.2.3.tgz", + "integrity": "sha512-oVZIicsZM1VobJ5Hxxgh2ovglIY2ZuXFTeZHmJSV7hABvgkD20PSy4G+qwRToQCkagymS1zJU2XV4wjkoCS9mQ==", "requires": { "escape-html": "^1.0.3", "node-forge": "^0.10.0", - "xmldom": "~0.1.15", + "xmldom": "~0.5.0", "xpath": "0.0.27" + }, + "dependencies": { + "xpath": { + "version": "0.0.27", + "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.27.tgz", + "integrity": "sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ==" + } } }, "xml-name-validator": { @@ -7375,12 +7448,19 @@ "requires": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" + }, + "dependencies": { + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + } } }, "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==" }, "xmlchars": { "version": "2.2.0", @@ -7388,14 +7468,14 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, "xmldom": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", - "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.5.0.tgz", + "integrity": "sha512-Foaj5FXVzgn7xFzsKeNIde9g6aFBxTPi37iwsno8QvApmtg7KYrr+OPyRHcJF7dud2a5nGRBXK3n0dL62Gf7PA==" }, "xpath": { - "version": "0.0.27", - "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.27.tgz", - "integrity": "sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ==" + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.32.tgz", + "integrity": "sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw==" }, "y18n": { "version": "4.0.1", diff --git a/package.json b/package.json index aa17a988..739f4247 100644 --- a/package.json +++ b/package.json @@ -39,10 +39,11 @@ "jest": "^26.6.3", "morgan": "^1.9.1", "mysql": "^2.17.1", + "mysql2": "^2.2.5", "nodemailer": "^6.3.1", "nodemon": "^2.0.1", "passport": "0.3.2", - "passport-saml": "^1.4.2", + "passport-saml": "^2.1.0", "pug": "^3.0.2" }, "devDependencies": {}, -- GitLab From 7f16213de2111189dca03c71000e4c7e04d404ba Mon Sep 17 00:00:00 2001 From: Rosanny Date: Wed, 31 Mar 2021 20:23:53 +0200 Subject: [PATCH 082/163] delete unused codes --- routes/api_TBD.js | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 routes/api_TBD.js diff --git a/routes/api_TBD.js b/routes/api_TBD.js deleted file mode 100644 index 5a6ee24d..00000000 --- a/routes/api_TBD.js +++ /dev/null @@ -1,20 +0,0 @@ -// ==== USER ACOOUNT API ==== -var dbconn = require('./dbconn') -module.exports = function (app) { - - //console.log(dbconn); - //var con = dbconn.connection - - app.get('/api/v1/profile', function (req, res) { - if (req.isAuthenticated()) { - // read data based on email - dbconn.user.query('SELECT * FROM user WHERE email="'+req.user.email+'"', function (err, rows, fields) { - if (err) throw err - res.send(rows[0]) - }) - } else { - res.send('authentication required'); - } - }); - -} \ No newline at end of file -- GitLab From 20c2aa0bff34c42bc41174ef7acbc0b7097ff39a Mon Sep 17 00:00:00 2001 From: Rosanny Date: Wed, 31 Mar 2021 20:24:44 +0200 Subject: [PATCH 083/163] DB connection using mysql2 --- routes/dbconn2.js | 64 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 routes/dbconn2.js diff --git a/routes/dbconn2.js b/routes/dbconn2.js new file mode 100644 index 00000000..fe22f1d8 --- /dev/null +++ b/routes/dbconn2.js @@ -0,0 +1,64 @@ +const mysql = require('mysql2') + +var env = process.env.NODE_ENV || 'testing'; +const config = require('../config/config')[env] + +// ==== USER ACOOUNT DB CONNECTION ==== +var userConnection = mysql.createConnection({ + host: config.database.host, + user: config.database.user, + password: config.database.password, + port: config.database.port, + database: config.database.dbUser, + multipleStatements: true +}) + +userConnection.connect(function(err) { + if (err) throw err; +}) +userConnection.query('USE '+config.database.dbUser) + +// ALTERNATIVE approach: close db connection manually after every query +/* +var dbconn = function dbconn(query, values, next) { + var connection = mysql.createConnection({ + host: config.database.host, + user: config.database.user, + password: config.database.password, + port: config.database.port, + database: config.database.db + }) + connection.connect(function(err) { + if (err) throw err; + }) + connection.query(query, values, function(err) { + connection.end(); // close the connection + if (err) { + throw err; + } + // Execute the callback + next.apply(this, arguments); + }); +} +*/ + +// ==== PROJECT DB CONNECTION ==== +var projectConnection = mysql.createConnection({ + host: config.database.host_project, + user: config.database.user, + password: config.database.password, + port: config.database.port, + database: config.database.dbProject +}) + +projectConnection.connect(function(err) { + if (err) throw err; +}) +projectConnection.query('USE '+config.database.dbProject) + +var connection = { + user: userConnection, + project: projectConnection +} + +module.exports = connection \ No newline at end of file -- GitLab From 698c4aea428ca3efc53c383eadfa99b5e4a981e3 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Wed, 31 Mar 2021 20:26:02 +0200 Subject: [PATCH 084/163] rewrite getUserByEmail using mysql2 --- routes/methods.js | 88 +++++++++++++++++++++++++++++------------------ 1 file changed, 54 insertions(+), 34 deletions(-) diff --git a/routes/methods.js b/routes/methods.js index 4461dea6..d3d3f69c 100644 --- a/routes/methods.js +++ b/routes/methods.js @@ -1,16 +1,17 @@ -const dbconn = require('./dbconn'); +const dbconn_OBSOLETE = require('./dbconn') // DO NOT USE THIS FOR NEW FEATURE +const dbconn = require('./dbconn2') var methods = { // ===================== user db ===================== registerNewUser: function(data, callback) { - dbconn.user.beginTransaction(function(err) { // START TRANSACTION + dbconn_OBSOLETE.user.beginTransaction(function(err) { // START TRANSACTION if (err) { throw err } // insert profile - dbconn.user.query('INSERT INTO user SET ?', data.profile, function (err, results, fields) { + dbconn_OBSOLETE.user.query('INSERT INTO user SET ?', data.profile, function (err, results, fields) { if (err) { - return dbconn.user.rollback(function() { + return dbconn_OBSOLETE.user.rollback(function() { throw err }); } @@ -20,9 +21,9 @@ var methods = { user_id: newUserId, password: data.password } - dbconn.user.query('INSERT INTO credential SET ?', credentialData, function (err, results, fields) { + dbconn_OBSOLETE.user.query('INSERT INTO credential SET ?', credentialData, function (err, results, fields) { if (err) { - return dbconn.user.rollback(function() { + return dbconn_OBSOLETE.user.rollback(function() { throw err }); } @@ -32,9 +33,9 @@ var methods = { role_id: 2, // USER user_id: newUserId } - dbconn.user.query('INSERT INTO user_project_role SET ?', projectRoleData, function (err, results, fields) { + dbconn_OBSOLETE.user.query('INSERT INTO user_project_role SET ?', projectRoleData, function (err, results, fields) { if (err) { - return dbconn.user.rollback(function() { + return dbconn_OBSOLETE.user.rollback(function() { throw err }); } @@ -43,16 +44,16 @@ var methods = { user_id: newUserId, token: data.verificationToken } - dbconn.user.query('INSERT INTO verification SET ?', verificationData, function (err, results, fields) { + dbconn_OBSOLETE.user.query('INSERT INTO verification SET ?', verificationData, function (err, results, fields) { if (err) { - return dbconn.user.rollback(function() { + return dbconn_OBSOLETE.user.rollback(function() { throw err }); } // COMMIT - dbconn.user.commit(function(err) { + dbconn_OBSOLETE.user.commit(function(err) { if (err) { - return dbconn.user.rollback(function() { + return dbconn_OBSOLETE.user.rollback(function() { throw err }) } @@ -64,8 +65,8 @@ var methods = { callback(err) }) }, - getUserByEmail: function(email, callback) { - dbconn.user.query('SELECT id, verificationStatus, salutation, title, firstname, lastname, industry, organisation, speciality, m4lab_idp FROM user WHERE email = "' +email+'"', function (err, rows, fields) { + getUserByEmail_OBSOLETE: function(email, callback) { + dbconn_OBSOLETE.user.query('SELECT id, verificationStatus, salutation, title, firstname, lastname, industry, organisation, speciality, m4lab_idp FROM user WHERE email = "' +email+'"', function (err, rows, fields) { let user if (err) { throw err } else { @@ -76,8 +77,17 @@ var methods = { callback(user, err) }); }, + getUserByEmail: async function(email) { + try { + let rows = await dbconn.user.promise().query('SELECT id, verificationStatus, salutation, title, firstname, lastname, industry, organisation, speciality, m4lab_idp FROM user WHERE email = "' +email+'"') + return rows[0][0] + } catch (err) { + console.error(err) + return err + } + }, getUserById: function(userId, callback) { - dbconn.user.query('SELECT verificationStatus, email, salutation, title, firstname, lastname, industry, organisation, speciality FROM user WHERE id = ' +userId, function (err, rows, fields) { + dbconn_OBSOLETE.user.query('SELECT verificationStatus, email, salutation, title, firstname, lastname, industry, organisation, speciality FROM user WHERE id = ' +userId, function (err, rows, fields) { let user if (err) { throw err } else { @@ -90,7 +100,7 @@ var methods = { }, checkUserEmail: function(email, callback) { let user - dbconn.user.query('SELECT id, email FROM user WHERE email = "' +email+'"', function (err, rows) { + dbconn_OBSOLETE.user.query('SELECT id, email FROM user WHERE email = "' +email+'"', function (err, rows) { if (err) { throw err } else { if ( rows.length > 0) { @@ -102,7 +112,7 @@ var methods = { }, getUserByToken: function(token, callback) { let user - dbconn.user.query('SELECT t1.user_id, t2.email FROM userdb.credential AS t1 INNER JOIN userdb.user AS t2 ON t1.user_id = t2.id AND t1.resetPasswordToken = "' + dbconn_OBSOLETE.user.query('SELECT t1.user_id, t2.email FROM userdb.credential AS t1 INNER JOIN userdb.user AS t2 ON t1.user_id = t2.id AND t1.resetPasswordToken = "' +token+'" and resetPasswordExpires > '+Date.now(), function (err, rows, fields) { if (err) { throw err } else { @@ -115,20 +125,20 @@ var methods = { ) }, updateUserById: function(userData, callback) { - dbconn.user.query('UPDATE user SET ? WHERE id = ' +userData.id, userData, function (err, rows, fields) { + dbconn_OBSOLETE.user.query('UPDATE user SET ? WHERE id = ' +userData.id, userData, function (err, rows, fields) { if (err) throw err callback(err) }) }, updateCredential: function(data, callback) { - dbconn.user.query('UPDATE credential SET ? WHERE user_id = ' +data.user_id, data, function (err, rows, fields) { + dbconn_OBSOLETE.user.query('UPDATE credential SET ? WHERE user_id = ' +data.user_id, data, function (err, rows, fields) { if (err) throw err callback(err) }) }, getUserIdByEmail: function(email, callback) { let userId - dbconn.user.query('SELECT id FROM user WHERE email = "' +email+'"', function (err, rows, fields) { + dbconn_OBSOLETE.user.query('SELECT id FROM user WHERE email = "' +email+'"', function (err, rows, fields) { if (err) { throw err } @@ -141,20 +151,20 @@ var methods = { }); }, getUserProjectRole: function(userId, callback) { - dbconn.user.query('SELECT project_id, role_id FROM user_project_role WHERE user_id = "' +userId+'"', function (err, rows, fields) { + dbconn_OBSOLETE.user.query('SELECT project_id, role_id FROM user_project_role WHERE user_id = "' +userId+'"', function (err, rows, fields) { if (err) throw err callback(rows, err) }); }, addUserProjectRole: function(data, callback) { - dbconn.user.query('INSERT INTO user_project_role SET ?', data, function (err, results, fields){ + dbconn_OBSOLETE.user.query('INSERT INTO user_project_role SET ?', data, function (err, results, fields){ if (err) throw err callback(err) }) }, getVerificationTokenByUserId: function(userId, callback) { let token - dbconn.user.query('SELECT token FROM verification WHERE user_id = "' +userId+'"', function (err, rows, fields) { + dbconn_OBSOLETE.user.query('SELECT token FROM verification WHERE user_id = "' +userId+'"', function (err, rows, fields) { if (err) { throw err } @@ -168,7 +178,7 @@ var methods = { }, getUserIdByVerificationToken: function(token, callback) { let userId - dbconn.user.query('SELECT user_id FROM verification WHERE token = "' +token+'"', function (err, rows, fields) { + dbconn_OBSOLETE.user.query('SELECT user_id FROM verification WHERE token = "' +token+'"', function (err, rows, fields) { if (err) { throw err } @@ -179,22 +189,22 @@ var methods = { }) }, verifyUserAccount: function(userData, callback) { - dbconn.user.beginTransaction(function(err) { // START TRANSACTION + dbconn_OBSOLETE.user.beginTransaction(function(err) { // START TRANSACTION if (err) { throw err } // update user status - dbconn.user.query('UPDATE user SET ? WHERE id =' +userData.id, userData, function (err, rows, fields) { + dbconn_OBSOLETE.user.query('UPDATE user SET ? WHERE id =' +userData.id, userData, function (err, rows, fields) { if (err) { - return dbconn.user.rollback(function() { throw err }) + return dbconn_OBSOLETE.user.rollback(function() { throw err }) } // delete verification token - dbconn.user.query('DELETE FROM verification WHERE user_id = '+userData.id, function (err, rows, fields) { + dbconn_OBSOLETE.user.query('DELETE FROM verification WHERE user_id = '+userData.id, function (err, rows, fields) { if (err) { - return dbconn.user.rollback(function() { throw err }) + return dbconn_OBSOLETE.user.rollback(function() { throw err }) } // COMMIT - dbconn.user.commit(function(err) { + dbconn_OBSOLETE.user.commit(function(err) { if (err) { - return dbconn.user.rollback(function() { throw err }) + return dbconn_OBSOLETE.user.rollback(function() { throw err }) } }) }) @@ -203,9 +213,9 @@ var methods = { }) }, /* ===== GitLab ===== */ - getGitlabId: function(userId, callback){ + getGitlabId_OBSOLETE: function(userId, callback){ let gitlabUserId - dbconn.user.query('SELECT gu.gitlab_userId FROM user_gitlab gu, user u WHERE u.id = "' +userId+'" and gu.user_id = u.id', function (err, rows) { + dbconn_OBSOLETE.user.query('SELECT gu.gitlab_userId FROM user_gitlab gu, user u WHERE u.id = "' +userId+'" and gu.user_id = u.id', function (err, rows) { if (err) { throw err } @@ -215,8 +225,18 @@ var methods = { callback(gitlabUserId, err) }) }, + getGitlabId: async function(userId) { + try { + let rows = await dbconn.user.promise().query('SELECT gu.gitlab_userId FROM user_gitlab gu, user u WHERE u.id = "' +userId+'" and gu.user_id = u.id') + return rows[0][0].gitlab_userId + } + catch(err) { + console.error(err) + return err + } + }, addGitlabUser: function(data, callback){ - dbconn.user.query('INSERT INTO user_gitlab SET ?', data, function (err) { + dbconn_OBSOLETE.user.query('INSERT INTO user_gitlab SET ?', data, function (err) { if (err) throw err callback(err) }) -- GitLab From cc3ae6c568ed06e8a50e85a026f6c0bdfebbac8d Mon Sep 17 00:00:00 2001 From: Rosanny Date: Wed, 31 Mar 2021 20:28:17 +0200 Subject: [PATCH 085/163] delete loggedInUser (global variable) and add getLoggedInUserData(email) --- routes/routes-account.js | 86 +++++++++++++++++++++------------------- 1 file changed, 46 insertions(+), 40 deletions(-) diff --git a/routes/routes-account.js b/routes/routes-account.js index 0a62ba0f..dc18b3d9 100644 --- a/routes/routes-account.js +++ b/routes/routes-account.js @@ -21,8 +21,6 @@ const projectRepo = require('../classes/repo') module.exports = function (app, config, passport, i18n) { - var loggedInUser - // =========== PASSPORT ======= passport.serializeUser(function (user, done) { done(null, user); @@ -112,28 +110,27 @@ module.exports = function (app, config, passport, i18n) { var updatePasswordMailSubject = "Ihr Passwort für das Transferportal wurde gespeichert." var updatePasswordMailContent = '
Lieber Nutzer,

Ihr Passwort wurde erfolgreich geändert.

' + mailSignature + '
'; - app.get('/', function (req, res) { + async function getLoggedInUserData(email) { + let user = await methods.getUserByEmail(email) + let loggedInUser = new portalUser( + user.id, email, user.salutation, user.title, user.firstname, user.lastname, user.industry, user.organisation, user.speciality, user.m4lab_idp, null, user.verificationStatus + ) + + let userGitlabId = await methods.getGitlabId(loggedInUser.id) + loggedInUser.setGitlabUserId(userGitlabId) + + return loggedInUser + } + + app.get('/', async function (req, res) { if ( !req.isAuthenticated() ) { res.redirect('/login') } else { - methods.getUserByEmail(req.user.email, function(data, err){ - if (!err) { - // Initialize user - if (!loggedInUser) { - loggedInUser = new portalUser( - data.id, req.user.email, data.salutation, data.title, data.firstname, data.lastname, data.industry, data.organisation, data.speciality, data.m4lab_idp, null, data.verificationStatus - ) - methods.getGitlabId(data.id, function(gitlabUserId, err){ - if(!err) { - loggedInUser.setGitlabUserId(gitlabUserId) - } - }) - } - res.render(lang+'/account/home', { - user: loggedInUser - }); - } - }) + let loggedInUser = await getLoggedInUserData(req.user.email) + + res.render(lang+'/account/home', { + user: loggedInUser + }); } }); @@ -166,10 +163,11 @@ module.exports = function (app, config, passport, i18n) { }); }); - app.get('/profile', function (req, res) { - if(!req.isAuthenticated() && !loggedInUser) { + app.get('/profile', async function (req, res) { + if ( !req.isAuthenticated() ) { res.redirect('/login') } else { + let loggedInUser = await getLoggedInUserData(req.user.email) if(loggedInUser.getVerificationStatus() != 1) { res.redirect('/account/') } else { @@ -181,9 +179,10 @@ module.exports = function (app, config, passport, i18n) { }) app.get('/services', async function(req, res){ - if(!req.isAuthenticated() && !loggedInUser) { + if( !req.isAuthenticated() ) { res.redirect('/login') } else { + let loggedInUser = await getLoggedInUserData(req.user.email) if(loggedInUser.getVerificationStatus() != 1) { // unverified users res.redirect('/account/') } else { @@ -235,10 +234,11 @@ module.exports = function (app, config, passport, i18n) { } }) - app.get('/security', function (req, res) { - if (!req.isAuthenticated() && !loggedInUser) { + app.get('/security', async function (req, res) { + if ( !req.isAuthenticated() ) { res.redirect('/login') } else { + let loggedInUser = await getLoggedInUserData(req.user.email) if(loggedInUser.getVerificationStatus() == 1 && loggedInUser.getIdpStatus() == 1) { res.render(lang+'/account/security', { user: loggedInUser @@ -249,7 +249,7 @@ module.exports = function (app, config, passport, i18n) { } }) - app.post('/updateProfile', function (req, res) { + app.post('/updateProfile', async function (req, res) { var userData = { salutation: req.body.inputSalutation, title: req.body.inputTitle, @@ -261,9 +261,10 @@ module.exports = function (app, config, passport, i18n) { speciality: req.body.inputSpeciality, } - if (!req.isAuthenticated() && !loggedInUser) { + if ( !req.isAuthenticated() ) { res.redirect('/login') } else { + let loggedInUser = await getLoggedInUserData(req.user.email) if (userData.email) { dbconn.user.query('UPDATE user SET ? WHERE email = "' +userData.email+'"', userData, function (err, rows, fields) { if (err) { @@ -280,10 +281,12 @@ module.exports = function (app, config, passport, i18n) { } }); - app.post('/changePwd', function (req, res) { - if(!req.isAuthenticated() && !loggedInUser) { + app.post('/changePwd', async function (req, res) { + if( !req.isAuthenticated() ) { res.redirect('/login') } else { + let loggedInUser = await getLoggedInUserData(req.user.email) + var currPwd = req.body.inputCurrPwd var newPwd = req.body.inputNewPwd var retypePwd = req.body.inputConfirm @@ -461,9 +464,10 @@ module.exports = function (app, config, passport, i18n) { // ============= NEW GITLAB PAGES =========================== app.get('/newInformation', async function(req, res){ - if (!req.isAuthenticated() && !loggedInUser) { + if ( !req.isAuthenticated() ) { res.redirect('/login') } else { + let loggedInUser = await getLoggedInUserData(req.user.email) let gitlabUser = await gitlab.getUserByEmail(loggedInUser.getEmail()) if (!gitlabUser) { // no user found res.redirect('/account/service') @@ -475,10 +479,12 @@ module.exports = function (app, config, passport, i18n) { } } }) - app.post('/newInformation', function(req, res) { - if(!req.isAuthenticated() && !loggedInUser) { + app.post('/newInformation', async function(req, res) { + if( !req.isAuthenticated() ) { res.redirect('/login') } else { + let loggedInUser = await getLoggedInUserData(req.user.email) + if (!req.body.name && !req.body.description) { res.flash('error', 'Bitte geben Sie die benötigten Daten ein') res.redirect('/account/newInformation') @@ -531,9 +537,11 @@ module.exports = function (app, config, passport, i18n) { }) app.get('/updateInformation', async function(req, res){ - if(!req.isAuthenticated() && !loggedInUser) { + if( !req.isAuthenticated() ) { res.redirect('/login') } else { + let loggedInUser = await getLoggedInUserData(req.user.email) + if(!req.query.id) { res.redirect('/account/services') } else { @@ -557,10 +565,12 @@ module.exports = function (app, config, passport, i18n) { } }) - app.post('/updateInformation', function(req, res){ - if(!req.isAuthenticated() && !loggedInUser) { + app.post('/updateInformation', async function(req, res){ + if( !req.isAuthenticated() ) { res.redirect('/login') } else { + let loggedInUser = await getLoggedInUserData(req.user.email) + if (!req.body.name && !req.body.description) { res.flash('error', 'Bitte geben Sie die benötigten Daten ein') res.redirect('/account/updateInformation') @@ -705,7 +715,6 @@ module.exports = function (app, config, passport, i18n) { // ============= USER VERIFICATION ================================ app.get("/verifyAccount", function(req, res){ - console.log(req.query) methods.getUserIdByVerificationToken(req.query.token, function(userId, err){ if (userId) { let userData = { @@ -743,9 +752,6 @@ module.exports = function (app, config, passport, i18n) { } }) - if(!loggedInUser) { - loggedInUser.setVerificationStatus(userData.verificationStatus) - } res.render(lang+'/account/verification', { status: true }); -- GitLab From 2a9191f5d871cbb77df38f794f10bd3462204450 Mon Sep 17 00:00:00 2001 From: Varun Srivastava <92srva1mst@hft-stuttgart.de> Date: Wed, 31 Mar 2021 21:28:09 +0200 Subject: [PATCH 086/163] styling changes --- public/js/headfootLogout.js | 4 ++-- views/DE/account/contact.pug | 18 +++++++++--------- views/DE/account/home.pug | 6 +++--- views/DE/account/profile.pug | 8 ++++---- views/DE/account/security.pug | 8 ++++---- views/DE/account/services.pug | 8 ++++---- 6 files changed, 26 insertions(+), 26 deletions(-) diff --git a/public/js/headfootLogout.js b/public/js/headfootLogout.js index 3de57921..4178a026 100644 --- a/public/js/headfootLogout.js +++ b/public/js/headfootLogout.js @@ -70,8 +70,8 @@ function head(){ alertbutton.innerHTML = "×"; alertdiv.innerHTML="Disclaimer This website is under construction and in prototype-phase. It is not for public use." prependChild(alertdiv, alertbutton); - alertdiv.classList.add('alert','alert-danger', 'alert-dismissible', 'fade','show'); - alertdiv.style = "text-align:center;"; + alertdiv.classList.add('alert','alert-danger', 'alert-dismissible', 'fade','show', 'text-center'); + //alertdiv.style = "text-align:center;"; navheader.appendChild(alertdiv); let navbar = document.createElement('nav'); navbar.classList.add("navbar", "navbar-default"); diff --git a/views/DE/account/contact.pug b/views/DE/account/contact.pug index 67107cf9..e916d406 100644 --- a/views/DE/account/contact.pug +++ b/views/DE/account/contact.pug @@ -14,9 +14,9 @@ html(lang="de") body div(class="container") div(class="row") - div(class="col-md-12" style="margin-bottom: 40px;") + div(class="col-md-12 margin_bottom_40") img(class="mx-auto" src="/img/Kontakt.jpg" width="100%") - div(class="contact-clean" style="background-color: rgb(234,234,234);") + div(class="contact-clean background_eaeaea") if successes for success in successes div.alert.alert-success.alert-dismissible #{ success } @@ -34,18 +34,18 @@ html(lang="de") div(class="form-group") textarea#message(class="form-control" name="message" placeholder="Nachricht" rows="14") div(class="form-group") - input#submitBtn(class="btn btn-primary" type="submit" style="background-color: #8a348b;" value="SENDEN") - div(class="contact-clean" style="background-color: rgb(234,234,234);padding: 80px;padding-top: 0px;") + input#submitBtn(class="btn contact_send_btn" type="submit" value="SENDEN") + div(class="contact-clean contact_footer") form(method="POST") - p(style="margin-top: 25px;") Hochschule für Technik Stuttgart
Institut für Angewandte Forschung
Innovative Hochschule - Projekt M4_LAB
Schellingstr. 24
70174 Stuttgart
Deutschland

support-transfer@hft-stuttgart.de

www.hft-stuttgart.de / www.hft-stuttgart.de/M4LAB
- div(style="background-color: rgba(138,52,139,0.45);") + p(class="m_top_25") Hochschule für Technik Stuttgart
Institut für Angewandte Forschung
Innovative Hochschule - Projekt M4_LAB
Schellingstr. 24
70174 Stuttgart
Deutschland

support-transfer@hft-stuttgart.de

www.hft-stuttgart.de / www.hft-stuttgart.de/M4LAB
+ div(class="background_8a348b") div(class="container") div(class="row") div(class="col-md-4 col-lg-2") div(class="col-md-4 col-lg-8") - div(style="background-color: #feffff;margin: 0px;padding: 60px;padding-top: 20px;padding-bottom: 20px;") - img(class="d-flex d-lg-flex justify-content-center justify-content-lg-center align-items-lg-start mx-auto" src="/img/Logo_TV1.png" width="100px" style="padding-bottom: 35px;") - h2(class="text-center" style="color: #8a348b;") Transferportal + div(class="contact_foot_message") + img(class="d-flex d-lg-flex justify-content-center justify-content-lg-center align-items-lg-start mx-auto p_bottom_35" src="/img/Logo_TV1.png" width="100px") + h2(class="text-center color_8a348b") Transferportal p(class="text-center") Das Transferportal entsteht in einem Teilprojekt der Innovativen Hochschule für Technik Stuttgart. Im Innovationslabor M4_LAB wird das Transferportal als eine Webpräsenz entwickelt, welches Wissen, Lösungen und Dienste für HFT-Mitglieder, externe Partner und die allgemeine Öffentlichkeit bereitstellt.

Es ergänzt die Informationen der allgemeinen HFT-Webseite durch konkrete Ergebnisse aus Forschung und Entwicklung, verfügbar in verschiedenster Form wie beispielsweise Daten, Dokumentationen und Software-Code.

Zudem stellt es Kollaborationsmittel für Projektpartner und später auch Partizipationsmöglichkeiten für die breite Öffentlichkeit bereit. div(class="col-md-4 col-lg-2") diff --git a/views/DE/account/home.pug b/views/DE/account/home.pug index 54c4ced0..2c49e189 100644 --- a/views/DE/account/home.pug +++ b/views/DE/account/home.pug @@ -16,7 +16,7 @@ html(lang="de") | Wir haben Ihnen eine E-Mail an Ihre verwendete Adresse gesendet. Diese enthält einen Link zur Bestätigung Ihres Accounts. | Wenn Sie die Mail nicht in ihrem Postfach vorfinden, prüfen Sie bitte auch Ihren Spam-Ordner. |
Falls Sie keine E-Mail von uns erhalten haben, können Sie diese hier erneut anfordern. - div(class="spinner-border text-secondary", role="status", style="display: none") + div(class="spinner-border text-secondary display_none", role="status") else div(class="row min-vh-100 flex-column flex-md-row") aside(class="col-12 col-md-3 p-0 flex-shrink-1") @@ -25,7 +25,7 @@ html(lang="de") ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") li(class="nav-item") a(class="nav-link pl-0 text-nowrap" href="#") - span(class="font-weight-bold" style="color:black;") #{user.firstname} #{user.lastname} + span(class="font-weight-bold color_black") #{user.firstname} #{user.lastname} li(class="nav-item") a(class="nav-link pl-0" href="/account/profile") i(class="fa fa-user fa-fw") @@ -40,7 +40,7 @@ html(lang="de") i(class="fa fa-tasks fa-fw") span(class="d-none d-md-inline") Projekte und Dienste li(class="nav-item") - a(class="nav-link pl-0" href="/logout" style="color:red;") + a(class="nav-link pl-0 color_red" href="/logout") i(class="fa fa-sign-out-alt fa-fw") span(class="d-none d-md-inline") Logout main(class="col bg-faded py-3 flex-grow-1") diff --git a/views/DE/account/profile.pug b/views/DE/account/profile.pug index 190fc1c7..196e3286 100644 --- a/views/DE/account/profile.pug +++ b/views/DE/account/profile.pug @@ -16,11 +16,11 @@ html(lang="de") ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") li(class="nav-item") a(class="nav-link pl-0 text-nowrap" href="/account/") - span(class="font-weight-bold" style="color:black;") #{user.firstname} #{user.lastname} + span(class="font-weight-bold color_black") #{user.firstname} #{user.lastname} li(class="nav-item") a(class="nav-link pl-0" href="/account/profile") - i(class="fa fa-user fa-fw" style="color:black;") - span(class="d-none d-md-inline" style="color:black;") Benutzerprofil + i(class="fa fa-user fa-fw color_black") + span(class="d-none d-md-inline color_black") Benutzerprofil if user.m4lab_idp == 1 li(class="nav-item") a(class="nav-link pl-0" href="/account/security") @@ -31,7 +31,7 @@ html(lang="de") i(class="fa fa-tasks fa-fw") span(class="d-none d-md-inline") Projekte und Dienste li(class="nav-item") - a(class="nav-link pl-0" href="/logout" style="color:red;") + a(class="nav-link pl-0 color_red" href="/logout") i(class="fa fa-sign-out-alt fa-fw") span(class="d-none d-md-inline") Logout main(class="col bg-faded py-3 flex-grow-1") diff --git a/views/DE/account/security.pug b/views/DE/account/security.pug index 81da0660..a343a3bf 100644 --- a/views/DE/account/security.pug +++ b/views/DE/account/security.pug @@ -20,21 +20,21 @@ html(lang="de") ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") li(class="nav-item") a(class="nav-link pl-0 text-nowrap" href="/account/") - span(class="font-weight-bold" style="color:black;") #{user.firstname} #{user.lastname} + span(class="font-weight-bold color_black") #{user.firstname} #{user.lastname} li(class="nav-item") a(class="nav-link pl-0" href="/account/profile") i(class="fa fa-user fa-fw") span(class="d-none d-md-inline") Benutzerprofil li(class="nav-item") a(class="nav-link pl-0" href="/account/security") - i(class="fa fa-lock fa-fw" style="color:black;") - span(class="d-none d-md-inline" style="color:black;") Sicherheitseinstellungen + i(class="fa fa-lock fa-fw color_black") + span(class="d-none d-md-inline color_black") Sicherheitseinstellungen li(class="nav-item") a(class="nav-link pl-0" href="/account/services") i(class="fa fa-tasks fa-fw") span(class="d-none d-md-inline") Projekte und Dienste li(class="nav-item") - a(class="nav-link pl-0" href="/logout" style="color:red;") + a(class="nav-link pl-0 color_red" href="/logout") i(class="fa fa-sign-out-alt fa-fw") span(class="d-none d-md-inline") Logout main(class="col bg-faded py-3 flex-grow-1") diff --git a/views/DE/account/services.pug b/views/DE/account/services.pug index a2015cd9..7db95393 100644 --- a/views/DE/account/services.pug +++ b/views/DE/account/services.pug @@ -16,7 +16,7 @@ html(lang="de") ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") li(class="nav-item") a(class="nav-link pl-0 text-nowrap" href="/") - span(class="font-weight-bold" style="color:black;") #{user.firstname} #{user.lastname} + span(class="font-weight-bold color_black") #{user.firstname} #{user.lastname} li(class="nav-item") a(class="nav-link pl-0" href="/account/profile") i(class="fa fa-user fa-fw") @@ -28,10 +28,10 @@ html(lang="de") span(class="d-none d-md-inline") Sicherheitseinstellungen li(class="nav-item") a(class="nav-link pl-0" href="/account/services") - i(class="fa fa-tasks fa-fw" style="color:black;") - span(class="d-none d-md-inline" style="color:black;") Projekte und Dienste + i(class="fa fa-tasks fa-fw color_black") + span(class="d-none d-md-inline color_black") Projekte und Dienste li(class="nav-item") - a(class="nav-link pl-0" href="/logout" style="color:red;") + a(class="nav-link pl-0 color_red" href="/logout") i(class="fa fa-sign-out-alt fa-fw") span(class="d-none d-md-inline") Logout main(class="col bg-faded py-3 flex-grow-1") -- GitLab From 6a2249e82a32f6d420ea085144d3347d5bcd4754 Mon Sep 17 00:00:00 2001 From: Varun Srivastava <92srva1mst@hft-stuttgart.de> Date: Wed, 31 Mar 2021 19:41:40 +0000 Subject: [PATCH 087/163] Update contact.pug to resolve conflict --- views/DE/account/contact.pug | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/DE/account/contact.pug b/views/DE/account/contact.pug index b40a135f..93792603 100644 --- a/views/DE/account/contact.pug +++ b/views/DE/account/contact.pug @@ -16,7 +16,7 @@ html(lang="de") div(class="row") div(class="col-md-12 margin_bottom_40") img(class="mx-auto" src="/img/Kontakt.jpg" width="100%") - div(class="contact-clean" style="background-color: rgb(234,234,234);") + div(class="contact-clean background_eaeaea") if flash.success div.alert.alert-success.alert-dismissible #{flash.success} a(class="close", href="#", data-dismiss="alert", aria-label="close") × -- GitLab From 56db797fd0d6e43e0c64f19e98bac8b141b78b57 Mon Sep 17 00:00:00 2001 From: Varun Srivastava <92srva1mst@hft-stuttgart.de> Date: Wed, 31 Mar 2021 19:43:26 +0000 Subject: [PATCH 088/163] Update profile.pug to resolve merge conflict --- views/DE/account/profile.pug | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/views/DE/account/profile.pug b/views/DE/account/profile.pug index 87deb728..8ab9bf55 100644 --- a/views/DE/account/profile.pug +++ b/views/DE/account/profile.pug @@ -16,11 +16,11 @@ html(lang="de") ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") li(class="nav-item") a(class="nav-link pl-0 text-nowrap" href="/account/") - span(class="font-weight-bold" style="color:black;") #{user.firstName} #{user.lastName} + span(class="font-weight-bold color_black") #{user.firstName} #{user.lastName} li(class="nav-item") a(class="nav-link pl-0" href="/account/profile") - i(class="fa fa-user fa-fw" style="color:black;") - span(class="d-none d-md-inline" style="color:black;") Benutzerprofil + i(class="fa fa-user fa-fw color_black") + span(class="d-none d-md-inline color_black") Benutzerprofil if user.is_m4lab_idp li(class="nav-item") a(class="nav-link pl-0" href="/account/security") @@ -107,4 +107,4 @@ html(lang="de") // Bootstrap script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") // M4_LAB - script(src="/js/headfoot.js") \ No newline at end of file + script(src="/js/headfoot.js") -- GitLab From f17ea3946a83af343c8c518da1326ca9f513122a Mon Sep 17 00:00:00 2001 From: Rosanny Date: Thu, 1 Apr 2021 15:09:34 +0200 Subject: [PATCH 089/163] update user feedback after creating and updating a website --- routes/routes-account.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/routes/routes-account.js b/routes/routes-account.js index 0a62ba0f..d6479ad8 100644 --- a/routes/routes-account.js +++ b/routes/routes-account.js @@ -512,9 +512,10 @@ module.exports = function (app, config, passport, i18n) { } else { let newPagesData = newPages.data - //res.flash("success", "Ihre Webseite wurde erstellt, aber noch nicht veröffentlicht. Bitte fahren Sie mit Schritten 2 und 3 fort, um Ihre Webseite zu veröffentlichen.") - res.flash("success", "Your website will be published AFTER you complete your website by following the provided guideline below."+ - "\r\n Your website URL: "+tpGitlabPagesURL+newPagesData.path_with_namespace+"/home/") + res.flash("success", "Ihre Webseite wurde erstellt, aber noch nicht veröffentlicht. Um Ihre Webseite endgültig zu veröffentlichen, "+ + "schließen Sie die Einrichtung gemäß unten stehender Anleitung ab.") + /* res.flash("success", "Your website will be published AFTER you complete your website by following the provided guideline below."+ + "\r\n Your website URL: "+tpGitlabPagesURL+newPagesData.path_with_namespace+"/home/") */ res.redirect('/account/updateInformation?id='+newPagesData.id) } } @@ -585,7 +586,7 @@ module.exports = function (app, config, passport, i18n) { async function(newLogoFile, callback){ // update gitlab page let updatedPages = await gitlab.updateProject(updatedInformation, newLogoFile) let pagesData = updatedPages.data - if (pagesData.error) { + if (updatedPages.error) { if(pagesData.message.name == "has already been taken") { res.flash("error", "Der Projektname ist bereits vergeben, bitte wählen Sie einen anderen Namen.") } else { -- GitLab From f60bc1429538e72ef36a5956641574b6de162691 Mon Sep 17 00:00:00 2001 From: Rosanny Date: Thu, 1 Apr 2021 15:13:02 +0200 Subject: [PATCH 090/163] small update --- views/DE/account/newInformation.pug | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/DE/account/newInformation.pug b/views/DE/account/newInformation.pug index b2b90516..3f14905f 100644 --- a/views/DE/account/newInformation.pug +++ b/views/DE/account/newInformation.pug @@ -16,7 +16,7 @@ html(lang="de") ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") li(class="nav-item") a(class="nav-link pl-0 text-nowrap" href="/account/") - span(class="font-weight-bold" style="color:black;") #{user.firstName} #{user.lastName} - #{user.gitlabUserId} + span(class="font-weight-bold" style="color:black;") #{user.firstName} #{user.lastName} li(class="nav-item") a(class="nav-link pl-0" href="/account/profile") i(class="fa fa-user fa-fw") -- GitLab From 6e6719eadc81bb421b0bf0b97b496d7c45810c1b Mon Sep 17 00:00:00 2001 From: Rosanny Date: Thu, 1 Apr 2021 15:24:36 +0200 Subject: [PATCH 091/163] update name parameters --- views/DE/account/home.pug | 2 +- views/DE/account/services.pug | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/views/DE/account/home.pug b/views/DE/account/home.pug index 33bc0392..e476d871 100644 --- a/views/DE/account/home.pug +++ b/views/DE/account/home.pug @@ -25,7 +25,7 @@ html(lang="de") ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") li(class="nav-item") a(class="nav-link pl-0 text-nowrap" href="#") - span(class="font-weight-bold color_black") #{user.firstname} #{user.lastname} + span(class="font-weight-bold color_black") #{user.firstName} #{user.lastName} li(class="nav-item") a(class="nav-link pl-0" href="/account/profile") i(class="fa fa-user fa-fw") diff --git a/views/DE/account/services.pug b/views/DE/account/services.pug index 9103c77c..4702916d 100644 --- a/views/DE/account/services.pug +++ b/views/DE/account/services.pug @@ -16,7 +16,7 @@ html(lang="de") ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") li(class="nav-item") a(class="nav-link pl-0 text-nowrap" href="/") - span(class="font-weight-bold color_black") #{user.firstname} #{user.lastname} + span(class="font-weight-bold color_black") #{user.firstName} #{user.lastName} li(class="nav-item") a(class="nav-link pl-0" href="/account/profile") i(class="fa fa-user fa-fw") -- GitLab From 6447e04424365b9b611f7cd0b1020a11938e443d Mon Sep 17 00:00:00 2001 From: Rosanny Date: Thu, 1 Apr 2021 19:25:34 +0200 Subject: [PATCH 092/163] add default logo --- public/default/logo.png | Bin 0 -> 86689 bytes routes/routes-account.js | 64 +++++++++++++------------ views/DE/account/newInformation.pug | 1 + views/DE/account/updateInformation.pug | 1 + 4 files changed, 36 insertions(+), 30 deletions(-) create mode 100644 public/default/logo.png diff --git a/public/default/logo.png b/public/default/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..49d1a2c4816f76a799d3063b4c3f8fb37962f709 GIT binary patch literal 86689 zcmX_n1yGya^EK|S!6CRbxVsYw?(Qzd-JReBcefTTw0M!=E^R4NAb5phEzr{TAKu@5 z-!No`%yZ@0J@@R{-AkIDjyfS8EglLA3L#iS#Q+5b4S|A!PKbkn{3ay(qbUjsZg04e zS)hS^2(z#Ma~F3nXXd~#UuS0LPvR75wquW-NzW&&pBW#!$C06eQ|JMdXX0Yc5C;~ z?nZ=F`tz)Se|r;EAJ#fdnchwl01S)yLk~@T$F9u-3#$KFyX_o41P1!oRGu!l5?pwG zU5KVXMi1rJW$JwO&4>7VjeyuL!y0zRMKGtWV+cw3AnV=0^&s`4?EW9LLD~6FU!<(l zaqIK?iGN7Uh1Ih9PWdLYw=cvTNLIb@r_7SD^Xj%brJXW9Rg4%sYxMLP47!*gd=2<> zT{3uwPSn$u`1J*oCi-YV|2JVL2sxe%p&7o&@1o(pS3a^|2u;nxq{73eow7))KsUyR zRaX4u-`X~%T<0@k{>MXGBHMZ=w=f$L#LvtY`p9MHPn(%h%3iUGk^h4LRQcyV&O~Q0ON*Xza zL+y*jUv+Hx|9YrdFe@pIgP{ZXPLo`lx>=ZX9%O8^q~N>;jeO)DoASio4~=K=WDKFWMY|mKGO7t+rlKDsRXxVE1g*;!gHV^-3sKG2(cEin`A9BwyH4R)>Z0eL0up zI=7<$py;N17eAz9;m=H2?mflxztSfe26z0$!kW8_JFcHb?7Ux->yNW&4C@K@+Ov8E zdJMM9trQZLx4c{2&tU4vGq6>S4!8Bfp&z|p6KU>!J1j50iZwPO^xEUbB*S8!&P{F4 zMckB*>AZ~SRJQqLunQ|sWR&<%YKG{$zwWi20#(#rlJ7D>aliJp{hvuGQe>@rmxjh&@;+yE`Ev?^kuI%svhmLk&jP-%I`+1ir;=k;D!p*N`*fT1o@{X0`k;}M z`@XUxF->iWdQ-PJvB}!9c;rM-AXF1wA%tVCs9FePyT#p`NS_1MH+jq8s>{{AJ8E_& zl6%|#!=L(Rnfqjja%1c?8p$vD^z!QBC**F!>WdlQwxpKMEM%7edjq`Xr$RS^XfHb4 z-1ya)I~bil4d!{)ZOW3PQsqckTSKi#yMj158PjpJ$zKpl-z4{ydlkQEW+%0qjU9I3 zVHZ5s%taymAS@(85$*3Hg5$&yX zuq5M7UXnx23!jW`1RA{wD0i4{cx}C6HHgfnt*^XnbBXqa`ZZpxvG@D^(A_Nh1~m^S z>B!-<(i2I=KQ_9HhVkKE(Bb1_1VH$LnnqULknkJmJ);(&)V_uLU>aS23+if*>fhXF zVLm))(JVGW@)59o8x6Ld%~9@U^VB-ucQ`n*=}&r@a}vfk|3=b}V6B~lER12Fi&JQ9 z>)LSqXGOK_?ZOac&vz+zrXXn5*PS76oKDZC=cVxiW&8Gakse1C_Xb7`YM(r}lO2^6 zJa5z{HO5y?YEiW9ov&}YHu$L}g{2V6+-zTX8!BRXUhlYa&`l|fmO9x4yJC02Tw&h} z!JpG1JsN+u(z0+}`O}Nt*}aoqJ5Ycr10M$7Vyr!4bra9{jP`{7Md6iQXaX_mY2${u zJ0i?^!{=Zc%R2X-<~O&>I%#bl_3T*8H9NW|$qATB3ExwH?VblPIgp?{_aOg6Q*#F( zjk)!7Qp%8uT4!ed4iB;1^;^X~iJ$ErHr>^v*!MQ#sTH%DRTHr>{%%lkF`Zf(6Eyyz z(IoCe{3E_7WJeBUqh=|1qR6+=Jz|!5;pbr?{7;VVN*eZH2yh6GLa)+e57Sbm{LMD- zo+6bXQ5V(3&0p&k0m7h>2(9w~J@qS9`Nfi3?y2C6QW%$WQr9a&xsw9+@RF`?81ua+ zD9-(s9HwuFed{@nJZ?05Y}%TV5?6pQ*#XLy-OFB;q!Uu-yf{E%iu7k$d6VfY?j@YI zk>AE`B|N=c;PDMosH%^>BnPoZ7D$Jtxl87Q{t*0zS9#%+$2UMk3$4#4UNFUv>6SKm zZ1a@(cpOH}i)V&BG*~quFQqu;02SNocdw(aXUiH2c~Lb8yxcpJRJ5c52A!U1qeAd;gx+9m=YVxh@bXg$JF`?r}+b2zV9! z{L=|`#5d1G+kLF{hAP~uO?@C>+^?*G{G$dqqOCpUQ;2$5#@5$`k!?1rxS&FrJ;_Ly zmvE|D$o1d%+h6?_ExfGTH+FU3g`tgpP7^rGAX@m_0i8CKE-fH$U|~FbV`ywGr>$RP z2~#F0LN~W6*DIdQSrG&hGPlyhC9+4bv!`hcioY$XVb_)YElhvudA^hLFR;GgRz8=E zvZ;ZnhPpDpl+-#bQJ4m`UlcO<$mYU_2J7fnM z1GGU5Bm|~O?)D#kKhDHNzh>@WPgh8!y_OoPqxhmoj-4VA2D5HD^6;@k3mRUS`d~IY zBUHNDKyEcrem~-D>e+=YrY)C3nR61b;5@_mB}zyAefNi4ofNY>Pqj7|hAG?j*s>*l zt_tO9)GG}!=i24Oy4@+7a&i3%fYdg((`)G#lUzvcsN*{sHzpRxcK=H`DgR)yg|f`Y zq0Hs7(60wyMpZUDDv)@KNn4+E-2@q`4N}m}zkIFp%%QLgfF$ zW|ky5m^!}YN9s5<2Q76Klz%DN3vZEs;reQr2cV#USf74TLmT9SkzZm5g0)q#k1Z9iD-eXEgi=?Oaf*TGXQ)DJm#ZRk?zF1JxxS_bM8q>=2z5DqCgahV9yM~y#1hhA zPr=#(*xAs6Rjf!771;9FG+Th_IHPFZc6Rpm_BqP5lN)Pu7>w?Gq<)GdXj*9w+%={2 z4!+f^TzpiQ2zZiGU21I(#m>gs5?`Z8X=)!cPFyUo)L|}&v87L-3k4m6^qMD(k9c7O;Q!1JX%wd9fqU?5cEHd z`JJhV(QkCfF_xvGA6tZL(Og&6A5{C&ygFUqqNOoWfz1_8kdpfLe!z&x^gIP}~pM{aJGGXV!O#6>0vAu17BpU(g9{e8%_rH+G@{^U_x z9XRKKKA-h1<6o48S)A1sd-$hKBqgckYN91=tiv@V*iX|_@#8z2+ekgiukoU8aFGjE3!I%+di2K zG1TQp&(HDHEeY2<%4zQos`GKZL~Vko!Z8&|ysX#^GzcG5&^Y$t4p7v0&2+_^&N01{ z0QogV%Hw)cZ|cqo^rUP!RjuSNW6MGK3Jlp4eS&g+sM>Ic&jp<*13bBHIhIO}{tcJYkr5F)6_ zApu*x8QT2Fr3JB}Gx>SiQ zO~q5o9U%dc)8288Ez$FP`SebmnO~R+>+&WX87i}M zaS_s{=p1l8h!`xpx#f3IKE2X!35}X~vhLJZ=@#4sCujShiVQ|yyQ*1?R|JL{lwm5} zJ@+ai{cxB%IbmX~qv{i)zisWO1)G0#qG+@>39ghYb+6-BFz}MO6`msT**V&`Y6&k^ zz$@ulecePV{2yI#`8gRXeQYf_s|ejdsTcqUosDV++g4|yVsWu&8(F>1Y06Up(e$jn z!N){VK|%nBwpODt-$Tf+x>HZ$Qb@6?y(y^#g#fX>pr=mVV3gb7;OBvlp8(0@uC6pu zOAwW`ecD!Aa}DgCotuqnVrhC~VO5tw8`2Hv3_{nQ>Q|Jhx78WJA zQ~z@hBZVr#q*0D8nGO=tqfR+kr8IbGO>i`H$hsCcW&Kt~PJ&7;xG@!LtC(1f_&=^8 zR$~hr$Oj6g^$gDu@u|5r6zFgyoJhI2Ip#-ea&cg0CZ#3tzgekhN(PcBkCfaU;fW^$N~sUbN>tGw_=e*8utQXDA&()?2x)q?Iw}w5P>M}w_4!Z1bBohIXVR9J*x^a)zT(U4%*zr(w)vMlR=0E z%QcSiRfw!F>ETcY_5z&qNW-~UssIsdV#z>*nd$-)HMIW0r?YbqO(&CPrOC~Ln@KI; zE2Jy`O=O*+-p1E9^xQr*dX5WN!3BXZSMqev)R!=Fpuh8Dd*Wyd)NGatJRXfHd-Zra zJ|QLQA3fL!MWJPUYidjtM*0e9AZa4GlEb5Q1=fi;8f^ZjF|w#3xhm|G_2igt3ig6p z)V)2Ju4;!=oy85g(a;u_6u0~}i$mrF6=PsON{BO4y z0R?ZpI~9lz!!;-kAp_QSqs&PvYkpVOc8j?GozFx?U<=^&WSaoZQG~}ETKx8?m-Q|B zV{5d+BA&xahS?+h2E<^xsygtfCxrD%vksjdPO+&%^6Cr%L) zGu2;}N)8orYpRr!sp*y*+T#t$Ri;#}e>rDFxas*H7-Y3Pf4D)A@jX`stF1=>pcGbG zcEFrq0G(x}n%4=m=pK9GXdE)FjR^^xwLp5RMx|*zoyMj55}zq0v5(jU$cT~eK!!q$ zhmEyPaKPr6Y55;#piue2KwI3k#caUdq$#$_35pd3bo7P9YDZO4Ev$lkSjMiAP=eN)>*I~A0CQ`2 z0ws-Q(t&91%?iU-Pp^7GEt*smb|Iv~VthpE{(&r;V|vNT%MPd_b3{beQk?-o2nv|z z`4U@itd4Op)}l)eSwAsIW)eM;#g<4W^YfDCL2IQN^s`RuN_2*bKH0nouEs(xYu=)cyGe5GsAMP<_BC zz*}T}!c0JC9r_f2L=B_L!B~L$Vk@#0Gd@IpY@m=^BWw&M=%s{4Q;q>%>g0IBI4)#e zn|F}_+moa9>Eu~XI;09pH8&QEIINfzs~D((yf@Y-LSweVGWTBlF7zp z?T*ZsRMzCA)QPdon{#hGewX+DV+ucW%%Jk%Vp&}}H-a00#o9L3m;@O8RVhj~_BnD> z3$_vVP?OJr`~k$_mBbrDNb8eWjHHmrxu%;-Avux9Sf$)%YeSW`%V}LxHUZn`fQP2uJmTDN9I)^-W#!}S!%kk0n69&t%<+R4w+ zMZ+V{j7u;NcdM<4W5$D0Jdwom<=T8FV|^m9I~5MchZ};aw2nPFiAGb6;jol4vNe=> zDqrH^o^^<6X9H&%(ukKR18=;G#(-_NYuc1yY-DL^m~8%uk+g0OIVDlU`EF}m4O>~R z)9tB3n*2dMvVGM5DIf)#kDd(Su5`<*8vIBYsEc3~u5BsO;!^k*VNKm}C-0~N8;oFJ z3M^Uyfs%%7DT`tPLe3{m`?W5JPArtBDJy!%2$rP9U(~V4nmZoV0(Kx##w|F?izUaO z2ff(Vm3@}6X^i`yKohf%lj8uuwYg~kW}$)_9FJ!isMkmh5Jc_Qg>06QUwmO*tGRb+M7GqL%2rqGq5$TY)_28Db$`2ej~UgUdqA2%h^wxc9)UtG5KANF zRvYl8q;_ukOa;6(%#33Xoy0jL_>2mjWnsj}hv7hHnPDzcG+Pd5HNYepO+Q%b6uyK& zab1y^#Tj9*neWqyB%*~yC!g0t9SqWxc(uw@48cTgI}Js%*gX}LT}}pylCxZcFJC&u z2}-pz!6v_zEQF`*J>>@^TW&Ief)L&mE;dD^gSGcb!jKY>`6jx@fK(B$Ab*=T3dDX> zys)DB?Arp?GTQVL*fE%>gnIN!_WcK-EV|+WMfMBYNjr*Y$3{8Y1Vql~?DJ8T zjGx_Hy{HqY{tF8xKV_s>of5%nXZ0B}gP&`FI@7r-RBa;9``$MIvm7*MSqZUiBBCHL zn^LzrehTu>Pop-ee((SJu`)@5JQ(X~<1dD}$iU3$5Q{ShkHznGvt!!aB@%+jMAIFn zD0L^1`=s?Saxb-uo6>B;o7u84%3nvY6|i0RY2i;Spphu@s2b%eV`$YR>OiK>nsTSG zD~Xa!Q{#H(^={%pB7*7ZN<_Kp1X$IAoyCr+gFDXjx)R&_ zPZoH2py2T%3~($an{S{krBetrahTym6?cT^Xp`ld1y5xb3DUal+&Odnr&%K>?qfZE zEUr(m{psUoXGm(01=Q!kWk5hdLDVFNJeSgQ7c0L1+$ffFh3*Jd!=kB9jI7A8pRQ7= zyQ&rtD6UU2v7jLc;qQ9_aoop*3_&n;L4F>%he5erpX&rrlR0>MAlqE2=FxNl+RQjg zvG#)Qrs$?zF6WLaZ2wWm{-TSqKCRwTf6nX?4 zBl75*SGf^7q!{+^Y%{YZs!MRyaVIPh~ zWTEw_IPahIV&gv`j@FT9_Ju~W$|2E=@dW9_U3IVjjFOn67Kya^&a@7zbKuNt&3)^V zrzPxx<24_7o|aYIEV@ej|EtD#GQca4l@#VDVa1H|!4o`j~`R^k!LE&k243W5AJ^y{mu_yXrsb2LL zlOqj*BCSU9RG*0_fu~BVlElaVxtjEFKd$zqA@yUiN~=jV3O{p}1L&AiL8NC2O}KiT zyzrDpkx10N^wjKM{5MUVaaf@CQDdO~i`iOG8~PhoBp}CiOAwOFH{}iG8qh%Qsw*+^ z63R&n=Zwz{?@4HgAMJBe`$%lyz8UFO2#QrM=4A4G{ly?Tgjo8T0*ZvM2J6f7d-Oh8 z6?oDmOT59-r3|%(nP@_T#*xsp`S@lm*lL)_Pl0z`R|GF(wgG1l8cEQSxi-Ob&%P%ogH^lO{Rj@ z7BZMAF(sH0-SC)lvH7gqsv5xmjZX|Mf7x*+;w7-0Q>yDhE9X(3K1ZYNpO>iYjP$W$ zGX!J0t31POaziJ7ULE8CL?|_H8-RGiY-|w%Ez#c1Dp`3Gxb4?OZT6hj9F7DeN#us^ z`OtMiwp=apMM#o)lS_^QO~VngbOKkh->+f4r1wG2!F5=jIvtibJrg#n*a?Jjavze2 z-{-e?=7G{tM;u}u*8DsS!}RNOG-%Cx)@C6RBJo(M4J6`|^#@3C?|aZtWMXknDB_Bg z{Uifop;YQ&P+Ps8-c2;;GvIYtv2x^$H`YY+qKjL#>5p@v3a##7y932sFm1oc%GACN zc^#UtwF{xX(|%(fq#POkkm4?tvDD3l<5CC7OgP$P+{fn8U`avCiqy4gUjs!(-Ah`g zl{ur$o-!AMy&4!E&nz<*CkGW)f4x40;Ta^kvusus_@vy}HbE3x+CtS|+#Q4jSc{OZ zU15cKRUQ`61AkN!j@Ty__dou@+M|UBSe@QrJinAn;7ip09Y%A2EydlGCqf@Q6(*uu zuLnVLc#_>?R)QNekT48>U{Q*|q@r2o{}8yv#Hh`Y5x@@#oe6a_!+d zFC`d~GszB>T$Z+S<;##c3b+*j6FcYU)e?ByA226LtZ~)G=};+i-RhBo<&G(Gbl5mP zHP~rQxz(pdH=;dQsKS%32wbAWtx<4yDXH8kt+kPFuDZs?Nb)8ng?>%eIo*yE zu$-P3BCI6u12u|&UmOdg&(mlsF!`kn??SMZIcUzX<7H02pY)S*Ye>jd`2G^PT|JgU zkEI)#rpSmf%5Z4aL%#eqdV1tch|IDiPui}+=c2SD3enH?(Phgmt{|_i4F|K#)fd>t zg68nru1k`%GQMv2`t;S|z?WZ@^Xd~QuA8g%CTn`#JrM+dde%nu1o|@R|8=)54m`Lo z`)prCGKL=Zj_!Q8px0*z{Gw`54Z5NG3-zyk|2J~?^-a%>+`j_(6)1LQ3dmEvi(R150y3Bj#>{EKGyeXG*gK^Xt+B;tf0HLEzwnlp#ccteZ# z1OARu-?s4t9XqGqJ(Nt}W(}`nnGoPteNEp2qdn%6MpDMU6ogg1!8hf;cV& zl9ukE__K^w$I{b1K>lg3*dAz_`2EYW z`=&m~AqY77!NNgSN4Or5BQ$9;-3BACp)gub(<=(X#!!r2=YB~n4rL2ue7=hN>yKiL*-G&16|fH@afgs z0`?=_KjPkK$EZ`c6VBvI66N@~jdiE!Srp>Svup6L5_p0l1*scE zMBgb-Q3R^G2MpbpyOO{QOLgo^n;IVZQD| zH~UlxkrQvP_xgXt_I8P`i(FRFaweNm4qttGw-!UzjF3oM5F88}drv}s)!^e-&e$lJ zI+{lQ)u|fN?Rzlx>f!9DTEz-oB~Ou%*wE$o4@x3F4!6^YXq->6U{XKQt9>#*Rf2*? z!hbWW{ukL;wye{_8`m9=RgrU}h2@MkQ_ZIl9AH+W)03j6@_K_sFoMS3<KC|xcJtKw8S2Q*BAW{oTcZxKSQdaCyIM=6MhK=G zHe&lJ2)dDA2gt>Et!eNz>0gau@dzN`u24rS+5Do067Bb()by4W%@vtV@iy`y?QF zv3mh||B4W|%_LDXzEZbSD)|@bzi_zaqR*?#9dryP2z`X9)P}!^1lhP~FHXlB#>6RAc9%8Tm^x z%n_N5QHso=*_h)BYrfs*LNj+8j-*;&vAzU+^2ER{p>HC?7G419!jkHBAEVPFbE0J= z{0`u8YRE1Hy+Q0`1mks7`DS2FYMCKDJ31%TK8nkEQ=w%~;u0CPLmGaZHio;^Mu&eM zLDhP3=O~G3SjBgmPtMCdlN5U^b3r!8wVLZ?`2C7#uH45$G5c7o#109`I5x?}jhQ@i zV4D)DjD|#lt(H32L)1c?NGe;3GDTiudc)j4EkC(Pixk!mFRuO}B=wF?GTT%fVn!7T z0sqW=m0-FevRxlgA3v`tx-%wcI;RdTPwcgM5G|<%`Gf0>WZU;nggJT}#t(hmUCtfy zKyzHIjOh58Fe8VV>V(1D{ncJpU@ zT>^q>Y*j{U?sWx!Wp$baH6}94A`z(Mndp;z);%k)Un!^}rRFA-yrKM+%mgNxxbUvm zmyo!@$fd!^huB#eY3D5d{)udvX>*>!X>2+MvuWR~3HoE}k$S-ldR{8@jFoBTNhgx@ zq$Dtfvl9$VE}L&&67YdB{Gs??`akfuzlq%~&gny$Ww!`m*5;3cERW;-0wA7vlQD;lOEKY+{p0J4 zwn>WN3=|O1*TD{zv>sOHaD@nq{W{a8?Zx9TbAZ!?>`i@zaxqT19a#DZcMnCKNxo5m ztHRO2a6*LS?A{F>BMW89)}sUmEOO%c!}rL+7#p1+-TFrNW2z`PEW@)m=S43oCiYeS zm4G=!Fq!k-Ys`Dkk{@;}7@xpZ9!%+vtzQpQ7P;ZO@AtGM^`mZ~KM`?e+gCuxOPAd0 zpCrER0Oiw#13?!QEWR7Scz>IHJkff-Vb3p=y8QoMDKI?uOR$(C{u=4(W|vddH-o=H z(*KgE^tTmXmr>3Vsn4bQXJrp>&AnoXzyuDaQLb*i^@y0}@tK6bdt+{w^`$-?+)#~1 zl5HQ}lYmQob`1JPkn$Jp15)|f+378)g8Z`R<)`w%!s2~X)C7!u^jTM!i;oL1tNOrK zL2+J#*D}r5Dh_KbG$cE${z?>2;hVq~(rerO@FMFV9c2BbOOK0eM5mL~aSk+!P;& z7I2AfSoYTF)Mg*>dscOsj*nnU^)_VJ6nQf&2`0Z@mxPk5av=K(ndtb$c+?ydf$Kxk z1(xyXS83nNbTCgwf=^SWrRvy-ZkX<|E7>NR5y?3V;8k zi|&<~8m?}f(SxqAz9-JdGMQcH?A4?TwSqb4K(=&>Anv}FhOk!-BX?z$Du&4J9DJMm zFWy(oEII&T))F#B#EH{qcDFhS(=pgTmAn<2`8_ld5{T_vTsetjyFN)RGrjKAHo`Hi z_FYipnDja{Kjc1ktdqx9dWK*)-$0QTi#AgcZIw-51>Jk$p??C3bBz=h6t!Pl4A9dB zOWo?_Bg?sfh;c<2+#GZRNQunPw{XZ`zRy{1CXO#~{fOTE|Ly{qLZr?cN|@fk%0INw zZ6W5Z%~&M!{mVTgr`!O$4^IV6CUGBw{552)K^Sb(a&$&DAfCaw`r5`>Kfa9KLGW83 z<0PAR&&rrtGy7A@8mCGBPG%}V=4*g;SSFWq~xl!pO3p=jTKT1^9n~TAhklg)0b90Ves!_^PiA`Fxn<*T`VpQdMsI0XZ0LEEB)vaC6Da&O zR9-0nlYYWa*oGH!Cvmf2>WLL%^&4mtBEIS29G#4}5as6%hTh9V52Z2N6CYH*kDtbI zA*4{Aq*Uanuzw!hJ-UH${iDjm&ie^~?PbJBeN5E5+=QV+OPOGd5}EN1N!{)$p@H<< z8_Kt*0aHJ>-Fvj|f+N($0!2!U43%oFN8Y1QmDDF;YR-(N)n-!>;C*#~&p#Be_vot= zufOmt_<|A{@x))s%5XxUgZKhRN{AU=H}v{$h(lwfni3?WDK56a|(isGPx@DC;I6VK_u*$Lc;uM1 z{d)bcv8;?QDYkD;3tkYi?eE}FBk*;Gd>cbg(=u591tzkQmpSq+b5%(fKFK+f-J!{R z;Te*3b`yc^(|-Bkky8E927?oQKjA9?LTExP`vjq!L}Ws8v@G7Tr)o4dn0 zFF)ycAan&^_tH7HM33nIn|t1W9)amknGvEdtVO;j1i|Qn+cgLMHop6t(GYJ~-#tSR z5b<0DD=`(_46-&MfyYV8`|11f>CC7@Uhv3i#4qtm@tibmzot}a=a7^gC_pnTmzs-x z>~yfMl@Gt1u*$(%Mw5C|s(4^8IK{MaCZzvds=IJ(sU%jCUQ|L3iIAF_q zDyNAM@%4POC~=JqFD>5OS*2*dphzR9{)t81{}^xUTkIu|c2ScceP`@#(ngJtfrIVd14Ql8S0Z{R+jxW6j|6B})T%$7s# z_~5;dP;q^MiPU4!OG+&yIi@%TS;^N_HDDDnVIPs~1ytPi4f@dXZmb5b&1XL@u@!_#G6l$|wXdri5^HMbTxq@}YnMi++i`GA^De{}u+P&u^R zwXzUobLi?)6v7}@cz?ZA+kE0&S)0fvFD0ce+i`>X41#eh`t4^f1K?-g^k6VM87J~i z3UK7$juxnKi2FBwz1};&s*gu0JPx(}27APntuIeB_|GPhfyBZKnZ;K6_k@Bp$DB5Y zJW+#|9-`H%k;FeakrN=NSiK`c{0Or_@To>my2WRQrFWd;j5uY=O1_3E>0F@|XvKP|H2nCM`wE_)tUL6_lUb0-Pe z<-YUH8Fd^Qr@2nMeb9p8${mZ2GGM8EEkkDT9pY8*%z6?VOuf3aRhtlRG_JbelgLlY)2xK*ps9hae zUtZLw#LgXFL9W{IM;?FUnu=*{^j@*TOK-UQrbl>z0dy%eooZq0?3}qX2tLFS4~13z zteex!dE+&M+=*AzifujUi&ps$m>w~QcH~UZi2XkE-d#0$nR|3~g%rp?iMCvBNiOb? z!eBz(ssWTiWkrP))!tw1shYy_nz*M9Zi=X6k#=TUp{$($aDlVPW!k^EY_&@K+sjjx zRyQDDIdW8cYa*m!Rv?-i$uG8_snO)FoaXw+=Z(nDr?Hr7D(}M5PulW*w&JOdCXkGPzNGw2zQ89voeXD>)6&wt^@837-a zkJK{OmEy?z3r}%I&baOnzT=DwsxV}U^G-V3;#zw||8HGT-1WfuSn)YdM`^m+)3(gY{ zElu|b3{!tYo`t7eTY<`t6O0UQq2&&b`29mQKeF}|L zN0I!jJ4bhs3;Q~zjZfrEO-js2DxP`*=;jUij%RQiA-TPVzRFsy;WUOjm9H-VrBRyToyXyB+bi zUkY@|9goCE&V?qv*vW5AsYy-k>)gT$2}qu|V%yH9-l;F)e~8Tn6hjLz^+?1) zCNM!uW|C$n`UTlfzswhrswtsk=tPSWZ_f6KsQZ=rms?Y2%NrGB>pKDpsD`lflXz0u zL526AoN-*xrAUh3uP|6j|0JQ@KIqf1r%x9=BtucIsDIr3`VU0gGSIicGgA4@8j{mf zk&dZKoz@@6v^l`|OZJ)5SXlg)?y*ngktj<{YLoK_rAjj?oy-Qo?V<7G3!~@BGdaB< z1Ycx_kWKd|2tXi)HJS|CwmpTLj@q^}B!fo^N)!e;ey*J;7*<6M>aRk1(zTRspKE z%OIENG5gBDl%~_jegcX1ftl(L#O3VX!zq!w{UD)n*T+hJnxEgE?kzp(pzJ8_TCQXE z%9?RqW2HrzA45x`v^2ym>d3NOnj7?8Sai!W$(N9pFJf|sgg!#U56C;Rh`9KBxH1j4 zs?~u|)69=UOmX*vsCGZC_s#_7C(U)~;g$Q`SyOGdy=)%uu{@TO5H2T-kk%y)8@;EpPasxhep>#wkv>EeA|@N zwx9glTQAG1e)=*G&{bh0s-v0i3Kj&TC!hC026S;hWL(O=J$w^M(K_Z__S%GAT|yNY zF!=qSY1}qdsU+<~oIO39n>HhFov>nK6`nc(^tesBAG&Yv+c-h9uf5_ zHs4B931!q=r`%;s>H4(*0nU0N2ON*V`9*U(%8V3ZlS%P4n@=F?$zPd9S_2Qq8> zNf*PiE^(e;QF@P&o4k3g zwJU@5%jQFP)iJF$@YUTEvmBzC!3c3e|J*-QO_n1ajDdwr8ngMgE5FWzX;1H$KYy1{ z+DV{SvuE=yt_uZxzz==LgC8+0(0LH^PAYxLj2&-^2S55e#8VpG`QP(@7Zqp;Y&us= z4}`?9jIq`LvzrMnsD!Fq0Oae-;DN0-u8!VXt!<2~@${7lrqCdFvd6z|8^4Ilo&3v{ z0Uj9-*kwdSFL9?=zJ#+m2G~ApwEk42C^8+IlukkZw(Gd}qnSlSP}2kKL0V34eQt0| za~;5YupVAOV)@hWg9Tz9*zWx$;v<>uUlsdmZ!LOyiTA1Zayya@wSnw!kGSVFERM_H zc44+Z=2Yjs|2G7Bw!Jo%p-3%ouLLOUh^)>u>L1ZmjO+FY^uiXAP6y)5z&n3Amo; z(9=tEzt_ECYnriOhj17!kb8ziGD-<@TU2W4`TY{;r$=CYH;m9D<&9`}(l0+UXFRPj zR!tMdhtz_t*gww};(jrqclCH%!i9L5_g_c{1usR<5@$3oPzJDd0;aSWeS2Manh z!Dc4Htm6_c#^)0QQ@;|ce!3o{L{YX{EnTwd8uYYg^0^e-5%e11%+*!|WBJ0oV;VJ% z$wcW9Jhp38{w&2ht&+=>jFyJ^n-dgu5EA8u6W|C`Bg;TXRQ;iN+tQj^V^dY|zR25~ zL+)yKpxs*%r(0se_UcaNbCXctdq%!qrwGf|)q8_G2X5v5RI`so^IRLQGe%hW;Y#M6 zQsYkNL+_;c`v>^v4j88f;(mu$^>x|GT_M{Wo_|d%*@6nzqvQO3ojWGu&V4POG;3ew79vg)q!s{E|yM9B@>T>J|GfzHu#32@BBef3+IRwbP z$23sUgLC@}7CU;pS^`!z9uyK29;4GZ;*#I>(o^fvl-wfj&7if`7CAjhh>o42Y#;s-4^Cm_rB< z8a=8*WyJ2BNp4lM5Bhy!#Y2lt3985qs=|vxkd4o`Csm;)1bVXq* zq5Y|qbKC(+I#n`NM?kO`_2)a6Hi7=KYGs3m>MwDi4a4dK{fSh}iBGByHnOZH&0Ml> zbtEK8r+U-gHKu-_{3UY6ddMZ8(%p;Al+;ahw3^X*l*cH{V^Z0to>sSI;#W?Pa?Hzt z1TUa`7P-urb5`4|xwT!qpjyeR6x_dX9bqlu2?7HpIqsiSM4H?P5@NrEGR4iKs%LeTKozI-*0P zdpBeccUZk1tSM6zZ^F{|u0c^|R5ne~8xoEx+a{((9&euM>j5-dzymafSjkW;Tv;Qv zA*ls@%C;WS2}n+#VQtI4~PDz(3w-{8f8XbaNO^{ zYx2#R6x2+08Vi=gNRVbvs~Z}RIVmyrgUpi;{ejdJ7{yfPLTvFrD*$@7~hmJ=}6ZP=%N^ z81IkNo3%#Z$fM;VeZuVlOCC-Hyfu|M8- z``=HYG0veW@xYF(pC(>L&wUs1@f%C)k^i9lKE*i8zYQlW{*Z-rcgXEen)nZ#bRNBJ zt}OCL%xrxpQ+BI?1ywZ~7pUq>>>2qT4SkBzuwTWsFn=D6&S@SUp-`yD$iC=^laO5n zmQG%n(r~RVY|tZm)FF#y>Z@5<+p(u-W52R|)s4(DOgC}ME@Id#TV93gG^{M-%wB)) z12i>-=}xn;eW`i-{#~iQ?U%dzjH>T#dUZ@zmh`degv~UvkP+iHp?6S6)#GM}wNqvH zr(>)`RPmao)O~^FD-3n8)sOxZKeZAkEb@sM#m*oG#OLgCGcDNYtpPM*GM7Y^=A+S5 zS$TJ<_2pOndANVFtEBE?>xHfGGN2A3`1Y&Gw*LY8BJ)Jx^)p?+V;k-+!k@217_8tE zk0qXpQVe`R(AWL;jZ29l$y4bP^$E0)`+VYikD$-5l6reXrs5L9-a(igDZVJJ6%NoZb04C^jgS@X3@%H}!=Rg?0tZwtwTvE7c z<44_TRq860N|ZfJHjHR>Ue}o4=>NetdgMT(fE9^U@)FNexM~_xv&bZaOxXTc#a5-- z-<{ET>12pD4pFG$>{xvVIsBTlyu%yRF>#S+c2q@D zGsjIDxyG-!NS2RkD~f0yp@NJ2j!)?eo?7i9;=)$NDT;Dl;u*?Fz86Ti!8E33j(T3_ zDlJT)*H2xV52Pd;+N4Xqb+?-|{Gb=1rOp$V0A( zrixee6-t-q2NYW4WsG4ancrxFSNpo&2f@oQAJNPWUgbQAKGeiXI+rNtOJ3s(d#ogg zh=txI&JT8RrbqEw~I z(^clDysqvjkKSLoa*)l_Jk3e+*Hk5(Ud}q)$k)58HOmbQ<<$dBF-#%lDpxOu9;R@b zJdSad_vyl`_c35jgA+H;a)sk$EQg^2CKHS>!7Sd*yx{7-CuGa5wMYwnG;*HjczD&= z=>9tpNh#S>@)_^)4RaE)A|f72Hh4B?xx}UW^WoMlre)E?7ktPKIyW}AAKV+ReV>sF ztwtEp1A2r)3e-yYo)O1cs#S^p#QKN^W$FEDqjb)2kxNvr$vT{6f>9<|Kw<2~xoohM zf`bLx8D@wQ3dvYWpUNeRY7TRaFB#Z3iBjb8sJ^5wQMkHm(=&`Q%H-w(zC#DoYG(QN z|7Y(#yW_f+G|eYYCcFm$f}r=_ds4KZ6)B0LBjFRk|tmh72nr;nnOJb;xxTiSGDUweH}z>3z*R2eDd9_|l8pE)qcl=QITh3s zw2c{Txp?240%EC9#~ppaXvQ(nA4B9~48xemHV$%A-X+{HLO-3v8opqxx&!E?di}s# z-qYA@841%f+LCrr*1u6cu#bzJ=L_aA+>0yTbF@*z%3&?Dnay_2^TZ)m;;=;h=T05w zWNgOexzZWQSNszj7}~K)oFGumeKzxdu#=aqyM3UZkq!PTmV&g&*hHfWE)xVJ)$)wD zYLO~Q{-Z4`)0!v?HCM{1qrnO&)fVTB%``^vIsYVI2V@SBc zs|j2o)bohHaDml)&4iFZp2`S*&s_Ghh1=9S z$v_T>_pWA<#bVa6h;bx`8dPHRJxAEZY3_vsgZ2}AB=$jTVPQ+TROtr>>3D{UtJ#&d z`pJB2pqXdy<`>?^HBws0WFepN2^0LGj$Y}e3f}R-mvv~x>tfm&I|(k78tVAKD@HL| za@6vH>`;mr#X@#*f~vUUrbRYOSp*SEpf0ztmyfxmO)FV{H39ZtY&Qew~KPcXz$tNpYi)sv6hml$# zqN9Z*ly|)64R0915HfvtoWfK_Gl>}-;&O{5LX0hgnJi}&vq%llK55`R@2O}>sPFiW zyI{vvdCgvKa-9`?!qAY!$^h0ffyo@?gg$rtaRRN_BqEd-C;=am`B1O}1ouM1?k$LlD&L`IsU+%=UkUMHCm%wq$~$PKWO zhZ^4Vmg-JQT6F^2qi|r|DCNA@XN+egg+8`j$Y2T6naMAl^{Pw8+x3RUAl{R0UC3;{ zWjTc{HB#D*0%+n5XZe9631U<`4^{%yS-145j+aUF_xs5r$?mCUn7vN_BnRzRbe17^ zQOFE7$qI@z#V>$sw1EoBs1iH&*z}I#F2cuSNC3>yUJWvvQr_{1NsJ`NMhE zz>i#vfpTiM_h8dNIb~F1(>m`fD)L0*KkX|`+~NP$BYefDj3hI}jU?$N{WaLgC3M8a z!}7}4R&tG}I!dQYzCSX;vhrk+jz2fLMlzA<9OAsAdKi&U_0OF;%t`i% z@L>kBkU#MEd_s0e7&1KPIRDPSaxS`#tL;XI`++vLWS{VGB~mZ1c&iOSsx*g_i6mJg znJ2}fG*O8Ok?i9Y9r!(e&mwXHszBCJPARXcL8A$ni#YEmRC%^|ym=Qk?XRl@cz<*+4K<_csQqC*hP#a*%c-bYEWS>Yp@{2sCffTYk3O)3$ z%48t37)}a}j#!oh;@t`0*-Ykl{39#q-yRJ4$DdNkHU6FdizBU-!6Wg*?NHwGLTiDQ zCW!*^=1QG)@`6$oQY6Xm7mAf?jgm!DNG;W-&eC>4Jex`UhJR!gMY#M~hfP%SidR&L zkxqbX1cxLV#9K&@3SLr85-I+iPK!LIFoQHcP)kDxeK?zm{D%LTmGlp=Oe2-NqLdo! zXzw_}pC=B)y>IrpT#!d3lSNvHHH47NQ06j>CaS3Ku|@D4I;9V{6bAAc8<;{tN3iML zwxfY3Z08qlQQjG9QseZSn0!v9QC?BQT{D@nmVaH`1}_=KM2dXE0YWCzC}s&iv#TA2?G%bx z&&Jl4k!pRzd+P9XZW~iN`y}xtR$jB4>nvdt^T-SVaU?!&ln8W)FKf-;pX|_!X*&a8olOFcq)>#>hK9@PTJKno*J>;uDL?c1@8Y zGsPU|dwrq?1@YNP*D*UtxzS4%yr+srP^%lECNB2zm5qRUUQ*3#Mli--m(r2}6zFgk zu!{o$D=>=!R#zLa_@so*{J+AA&7Zu`J#?r@WpEM-DS9Li<^! z$Q=+*Y|CIg%lLvhq=q2^K5&a8Y>UOa@M?#L16PS0hGX~Rgd~hS<&}BGI2}Skb8v*V(Y7>>5;788zBDS0~6BCu9i9AAZVWft;l<82NCdHEEPtMP@G6UBJ zYG|OGx75&xVzti4jE~3M6<&FSCl(A1T1pj97|&R;e7v`tA`0*_=-%slEmN-5Udwc5 zAte#zWNI9GM@+4ryOeQ?^=xD$sYqaHilB_xG{!TFKRF=ofOz6sau{XsYEH3>6Woeb z(=J*F7nH87`-p`lO_cJ1w~Wy7^!KYC2AD&esGx!m)S>O?W448$t^k;XUc(Yg4VBbT z$#cdq(odeaS`0%I?>Up4VdCe#tNxlTmA|5{QjtXkxkv87DnpkR~yrF_O zlrn1WPo43sey9dP>GEdN!obt9Je7W zTYBYdUsBEs#xsswpFiG2Ii*x$MAQ|HJ=(vT#(cN&M{DWm6PtTHr;5=G>xn_64v0I= z#aR9)R77jjXb0bH`8$gN;PkIhawu~bv4HO?aobPZ5|={GKCTyfs4)+Y<580 zX^F)VO(KVx455TAvYXO2nR-#dxI3bdS?N~4%ja_nhI)BNoi;mNP11l-={lNT6MlY) zU{Y)6H3*H=P(_mu#65UW1d)VJ(%KEZAxwu(V-jEMYKHn(B@Tc)Al^g$@c|StOc%0? zgH&`r$S^j2aP8_L8l0vg(XqW@$~pT9oUVPY;OlGWdxRUBGd6|hsZB##p|kHkR?;Ow zhD>4<>siJ0mKs0~o#KFa&veGU9n;NNhBKb&9ONt?Iu|!0SiNI|vje|XqKagWFK8w9 zJY54n9bKghYum?bf*;BfRN*sjOx_qy1WqJ@ZZ-5O-QT9n&I{rA*@lKXAGoExQPP zRPAwtRsy#1BE9cWzwgTA@s92z(Xl|$-(~!vzRNcevl+>!e8adPp@H5o`8Xi{(IK~V zI6T}Gu$C!$oF6&Ohv*n`Z&4T1>EWKJVcVJH674ZBD>i72M@&U{>Ogzkvq#-hDCSc( zGBrqUxBDj+2gIG$rq%O?T+Iy8QBxU35feDdFZ|j@bvtGlkAB#O2a)b(C?&z+f}N{I z+QRf}O!uoX-+d2fkX_`nlJ(4GL^uR;0Nerb?r)X+grTHkX<9)clevsxA_qCd&1mE{ zB?2A8?imQ(aozUR{9^rOl#8w?Y!G@2vd?biil@%1oxQn+rUNoLG?rKv7R8KeSuVu2FxdU2K~k3;!8RU@@OFFGz^E zy;j9@+zj&-igTI+;@!3A#~bxq$`734Gd41jepmtD1`jwF#r%%N?BHi^L|SjtLPBP5 zYNU4>zh@3}-Du^wB;x1L1pKn|7Km=sIaG#h;^ktyfO}41AdA? zC<&HE?HH^&^G#QI-5SLd**S}7qH!jN`D|hlgM!4q+BTa?PVocB$Y->QgCY)y_aK*? zcU8j{@ zA(h#D!BQsp1<*QrygDxN3rDy~4avA1*;xm~d!B3ll2Yz)g_SI&I0U0045Wy$OydAY zDGgiw3m0~~>`P#xw!|3*;&p6SpS9;sY})tkBZ(<2X9Ww$3B#Z@ah*dP;xzA32&gjZ zGzY|cR5Lu}85g<13Z}NL0~7$gE=Dt)Sxn*(S1AvDS}TS?!|tEk`tGdVbC2o*tGgM_ zY}T_XbSyYv^N0)VVn1a;Tl!9fp#$PQbYwSjjRzcN6RQ{&Vu>jvF_qC;!jJ6d3Du$f zCkaVgXq;0>g8ll)B3i64D}i{VmM3P5E|D95@gX*1xx--JJ1);@QNR>7vW|frhZ6eS znzvk+t-6z!ZL*dn(YAL$+-aTn$E!KVBlgQCT}5F>fm8yPW-^!ItmH=y@}}d;oEAhW zi5T19&?tW#bTzLgttLV(qw_$P7+yS@JC5az^q|W2LONsF$T~)o?X8*F!8Mdx?yyyM z@sP@nZo>g^2gG}7^YDst9&w!YEF-7Auq$nTO9Lrj1dG|h(T%iri|@ zW~NB+GNEhkqPyvZF209u;n)Q?!}yG~Ol3gx8*Vp^N%8Q69qi>w_+1~TIUwHUJvqX< zEREdaF}JwH3g(g#;-|?>WH{rQ%>mB0uX@-VPc6O94j<{;Pk61NE`N6xgILN6mM}aF z3$DE2C@)_e=%gVO7uQIN1PJZ4diu=|0pqv4MYl{nxMN>;*&iZ-CcM3yvY=?ns1m!|1b&ljg+#VpZL`q zO6Wki1LA$H)pD2DTxYp#(8;8PK)rOvGk~caVjI_K4BkWRtIN~Kx#noWOkxgg>oH_#uKUXc2eNPb)$fQZW!DdDHJZ01rz3Dd$TqCgerILKixx4)O;GzY}{ zQd3^*FI?m*YnTB_Hc=3&B$%h1(HTxK&`Z<4iYCqrEz#^@i;cVMd}jV z1JanlB0ggQ>A`(e+paM0aDpA2qSlE-aX`G6`8J&%NH)*-?;K+TpEI8PV9X0TuZto4 z2Ntu9?cAZl`-KHQUBh^9Eq3Oaq$?mLzV`npeTOI}fn)|Uk4-EgFARn>@{+S`mZSPE zsw4*IEjl3HGlxY~2RCqs|IY{HBS>ula&6tqQyEVYOW4MC9#ij4tdWR4-e~SyJ5hu} zqZ*{~lUwbsq2GDf(H?MzVW(Ud+014W%Nayk7+2&27x|teyr3@DCwIWy0rB2B3si8H z=bU0apHdv+Z3+3zXD|!d$!<#V2(AbnpZG#@?9inNxaY`@k%TAyONhu#EBKguH~Ik;`o3Ft_+1aky6pz#S0p1Od<^JSoF7UU8qxtY8TRA#TlLD1#Wy z3=VLdx0c4=D%!<>($)7GowxVV<)gZpKnW{YApOE*=ys*za=qi$SO)u#IT(D5UBtGYJhLYS-X+Z&0dCLuU@C#3avln{M zSaLwzY2D^m7(Q^4`y65uOX=5=oZpVul+9v>bIHnyvL-R{N*a%3aJB|`>B5b@XnFYf zmylB;+r-rvpRKjcm55~*6dOom6kqZMqsa}ah@#Z+&B`{Ze8GBFGbXI8Y$-=Mz;W&;Hks#R+5nBbA37l3J6p9JbRtu2FFE*t;ez#-J zS3;gM+;&zRw!1WFg`)8W*N#(|h}&}|fRYKcg)3}*dZ^|Rhxw7qU6oMp&?|is#1)b# zU@6OZ%r5SEGZsIJ=HVrqInOFKF(o8JjwL#TZ0>WD*EC|H6FZEggmEk$YHNi)P1sQO z#ZUx3zhDV!yw;PLb=KR5R_)YLT?}a6TGsC7ek2m|3XPO;m>)S$S!WXJHHO~jv_1sl z0v4Gp;7dMXC?EKQUF>XIEFo5(st5ZCHQeGgzp{!AjP(Y9b#Q0N6p|qW^&z);8cC*DVy74Fy1`e@aUO7u5>_xG6tN=d z3?-lbJmeAO*tk1_afva6Fz|QM?oD?KyQvslnoB?FM~Z(8jMfyM$Ze`|2V3u>iH`72 zY}w?K8+t|Oa~#fdfWus-Hqkzs)A}}uCoz`!d`by9{%+@D93z>|WDawM_r1*zkan^L z13%FqXbkX_lo$LY7xlWV&`AvS1613m5we&-F-1J&IUmr_^$_D>iS_`y8^))KQA@MP z(LBk=9q>GbQlLY~(iifIs@6dMQ2@A$407m4PV=*O7`@)WZBDX_W7H&=1$T$Ygm79P z0C5)sn88NYXi=+Y5R#e2c$To4BRpxpE_~OlO`|`;Akb=T1b!m^-+0e&0>Dsh>mmQI zeO&$v8zm*=U0LKalVNg`2l|#;z-o=Eos~#xKPkprN>SThq*GYl369ju4Ww&^7D_)W zsg<;^AQZBcGQBMKsiFZ1Q64W5_m_}!L}(X_RI(`~mn6a|qP*aOY~i4mcTQF|$}yfC zOC*&8;yt-pWH5UZ?MjhI-h6+}Vk9@YMf)609*n?aRfJ+^e3N`Fi&gvz!iRE zKhG0PqByOOgSe2yXg08hN%Zsk4K`IA*OLrk9fN&5ZxVy(#~7CLGpAaY6Q(PM2+?q= zit&vqZ3W^W82>(``2Gq8alsanm?Xb*&9}z2_~9X8L`Y`{ISl6x_q8h8h?V%SS2`__ z8V!bn7z*`*Z!(JEe6?5MHSx;I`xXd-y$~>7RelQca3}>(w zk*lThnud-8HxoubCDtxN8rkHNANI)%&pF3F_VS{u*0N6Pt011MV`LTIFrhgKSiqyD z{K^*g@y55!qBL@uyBuc|OBq3i-`o70dF*Ekmw1)P&e&N+=opyO{?<6wS>L*b1cnQ0 zy*{lcbn+>Z zAPF#SG|%k|=HKK5RcZsa?$_fiwf;dS$x!im>nbG4XdR>vxh5~Dp$T{7K;DCsQw%~1 z>GY$3w6;&A!T%`d7Q5KS!}!R`c6M#+xc|K$#8Vi^TE5n)y2q!90{wy{jeijZ6(7Uy{g|X*yURaY-t=p!81ys2Oef zzf|%mAcGVQ*Ck)Ei=ABNMNe^e90>27ATDIHkX0;UazOHm%~KArpHuoWq_ji5+~hHL zIL9hx`6}TE{aC~Zrg4z{JdUn|N`gA4iTcbUT4=4bmRrlLk(Sk>xS>t<6|=*fw9Z;p ztxQwH6&`b&<*Z_A$EiR-5(CJikjLDol%~j2fufquB({k!gfUY!hkSAa$pXRlnCoVz zIjtwClnxZZspXu;!7g&$%n5xMQPfmLz zN-GGSjRll0}>WXxyS)_^8h>iNYYwPahIw%#^p%>lEEDonexQzeJE!d2F? zfYBXoUaFVC8o>aHxW_Zf@pJ@R8WZTm-TyWuk*B%zBQqdE2ixdbv=&)^ZB4fVvf0$=OLNQqv+kqkO@rHVcmq#9}YGOzBQ?Cc^CXHMQ{iI^Yt(Hd|XEWy#o>1SNlYJk&S9gyy zgNs~d^DQL|2#BYs=cVk@AGyK%s26!2Ua^@ovPL&Cg)Cp{V=7Y^#BzRO56`?3hVFOlPHju_hw9uecSw5_V83|A~;tQPx+1$tmkXSlaAHC*0*}2dZsdr zJKUm-rpQuXBJIf0XWVyiX74tpOY<2ZnGzV)t)|AluRqBao@rI&b{1&TQu!A>Y`(C5 zCqtx#fN;@I<}p?;abK!vLOPQS6lq>+9Oed#6msZKR@hL&M#?$H_nf7yXXQ6*4**HW z6OX1@nj$mU$a2Pz9RR`=?B^FQ@U+v44K>{5Ef-nEmyGvyX^R3DF^r{bV;>b=pa#)N zC^M)_GGvwOOKY|@Dj?oMwb6cLelolDwpD>ftYcNhbzXCpPx*{dE$J-MR`w``{$wzi z``n@2M@C4zsHC`%REk^kq(HI*Xg5%8vR{}V%}(xGuhHmvXRYM2mg*_}(%K;XNs{K| z{4`SK6UK3a8#D+S(jF3J&}nQ0l?I>4O)iC!t*K$wP&U<^;Ac+rkh(5?cinOp2gDQE zl9<3MUBO)P16c4XPOy(-+=wwzM=9qNkGRH4R{8~7-Hc!mqnN`!PEy%*{Y1QKCz1U& zo%z;kYne6O3fz)3_H(n{95ttTA<@E=@`krO;xa2`g$@om%rh8H9s_v5L*CO$EK8yk z_iy=I!U$<;_-9Zo&D8?QA&5l5*sshEbHW_gr!MXE#-Z|x*ZRypD=X!5D<>eKHjiAg z8K6(NPYp@Zq3Vn#xDRPZc5##Cm6g?SBuX8Z*vDZmb(d6})A|aCTMTC&Ygk2K)?p3T zImRx|Q5TQ#AgV9N?IxUS})i~%@!Va+A@JQx}*2>lJ&&Qk$I9EV3Gb5FqC|KM48mK zRKw|J;z50iC|+6FaHG44+ni)CNBHp3lr?lfJV6dce7uUd3&aj!|e8482 zHM}44UpdZKtYr*&K2ef17BQ7Y{KQF~C7K}@l%_}$W|Cy6HO>01Yn2tWEoCaqL(eYr zXL&@UXiVeY!)+dOoUd8QXmUbMvjyZalw0yZE2wMs$YU(U+nH~@g&i`;pol!LGE6gD zs+D@*-fzB_+u9%+m(V>`n;ZJSnF+4{#1e*DnZC1%xG1K8;oQ(?RM3R0HIPTH(HIvC zdUe5*$)bS#W|FMKt9p3Jul&s3&J|a4ngil3Jv*I|Y~V{qlO3Q+_>QxD&oN39Q2fcO z$@ZKBe8V~h;}t)0k;f{ga+L2m$GccNcBmn%zKW8eCMI=B7E`VN=w2cNBp_j4>g zJDa(s??mG;wW-!|iN_pZ6RRl>5koGxDJD-xafADOz-}+6GeS&mCf}tKxFsZ!X^JIR z{PL*^XuT;ld*$D`sqe%{e0xltT+x5lS^QpB(9auSs9yQnky>n?$vG*d9vcaYjp-yU z(g^}ceeWlWLh?y&new&$^+gre_>sLlcSsZm#ACxbH-q?$&jQ2UFx2rYTR6(y1X3G@ z3QqHkV|>nP`upsV!caCcnWJpw0`;*hF*S?>+;NJJq87QkxY>C@zP@6K2@`%H1U`5E}e2a93k;8Cq^N4D+xtwko;F0FM@0K}Eh;|P0ZX;@z z6q0LY1cl6bOr^co{)^nOp5jRe(_`~m56T0xlfRV(l8(#w#4gEXjO6Jn`IX1eepaW1 zEP||IVLgIokwGDOlCI%oWgEH0&m7hGFGvO(E;8|6F1q% zAuCy<<{yarQHtE&qV$+~+*2SwL1u`PzK4$!8Gvc}ATIt}YpF2GMl-Ngmn$Xb}K4)#ji% zpr_3hv0aHQr_dmGcw%14EZHCnS|onO%>eq5%@BPePchMmWwqZsB-*Z&?vs^G4%_D+ zv7dvSPE4Ac(>^8;&t)bhtYcDuUbD?3&a#(-ly=!ROB2_)$5pPgl&L{GDY~>QRr3o8-4P4|FSNN30Od%~~zbU4G zBJT5qQX0HE-MUN)!gtz3{MOB21@s!-2yb4KpT=Q>lS zwZ!X75+fPJAPV%cRI~HrkeOV;~Q?Uo$Wm9oFY^VeXNdCT;&Acu+T5qYEi@{7O;aIT;p~8CKc^aJ6uHu zSYzcg>swcGkgRN-KJlC~f0T>V8e=8aI7$sixXdZOVje?7cy>ZEBPeEw+~S#5N|Ra% ziqNnTQZ$VM`b!W{X@hxUpVGg`X{x=JNqoqRpoRu^nG>vV{S8xOuz&gzQf0gj)f?QE z*HoghdgKuRcnay{QxFs*-~M~8;4XXknLAEGy#wO0wPXrd#<$FC-X8J+$9=Z(3lI3v zEgj6Jk^@}x3AX0@tdhiV{)RE{c6!P#%M8*xuMV7ZtO({iebD*!A+_bQ9!B$_EwLn zu+N+C^cZhxq)Q|G6l{GbJNeaoD!;QP1-vm!GG)4s(HnA^4>U$DU)u@y)6oxIX z26a4T7e8^6N+*=i0r6Oxi!2tgkp+y9RKGx`hv)2ICs!%$Ru7?(XZ*rVma@^mMi8=@ zPB9DF$qt@I6c-rv;!*{-479$n)>u=dC_uW&Hg)El{qK549!XsnD=OFXgw0%K85@}) zscMDjLAgw%h)3MwmCr&^XcTHVW2I<;6i7zUn!sqieZl^tp3{faSlyyEEl{Tq%)iSS zT`hlO4GTzYPmvU6GDIKAWhw|uad$EnC6#>ok=b6UkDxPpc+Fn6bIGaA1m%pg$v+$pH@XDz^L7wsJ=ng}U0c zNy(p~11IiuCxn{gz_J9EK$%3XV|Y?7e?yBHZ{&`s#L_?>NRjPH?+tDWW*7_knm4<5|QSmXhsV_bNaI7dgxx zu6HpD9(stp=MdMp&Kl?E0 zo9lYc-lO}d71OQOC}%%c^%|>Kz=)8XMLMG?qL7C?=WUD|dx{~2Y;q`&AfPg~-qv&W zZnMv-lAb~gywNRsT%K7a%$C6cpqizV8AuTieI=;fomh*s1@I&?$s?c4j^Bo_k5zG* zqwL`l^$rW}fOu?I7|2XEu!h2bt5x%WBW&hZ>UtbYXL!wzoMJs+_#@Z_H&b*pi`dK& z?o-v76MKS0?=;&Q#bVdrxF!ac@l{)2*jMczWN-IKaRB{<084@fj`_jH@|0KJ$3=chM-WQ{9x2Bn&Kz<=d18~Bn@WCR09%hsfNW5{PPOmB0C zx1r=~+a-#<+jVa3M-dspvatW?9)}a_CPENh+-^AJm#C=Oo{Ain16*lL zwuT49Tc|eJkL*92y*!X|>1m}Ll@DB|lvAu{JwpQJYuf-x3IoVw2zR+B@72&Q`77;{ z1<9H#g_2Eb5P&z@PwYSGUVWft(qoHUit?U|T4w*Ee~>S%EdMToNIGex>lnQwx2X3y z1Q8A*Z62rD6q4huklK!9uz%eoHF}PpIKe||9e8s5~@#AzyN}AH{lCo>50qgfQ;4OE&rBk|nOzp+BuO z#2dNHUXE~~b9A5691w5mS;fp_1*;huzyUUJi<9i(7*)M$o5k>mr(ES4CCsMK_h}k) znaC9Oa-19C))W>VYy^{R&9pv|HP#|4Rirt(!>D<#=gbj%E2Uy` z8K8Y*NfG_%uMg!RFKLPZ$Zd6zNe+4BwnPVY5V7dt4yV|sN2qXEa0kR=Yx#_24IBOS zbG(k|b1v{R`+3_7V^vi>T<1O~_=**b_SGB`vRKVb=CPFvJnuM$Tu@^mi4oRR>#y9) z#V6h5^`cC#+e8FpOI~paL5c90sQf7~G_5 zrWTPaE(suMOoh2^?_)Ffw0Bs>Zy;1X@~hr43#{K-3v`r!%_Sts2!`k&u1Xo@G