1
0
Fork 0

chore: Format code with prettier, bump dependencies

pull/20/head
Ambrose Chua 2021-11-16 18:09:55 +08:00
parent e793aa21a9
commit 148c893790
15 changed files with 922 additions and 782 deletions

1
.prettierignore Normal file
View File

@ -0,0 +1 @@
views/**/*.handlebars

View File

@ -1,12 +0,0 @@
FROM serverwentdown/env:alpine-node
COPY . /usr/local/share/file-manager
RUN cd /usr/local/share/file-manager \
&& sudo npm install .
USER ambrose
ENV SHELL="zsh -l"
ENV NODE_ENV=production
CMD ["node", "/usr/local/share/file-manager/index.js"]

View File

@ -7,11 +7,11 @@
font-weight: 300; font-weight: 300;
} }
.input-group-digits input[type=number] { .input-group-digits input[type="number"] {
-moz-appearance: textfield; -moz-appearance: textfield;
} }
.input-group-digits input[type=number]::-webkit-inner-spin-button, .input-group-digits input[type="number"]::-webkit-inner-spin-button,
.input-group-digits input[type=number]::-webkit-outer-spin-button { .input-group-digits input[type="number"]::-webkit-outer-spin-button {
-webkit-appearance: none; -webkit-appearance: none;
margin: 0; margin: 0;
} }
@ -19,4 +19,3 @@
.login { .login {
width: 19.2em; width: 19.2em;
} }

View File

@ -3,8 +3,12 @@
let $inputs = $(".input-group-digits"); let $inputs = $(".input-group-digits");
$inputs.each((i, input) => { $inputs.each((i, input) => {
let cleanup = () => { let cleanup = () => {
$(input).find("input").each((i, ele) => { $(input)
let cleaned = $(ele).val().replace(/[^0-9]/, ""); .find("input")
.each((i, ele) => {
let cleaned = $(ele)
.val()
.replace(/[^0-9]/, "");
$(ele).val(cleaned); $(ele).val(cleaned);
}); });
}; };
@ -35,10 +39,7 @@ $inputs.each((i, input) => {
// Submit if last digit is filled // Submit if last digit is filled
if ($($digits[$digits.length - 1]).val()) { if ($($digits[$digits.length - 1]).val()) {
let token = $.map( let token = $.map($digits, (d) => $(d).val()).join("");
$digits,
d => $(d).val()
).join("");
let $value = $(input).parent().find("#login-token-value"); let $value = $(input).parent().find("#login-token-value");
$value.val(token); $value.val(token);
$value.closest("form").submit(); $value.closest("form").submit();

View File

@ -1,7 +1,7 @@
/* jshint esversion: 6 */ /* jshint esversion: 6 */
function htmlEscape(text) { function htmlEscape(text) {
const p = document.createElement('p'); const p = document.createElement("p");
p.innerText = text; p.innerText = text;
return p.innerHTML; return p.innerHTML;
} }
@ -9,23 +9,36 @@ function htmlEscape(text) {
let $select = $(".multi-select"); let $select = $(".multi-select");
let setSelected = (files) => { let setSelected = (files) => {
$(".multi-files-value").val(JSON.stringify(files.map(f => f.name))); $(".multi-files-value").val(JSON.stringify(files.map((f) => f.name)));
if (files.length == 0) { if (files.length == 0) {
$(".multi-files").html(`<li class="list-group-item text-muted">No files selected</li>`); $(".multi-files").html(
return `<li class="list-group-item text-muted">No files selected</li>`
);
return;
} }
$(".multi-files").html( $(".multi-files").html(
files.map(f => { files
.map((f) => {
return ` return `
<li class="list-group-item d-flex align-items-start justify-content-between"> <li class="list-group-item d-flex align-items-start justify-content-between">
<span class="name">${htmlEscape(f.name)}</span> <span class="name">${htmlEscape(f.name)}</span>
${f.type == "directory" ? `` : `<span class="badge rounded-pill bg-secondary badge-alignment">${filesize(f.size)}</span>`} ${
f.type == "directory"
? ``
: `<span class="badge rounded-pill bg-secondary badge-alignment">${filesize(
f.size
)}</span>`
}
</li> </li>
`; `;
}).join("") })
.join("")
); );
const hasDirectory = files.reduce((a, f) => a || f.type == "directory", false); const hasDirectory = files.reduce(
const totalSize = files.map(f => f.size).reduce((a, b) => a + b); (a, f) => a || f.type == "directory",
false
);
const totalSize = files.map((f) => f.size).reduce((a, b) => a + b);
if (hasDirectory) { if (hasDirectory) {
$(".multi-files-total").val(""); $(".multi-files-total").val("");
} else { } else {
@ -40,12 +53,12 @@ const updateSelected = () => {
files.push({ files.push({
name: $(ele).data("select"), name: $(ele).data("select"),
type: $(ele).data("select-type"), type: $(ele).data("select-type"),
size: $(ele).data("select-size") size: $(ele).data("select-size"),
}); });
}); });
setSelected(files); setSelected(files);
} };
$select.on("change", updateSelected); $select.on("change", updateSelected);
updateSelected(); updateSelected();

View File

@ -4,8 +4,14 @@ const $shell = $("#shell");
const $close = $("#shell-close"); const $close = $("#shell-close");
if ($shell.length > 0) { if ($shell.length > 0) {
const ws = new WebSocket(
const ws = new WebSocket("ws" + (window.location.protocol === "https:" ? "s" : "") + "://" + window.location.host + "/websocket?path=" + encodeURIComponent($shell.data("path"))); "ws" +
(window.location.protocol === "https:" ? "s" : "") +
"://" +
window.location.host +
"/websocket?path=" +
encodeURIComponent($shell.data("path"))
);
const term = new Terminal(); const term = new Terminal();
const attachAddon = new AttachAddon.AttachAddon(ws, { bidirectional: true }); const attachAddon = new AttachAddon.AttachAddon(ws, { bidirectional: true });
@ -15,7 +21,6 @@ if ($shell.length > 0) {
term.open($shell[0]); term.open($shell[0]);
ws.addEventListener("open", () => { ws.addEventListener("open", () => {
// resize // resize
term.onResize(({ cols, rows }) => { term.onResize(({ cols, rows }) => {
console.debug(cols, rows); console.debug(cols, rows);
@ -32,7 +37,10 @@ if ($shell.length > 0) {
$close.on("click", (e) => { $close.on("click", (e) => {
e.preventDefault(); e.preventDefault();
if (ws.readyState !== 1) { if (ws.readyState !== 1) {
window.location.pathname = window.location.pathname.replace("@shell", ""); window.location.pathname = window.location.pathname.replace(
"@shell",
""
);
} else { } else {
ws.close(); ws.close();
} }
@ -40,7 +48,10 @@ if ($shell.length > 0) {
ws.addEventListener("close", () => { ws.addEventListener("close", () => {
term.write("\r\n\r\nclosing shell in 2 seconds..."); term.write("\r\n\r\nclosing shell in 2 seconds...");
closeTimeout = setTimeout(() => { closeTimeout = setTimeout(() => {
window.location.pathname = window.location.pathname.replace("@shell", ""); window.location.pathname = window.location.pathname.replace(
"@shell",
""
);
}, 2000); }, 2000);
}); });
term.onData(() => { term.onData(() => {
@ -50,7 +61,5 @@ if ($shell.length > 0) {
closeTimeout = null; closeTimeout = null;
} }
}); });
}); });
} }

View File

@ -1,6 +1,6 @@
/* jshint esversion: 6 */ /* jshint esversion: 6 */
document.querySelectorAll("[title]").forEach(element => { document.querySelectorAll("[title]").forEach((element) => {
new bootstrap.Tooltip(element, { new bootstrap.Tooltip(element, {
delay: 500, delay: 500,
}); });

244
index.js
View File

@ -5,7 +5,7 @@
"use strict"; "use strict";
const express = require("express"); const express = require("express");
const hbs = require("express-handlebars"); const { engine: hbs } = require("express-handlebars");
const bodyparser = require("body-parser"); const bodyparser = require("body-parser");
const session = require("express-session"); const session = require("express-session");
const busboy = require("connect-busboy"); const busboy = require("connect-busboy");
@ -25,11 +25,15 @@ const filesize = require("filesize");
const octicons = require("octicons"); const octicons = require("octicons");
const handlebars = require("handlebars"); const handlebars = require("handlebars");
const port = +process.env.PORT || 8080;
let app = express(); let app = express();
let http = app.listen(process.env.PORT || 8080); let http = app.listen(port);
app.set("views", path.join(__dirname, "views")); app.set("views", path.join(__dirname, "views"));
app.engine("handlebars", hbs({ app.engine(
"handlebars",
hbs({
partialsDir: path.join(__dirname, "views", "partials"), partialsDir: path.join(__dirname, "views", "partials"),
layoutsDir: path.join(__dirname, "views", "layouts"), layoutsDir: path.join(__dirname, "views", "layouts"),
defaultLayout: "main", defaultLayout: "main",
@ -58,41 +62,67 @@ app.engine("handlebars", hbs({
out += options.fn({ out += options.fn({
name: folder + "/", name: folder + "/",
path: "/" + path.slice(1, index + 1).join("/"), path: "/" + path.slice(1, index + 1).join("/"),
current: index === path.length - 1 current: index === path.length - 1,
}); });
}); });
return out; return out;
}, },
} },
})); })
);
app.set("view engine", "handlebars"); app.set("view engine", "handlebars");
app.use("/@assets", express.static(path.join(__dirname, "assets"))); app.use("/@assets", express.static(path.join(__dirname, "assets")));
app.use("/@assets/bootstrap", express.static(path.join(__dirname, "node_modules/bootstrap/dist"))); app.use(
app.use("/@assets/octicons", express.static(path.join(__dirname, "node_modules/octicons/build"))); "/@assets/bootstrap",
app.use("/@assets/jquery", express.static(path.join(__dirname, "node_modules/jquery/dist"))); express.static(path.join(__dirname, "node_modules/bootstrap/dist"))
app.use("/@assets/filesize", express.static(path.join(__dirname, "node_modules/filesize/lib"))); );
app.use("/@assets/xterm", express.static(path.join(__dirname, "node_modules/xterm"))); app.use(
app.use("/@assets/xterm-addon-attach", express.static(path.join(__dirname, "node_modules/xterm-addon-attach"))); "/@assets/octicons",
app.use("/@assets/xterm-addon-fit", express.static(path.join(__dirname, "node_modules/xterm-addon-fit"))); express.static(path.join(__dirname, "node_modules/octicons/build"))
);
app.use(
"/@assets/jquery",
express.static(path.join(__dirname, "node_modules/jquery/dist"))
);
app.use(
"/@assets/filesize",
express.static(path.join(__dirname, "node_modules/filesize/lib"))
);
app.use(
"/@assets/xterm",
express.static(path.join(__dirname, "node_modules/xterm"))
);
app.use(
"/@assets/xterm-addon-attach",
express.static(path.join(__dirname, "node_modules/xterm-addon-attach"))
);
app.use(
"/@assets/xterm-addon-fit",
express.static(path.join(__dirname, "node_modules/xterm-addon-fit"))
);
app.use(session({ app.use(
secret: process.env.SESSION_KEY || "meowmeow" session({
})); secret: process.env.SESSION_KEY || "meowmeow",
})
);
app.use(flash()); app.use(flash());
app.use(busboy()); app.use(busboy());
app.use(bodyparser.urlencoded()); app.use(bodyparser.urlencoded());
// AUTH // AUTH
const KEY = process.env.KEY ? base32.decode(process.env.KEY.replace(/ /g, "")) : null; const KEY = process.env.KEY
? base32.decode(process.env.KEY.replace(/ /g, ""))
: null;
app.get("/@logout", (req, res) => { app.get("/@logout", (req, res) => {
if (KEY) { if (KEY) {
req.session.login = false; req.session.login = false;
req.flash("success", "Signed out."); req.flash("success", "Signed out.");
res.redirect("/@login"); res.redirect("/@login");
return return;
} }
req.flash("error", "You were never logged in..."); req.flash("error", "You were never logged in...");
res.redirect("back"); res.redirect("back");
@ -158,10 +188,12 @@ app.all("/*", (req, res, next) => {
}); });
}); });
fileExists.then((stats) => { fileExists
.then((stats) => {
res.stats = stats; res.stats = stats;
next(); next();
}).catch((err) => { })
.catch((err) => {
res.stats = { error: err }; res.stats = { error: err };
next(); next();
}); });
@ -203,11 +235,13 @@ app.post("/*@upload", (req, res) => {
}); });
}); });
fileExists.then((stats) => { fileExists
.then((stats) => {
console.warn("file exists, cannot overwrite"); console.warn("file exists, cannot overwrite");
req.flash("error", "File exists, cannot overwrite. "); req.flash("error", "File exists, cannot overwrite. ");
res.redirect("back"); res.redirect("back");
}).catch((err) => { })
.catch((err) => {
const saveName = relative(res.filename, saveas); const saveName = relative(res.filename, saveas);
console.log("saving file to " + saveName); console.log("saving file to " + saveName);
let save = fs.createWriteStream(saveName); let save = fs.createWriteStream(saveName);
@ -217,8 +251,7 @@ app.post("/*@upload", (req, res) => {
} }
if (buff.length === 0) { if (buff.length === 0) {
req.flash("success", "File saved. Warning: empty file."); req.flash("success", "File saved. Warning: empty file.");
} } else {
else {
buff = null; buff = null;
req.flash("success", "File saved. "); req.flash("success", "File saved. ");
} }
@ -254,10 +287,12 @@ app.post("/*@mkdir", (req, res) => {
}); });
}); });
fileExists.then((stats) => { fileExists
.then((stats) => {
req.flash("error", "Folder exists, cannot overwrite. "); req.flash("error", "Folder exists, cannot overwrite. ");
res.redirect("back"); res.redirect("back");
}).catch((err) => { })
.catch((err) => {
fs.mkdir(relative(res.filename, folder), (err) => { fs.mkdir(relative(res.filename, folder), (err) => {
if (err) { if (err) {
console.warn(err); console.warn(err);
@ -281,7 +316,7 @@ app.post("/*@delete", (req, res) => {
return; // res.status(400).end(); return; // res.status(400).end();
} }
let promises = files.map(f => { let promises = files.map((f) => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
fs.stat(relative(res.filename, f), (err, stats) => { fs.stat(relative(res.filename, f), (err, stats) => {
if (err) { if (err) {
@ -290,21 +325,26 @@ app.post("/*@delete", (req, res) => {
resolve({ resolve({
name: f, name: f,
isdirectory: stats.isDirectory(), isdirectory: stats.isDirectory(),
isfile: stats.isFile() isfile: stats.isFile(),
}); });
}); });
}); });
}); });
Promise.all(promises).then((files) => { Promise.all(promises)
let promises = files.map(f => { .then((files) => {
let promises = files.map((f) => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let op = null; let op = null;
if (f.isdirectory) { if (f.isdirectory) {
op = (dir, cb) => rimraf(dir, { op = (dir, cb) =>
glob: false rimraf(
}, cb); dir,
} {
else if (f.isfile) { glob: false,
},
cb
);
} else if (f.isfile) {
op = fs.unlink; op = fs.unlink;
} }
if (op) { if (op) {
@ -317,15 +357,18 @@ app.post("/*@delete", (req, res) => {
} }
}); });
}); });
Promise.all(promises).then(() => { Promise.all(promises)
.then(() => {
req.flash("success", "Files deleted. "); req.flash("success", "Files deleted. ");
res.redirect("back"); res.redirect("back");
}).catch((err) => { })
.catch((err) => {
console.warn(err); console.warn(err);
req.flash("error", "Unable to delete some files: " + err); req.flash("error", "Unable to delete some files: " + err);
res.redirect("back"); res.redirect("back");
}); });
}).catch((err) => { })
.catch((err) => {
console.warn(err); console.warn(err);
req.flash("error", err.toString()); req.flash("error", err.toString());
res.redirect("back"); res.redirect("back");
@ -345,7 +388,7 @@ app.get("/*@download", (req, res) => {
return; // res.status(400).end(); return; // res.status(400).end();
} }
let promises = files.map(f => { let promises = files.map((f) => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
fs.stat(relative(res.filename, f), (err, stats) => { fs.stat(relative(res.filename, f), (err, stats) => {
if (err) { if (err) {
@ -354,24 +397,29 @@ app.get("/*@download", (req, res) => {
resolve({ resolve({
name: f, name: f,
isdirectory: stats.isDirectory(), isdirectory: stats.isDirectory(),
isfile: stats.isFile() isfile: stats.isFile(),
}); });
}); });
}); });
}); });
Promise.all(promises).then((files) => { Promise.all(promises)
.then((files) => {
let zip = archiver("zip", {}); let zip = archiver("zip", {});
zip.on("error", function (err) { zip.on("error", function (err) {
console.warn(err); console.warn(err);
res.status(500).send({ res.status(500).send({
error: err.message error: err.message,
}); });
}); });
files.filter(f => f.isfile).forEach((f) => { files
.filter((f) => f.isfile)
.forEach((f) => {
zip.file(relative(res.filename, f.name), { name: f.name }); zip.file(relative(res.filename, f.name), { name: f.name });
}); });
files.filter(f => f.isdirectory).forEach((f) => { files
.filter((f) => f.isdirectory)
.forEach((f) => {
zip.directory(relative(res.filename, f.name), f.name); zip.directory(relative(res.filename, f.name), f.name);
}); });
@ -379,7 +427,8 @@ app.get("/*@download", (req, res) => {
zip.pipe(res); zip.pipe(res);
zip.finalize(); zip.finalize();
}).catch((err) => { })
.catch((err) => {
console.warn(err); console.warn(err);
req.flash("error", err.toString()); req.flash("error", err.toString());
res.redirect("back"); res.redirect("back");
@ -404,21 +453,28 @@ if (shellable || cmdable) {
} }
console.log("running command " + cmd); console.log("running command " + cmd);
child_process.exec(cmd, { child_process.exec(
cmd,
{
cwd: relative(res.filename), cwd: relative(res.filename),
timeout: 60 * 1000, timeout: 60 * 1000,
}, (err, stdout, stderr) => { },
(err, stdout, stderr) => {
if (err) { if (err) {
console.log("command run failed: " + JSON.stringify(err)); console.log("command run failed: " + JSON.stringify(err));
req.flash("error", "Command failed due to non-zero exit code"); req.flash("error", "Command failed due to non-zero exit code");
} }
res.render("cmd", flashify(req, { res.render(
"cmd",
flashify(req, {
path: res.filename, path: res.filename,
cmd: cmd, cmd: cmd,
stdout: stdout, stdout: stdout,
stderr: stderr, stderr: stderr,
})); })
}); );
}
);
}); });
const pty = require("node-pty"); const pty = require("node-pty");
@ -427,9 +483,12 @@ if (shellable || cmdable) {
app.get("/*@shell", (req, res) => { app.get("/*@shell", (req, res) => {
res.filename = req.params[0]; res.filename = req.params[0];
res.render("shell", flashify(req, { res.render(
"shell",
flashify(req, {
path: res.filename, path: res.filename,
})); })
);
}); });
const ws = new WebSocket.Server({ server: http }); const ws = new WebSocket.Server({ server: http });
@ -442,13 +501,15 @@ if (shellable || cmdable) {
rows: 30, rows: 30,
cwd: cwd, cwd: cwd,
}); });
console.log("pid " + term.pid + " shell " + process.env.SHELL + " started in " + cwd); console.log(
"pid " + term.pid + " shell " + process.env.SHELL + " started in " + cwd
);
term.on("data", (data) => { term.on("data", (data) => {
socket.send(data, { binary: true }); socket.send(data, { binary: true });
}); });
term.on("exit", (code) => { term.on("exit", (code) => {
console.log("pid " + term.pid + " ended") console.log("pid " + term.pid + " ended");
socket.close(); socket.close();
}); });
socket.on("message", (data) => { socket.on("message", (data) => {
@ -481,16 +542,16 @@ function isimage(f) {
app.get("/*", (req, res) => { app.get("/*", (req, res) => {
if (res.stats.error) { if (res.stats.error) {
res.render("list", flashify(req, { res.render(
"list",
flashify(req, {
shellable: shellable, shellable: shellable,
cmdable: cmdable, cmdable: cmdable,
path: res.filename, path: res.filename,
errors: [ errors: [res.stats.error],
res.stats.error })
] );
})); } else if (res.stats.isDirectory()) {
}
else if (res.stats.isDirectory()) {
if (!req.url.endsWith("/")) { if (!req.url.endsWith("/")) {
return res.redirect(req.url + "/"); return res.redirect(req.url + "/");
} }
@ -504,62 +565,75 @@ app.get("/*", (req, res) => {
}); });
}); });
readDir.then((filenames) => { readDir
const promises = filenames.map(f => new Promise((resolve, reject) => { .then((filenames) => {
const promises = filenames.map(
(f) =>
new Promise((resolve, reject) => {
fs.stat(relative(res.filename, f), (err, stats) => { fs.stat(relative(res.filename, f), (err, stats) => {
if (err) { if (err) {
console.warn(err); console.warn(err);
return resolve({ return resolve({
name: f, name: f,
error: err error: err,
}); });
} }
resolve({ resolve({
name: f, name: f,
isdirectory: stats.isDirectory(), isdirectory: stats.isDirectory(),
issmallimage: isimage(f) && stats.size < SMALL_IMAGE_MAX_SIZE, issmallimage: isimage(f) && stats.size < SMALL_IMAGE_MAX_SIZE,
size: stats.size size: stats.size,
}); });
}); });
})); })
);
Promise.all(promises).then((files) => { Promise.all(promises)
res.render("list", flashify(req, { .then((files) => {
res.render(
"list",
flashify(req, {
shellable: shellable, shellable: shellable,
cmdable: cmdable, cmdable: cmdable,
path: res.filename, path: res.filename,
files: files, files: files,
})); })
}).catch((err) => { );
})
.catch((err) => {
console.error(err); console.error(err);
res.render("list", flashify(req, { res.render(
"list",
flashify(req, {
shellable: shellable, shellable: shellable,
cmdable: cmdable, cmdable: cmdable,
path: res.filename, path: res.filename,
errors: [ errors: [err],
err })
] );
}));
}); });
}).catch((err) => { })
.catch((err) => {
console.warn(err); console.warn(err);
res.render("list", flashify(req, { res.render(
"list",
flashify(req, {
shellable: shellable, shellable: shellable,
cmdable: cmdable, cmdable: cmdable,
path: res.filename, path: res.filename,
errors: [ errors: [err],
err })
] );
}));
}); });
} } else if (res.stats.isFile()) {
else if (res.stats.isFile()) {
res.sendFile(relative(res.filename), { res.sendFile(relative(res.filename), {
headers: { headers: {
"Content-Security-Policy": "default-src 'self'; script-src 'none'; sandbox" "Content-Security-Policy":
"default-src 'self'; script-src 'none'; sandbox",
}, },
dotfiles: "allow" dotfiles: "allow",
}); });
} }
}); });
console.log(`Listening on port ${port}`);

330
package-lock.json generated
View File

@ -1,12 +1,12 @@
{ {
"name": "file-manager", "name": "file-manager",
"version": "0.0.7a", "version": "0.1.0",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "file-manager", "name": "file-manager",
"version": "0.0.7a", "version": "0.1.0",
"dependencies": { "dependencies": {
"archiver": "^5.3.0", "archiver": "^5.3.0",
"body-parser": "^1.19.0", "body-parser": "^1.19.0",
@ -14,9 +14,9 @@
"connect-busboy": "^0.0.2", "connect-busboy": "^0.0.2",
"connect-flash": "^0.1.1", "connect-flash": "^0.1.1",
"express": "^4.17.1", "express": "^4.17.1",
"express-handlebars": "^5.3.2", "express-handlebars": "^6.0.1",
"express-session": "^1.17.1", "express-session": "^1.17.2",
"filesize": "^6.3.0", "filesize": "^8.0.6",
"jquery": "^3.6.0", "jquery": "^3.6.0",
"node-pty": "^0.10.1", "node-pty": "^0.10.1",
"notp": "^2.0.3", "notp": "^2.0.3",
@ -30,12 +30,15 @@
}, },
"bin": { "bin": {
"file-manager": "index.js" "file-manager": "index.js"
},
"devDependencies": {
"prettier": "^2.4.1"
} }
}, },
"node_modules/@popperjs/core": { "node_modules/@popperjs/core": {
"version": "2.9.2", "version": "2.10.2",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.2.tgz", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.10.2.tgz",
"integrity": "sha512-VZMYa7+fXHdwIq1TDhSXoVmSPEGM/aa+6Aiq3nVVJ9bXr24zScr+NlKFKC3iPljA7ho/GAZr+d2jOf5GIRC30Q==", "integrity": "sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ==",
"peer": true, "peer": true,
"funding": { "funding": {
"type": "opencollective", "type": "opencollective",
@ -119,9 +122,9 @@
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
}, },
"node_modules/async": { "node_modules/async": {
"version": "3.2.0", "version": "3.2.2",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz",
"integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g=="
}, },
"node_modules/balanced-match": { "node_modules/balanced-match": {
"version": "1.0.2", "version": "1.0.2",
@ -178,15 +181,15 @@
} }
}, },
"node_modules/bootstrap": { "node_modules/bootstrap": {
"version": "5.0.0", "version": "5.1.3",
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.0.0.tgz", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz",
"integrity": "sha512-tmhPET9B9qCl8dCofvHeiIhi49iBt0EehmIsziZib65k1erBW1rHhj2s/2JsuQh5Pq+xz2E9bEbzp9B7xHG+VA==", "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==",
"funding": { "funding": {
"type": "opencollective", "type": "opencollective",
"url": "https://opencollective.com/bootstrap" "url": "https://opencollective.com/bootstrap"
}, },
"peerDependencies": { "peerDependencies": {
"@popperjs/core": "^2.9.2" "@popperjs/core": "^2.10.2"
} }
}, },
"node_modules/brace-expansion": { "node_modules/brace-expansion": {
@ -249,12 +252,12 @@
} }
}, },
"node_modules/compress-commons": { "node_modules/compress-commons": {
"version": "4.1.0", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.0.tgz", "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz",
"integrity": "sha512-ofaaLqfraD1YRTkrRKPCrGJ1pFeDG/MVCkVVV2FNGeWquSlqw5wOrwOfPQ1xF2u+blpeWASie5EubHz+vsNIgA==", "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==",
"dependencies": { "dependencies": {
"buffer-crc32": "^0.2.13", "buffer-crc32": "^0.2.13",
"crc32-stream": "^4.0.1", "crc32-stream": "^4.0.2",
"normalize-path": "^3.0.0", "normalize-path": "^3.0.0",
"readable-stream": "^3.6.0" "readable-stream": "^3.6.0"
}, },
@ -319,9 +322,9 @@
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
}, },
"node_modules/core-util-is": { "node_modules/core-util-is": {
"version": "1.0.2", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
}, },
"node_modules/crc-32": { "node_modules/crc-32": {
"version": "1.2.0", "version": "1.2.0",
@ -465,36 +468,44 @@
} }
}, },
"node_modules/express-handlebars": { "node_modules/express-handlebars": {
"version": "5.3.2", "version": "6.0.1",
"resolved": "https://registry.npmjs.org/express-handlebars/-/express-handlebars-5.3.2.tgz", "resolved": "https://registry.npmjs.org/express-handlebars/-/express-handlebars-6.0.1.tgz",
"integrity": "sha512-iGR7HXP+x+SfJQo9m00ocqcr7hU8ZzcssTLE/4wBX+jsqcblO6sFJEbEAEFjiNze3XMz9Y26Zs1WN5Bb4zxivQ==", "integrity": "sha512-K3Lemki5jkD3sZwDhgBEBk+oAl1xg4nsMJAfpq1AUl5K187/mU1/xKVWt+4RZAHAxlyQFk4YBfX5+00AzLNfWg==",
"dependencies": { "dependencies": {
"glob": "^7.1.7", "glob": "^7.2.0",
"graceful-fs": "^4.2.6", "graceful-fs": "^4.2.8",
"handlebars": "^4.7.7" "handlebars": "^4.7.7"
}, },
"engines": { "engines": {
"node": ">=v10.24.1" "node": ">=v12.22.7"
} }
}, },
"node_modules/express-session": { "node_modules/express-session": {
"version": "1.17.1", "version": "1.17.2",
"resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.1.tgz", "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.2.tgz",
"integrity": "sha512-UbHwgqjxQZJiWRTMyhvWGvjBQduGCSBDhhZXYenziMFjxst5rMV+aJZ6hKPHZnPyHGsrqRICxtX8jtEbm/z36Q==", "integrity": "sha512-mPcYcLA0lvh7D4Oqr5aNJFMtBMKPLl++OKKxkHzZ0U0oDq1rpKBnkR5f5vCHR26VeArlTOEF9td4x5IjICksRQ==",
"dependencies": { "dependencies": {
"cookie": "0.4.0", "cookie": "0.4.1",
"cookie-signature": "1.0.6", "cookie-signature": "1.0.6",
"debug": "2.6.9", "debug": "2.6.9",
"depd": "~2.0.0", "depd": "~2.0.0",
"on-headers": "~1.0.2", "on-headers": "~1.0.2",
"parseurl": "~1.3.3", "parseurl": "~1.3.3",
"safe-buffer": "5.2.0", "safe-buffer": "5.2.1",
"uid-safe": "~2.1.5" "uid-safe": "~2.1.5"
}, },
"engines": { "engines": {
"node": ">= 0.8.0" "node": ">= 0.8.0"
} }
}, },
"node_modules/express-session/node_modules/cookie": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
"integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/express-session/node_modules/depd": { "node_modules/express-session/node_modules/depd": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
@ -504,14 +515,28 @@
} }
}, },
"node_modules/express-session/node_modules/safe-buffer": { "node_modules/express-session/node_modules/safe-buffer": {
"version": "5.2.0", "version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
]
}, },
"node_modules/filesize": { "node_modules/filesize": {
"version": "6.3.0", "version": "8.0.6",
"resolved": "https://registry.npmjs.org/filesize/-/filesize-6.3.0.tgz", "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.6.tgz",
"integrity": "sha512-ytx0ruGpDHKWVoiui6+BY/QMNngtDQ/pJaFwfBpQif0J63+E8DLdFyqS3NkKQn7vIruUEpoGD9JUJSg7Kp+I0g==", "integrity": "sha512-sHvRqTiwdmcuzqet7iVwsbwF6UrV3wIgDf2SHNdY1Hgl8PC45HZg/0xtdw6U2izIV4lccnrY9ftl6wZFNdjYMg==",
"engines": { "engines": {
"node": ">= 0.4.0" "node": ">= 0.4.0"
} }
@ -534,9 +559,9 @@
} }
}, },
"node_modules/forwarded": { "node_modules/forwarded": {
"version": "0.1.2", "version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
"integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
"engines": { "engines": {
"node": ">= 0.6" "node": ">= 0.6"
} }
@ -560,9 +585,9 @@
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
}, },
"node_modules/glob": { "node_modules/glob": {
"version": "7.1.7", "version": "7.2.0",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
"integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
"dependencies": { "dependencies": {
"fs.realpath": "^1.0.0", "fs.realpath": "^1.0.0",
"inflight": "^1.0.4", "inflight": "^1.0.4",
@ -579,9 +604,9 @@
} }
}, },
"node_modules/graceful-fs": { "node_modules/graceful-fs": {
"version": "4.2.6", "version": "4.2.8",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
"integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg=="
}, },
"node_modules/handlebars": { "node_modules/handlebars": {
"version": "4.7.7", "version": "4.7.7",
@ -686,9 +711,9 @@
"integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw=="
}, },
"node_modules/lazystream": { "node_modules/lazystream": {
"version": "1.0.0", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz",
"integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==",
"dependencies": { "dependencies": {
"readable-stream": "^2.0.5" "readable-stream": "^2.0.5"
}, },
@ -776,19 +801,19 @@
} }
}, },
"node_modules/mime-db": { "node_modules/mime-db": {
"version": "1.47.0", "version": "1.51.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
"integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==",
"engines": { "engines": {
"node": ">= 0.6" "node": ">= 0.6"
} }
}, },
"node_modules/mime-types": { "node_modules/mime-types": {
"version": "2.1.30", "version": "2.1.34",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
"integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
"dependencies": { "dependencies": {
"mime-db": "1.47.0" "mime-db": "1.51.0"
}, },
"engines": { "engines": {
"node": ">= 0.6" "node": ">= 0.6"
@ -816,9 +841,9 @@
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
}, },
"node_modules/nan": { "node_modules/nan": {
"version": "2.14.2", "version": "2.15.0",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz",
"integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ=="
}, },
"node_modules/negotiator": { "node_modules/negotiator": {
"version": "0.6.2", "version": "0.6.2",
@ -923,6 +948,18 @@
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
}, },
"node_modules/prettier": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz",
"integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==",
"dev": true,
"bin": {
"prettier": "bin-prettier.js"
},
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/printj": { "node_modules/printj": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz",
@ -940,11 +977,11 @@
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
}, },
"node_modules/proxy-addr": { "node_modules/proxy-addr": {
"version": "2.0.6", "version": "2.0.7",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
"integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
"dependencies": { "dependencies": {
"forwarded": "~0.1.2", "forwarded": "0.2.0",
"ipaddr.js": "1.9.1" "ipaddr.js": "1.9.1"
}, },
"engines": { "engines": {
@ -1176,9 +1213,9 @@
} }
}, },
"node_modules/uglify-js": { "node_modules/uglify-js": {
"version": "3.13.5", "version": "3.14.3",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.5.tgz", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.3.tgz",
"integrity": "sha512-xtB8yEqIkn7zmOyS2zUNBsYCBRhDkvlNxMMY2smuJ/qA8NCHeQvKCF3i9Z4k8FJH4+PJvZRtMrPynfZ75+CSZw==", "integrity": "sha512-mic3aOdiq01DuSVx0TseaEzMIVqebMZ0Z3vaeDhFEh9bsc24hV1TFvN74reA2vs08D0ZWfNjAcJ3UbVLaBss+g==",
"optional": true, "optional": true,
"bin": { "bin": {
"uglifyjs": "bin/uglifyjs" "uglifyjs": "bin/uglifyjs"
@ -1238,9 +1275,9 @@
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
}, },
"node_modules/ws": { "node_modules/ws": {
"version": "7.4.6", "version": "7.5.5",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz",
"integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==",
"engines": { "engines": {
"node": ">=8.3.0" "node": ">=8.3.0"
}, },
@ -1258,9 +1295,9 @@
} }
}, },
"node_modules/xterm": { "node_modules/xterm": {
"version": "4.11.0", "version": "4.15.0",
"resolved": "https://registry.npmjs.org/xterm/-/xterm-4.11.0.tgz", "resolved": "https://registry.npmjs.org/xterm/-/xterm-4.15.0.tgz",
"integrity": "sha512-NeJH909WTO2vth/ZlC0gkP3AGzupbvVHVlmtrpBw56/sGFXaF9bNdKgqKa3tf8qbGvXMzL2JhCcHVklqFztIRw==" "integrity": "sha512-Ik1GoSq1yqKZQ2LF37RPS01kX9t4TP8gpamUYblD09yvWX5mEYuMK4CcqH6+plgiNEZduhTz/UrcaWs97gOlOw=="
}, },
"node_modules/xterm-addon-attach": { "node_modules/xterm-addon-attach": {
"version": "0.6.0", "version": "0.6.0",
@ -1294,9 +1331,9 @@
}, },
"dependencies": { "dependencies": {
"@popperjs/core": { "@popperjs/core": {
"version": "2.9.2", "version": "2.10.2",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.2.tgz", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.10.2.tgz",
"integrity": "sha512-VZMYa7+fXHdwIq1TDhSXoVmSPEGM/aa+6Aiq3nVVJ9bXr24zScr+NlKFKC3iPljA7ho/GAZr+d2jOf5GIRC30Q==", "integrity": "sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ==",
"peer": true "peer": true
}, },
"accepts": { "accepts": {
@ -1369,9 +1406,9 @@
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
}, },
"async": { "async": {
"version": "3.2.0", "version": "3.2.2",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz",
"integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g=="
}, },
"balanced-match": { "balanced-match": {
"version": "1.0.2", "version": "1.0.2",
@ -1411,9 +1448,9 @@
} }
}, },
"bootstrap": { "bootstrap": {
"version": "5.0.0", "version": "5.1.3",
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.0.0.tgz", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz",
"integrity": "sha512-tmhPET9B9qCl8dCofvHeiIhi49iBt0EehmIsziZib65k1erBW1rHhj2s/2JsuQh5Pq+xz2E9bEbzp9B7xHG+VA==", "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==",
"requires": {} "requires": {}
}, },
"brace-expansion": { "brace-expansion": {
@ -1453,12 +1490,12 @@
"integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
}, },
"compress-commons": { "compress-commons": {
"version": "4.1.0", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.0.tgz", "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz",
"integrity": "sha512-ofaaLqfraD1YRTkrRKPCrGJ1pFeDG/MVCkVVV2FNGeWquSlqw5wOrwOfPQ1xF2u+blpeWASie5EubHz+vsNIgA==", "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==",
"requires": { "requires": {
"buffer-crc32": "^0.2.13", "buffer-crc32": "^0.2.13",
"crc32-stream": "^4.0.1", "crc32-stream": "^4.0.2",
"normalize-path": "^3.0.0", "normalize-path": "^3.0.0",
"readable-stream": "^3.6.0" "readable-stream": "^3.6.0"
} }
@ -1505,9 +1542,9 @@
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
}, },
"core-util-is": { "core-util-is": {
"version": "1.0.2", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
}, },
"crc-32": { "crc-32": {
"version": "1.2.0", "version": "1.2.0",
@ -1624,46 +1661,51 @@
} }
}, },
"express-handlebars": { "express-handlebars": {
"version": "5.3.2", "version": "6.0.1",
"resolved": "https://registry.npmjs.org/express-handlebars/-/express-handlebars-5.3.2.tgz", "resolved": "https://registry.npmjs.org/express-handlebars/-/express-handlebars-6.0.1.tgz",
"integrity": "sha512-iGR7HXP+x+SfJQo9m00ocqcr7hU8ZzcssTLE/4wBX+jsqcblO6sFJEbEAEFjiNze3XMz9Y26Zs1WN5Bb4zxivQ==", "integrity": "sha512-K3Lemki5jkD3sZwDhgBEBk+oAl1xg4nsMJAfpq1AUl5K187/mU1/xKVWt+4RZAHAxlyQFk4YBfX5+00AzLNfWg==",
"requires": { "requires": {
"glob": "^7.1.7", "glob": "^7.2.0",
"graceful-fs": "^4.2.6", "graceful-fs": "^4.2.8",
"handlebars": "^4.7.7" "handlebars": "^4.7.7"
} }
}, },
"express-session": { "express-session": {
"version": "1.17.1", "version": "1.17.2",
"resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.1.tgz", "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.2.tgz",
"integrity": "sha512-UbHwgqjxQZJiWRTMyhvWGvjBQduGCSBDhhZXYenziMFjxst5rMV+aJZ6hKPHZnPyHGsrqRICxtX8jtEbm/z36Q==", "integrity": "sha512-mPcYcLA0lvh7D4Oqr5aNJFMtBMKPLl++OKKxkHzZ0U0oDq1rpKBnkR5f5vCHR26VeArlTOEF9td4x5IjICksRQ==",
"requires": { "requires": {
"cookie": "0.4.0", "cookie": "0.4.1",
"cookie-signature": "1.0.6", "cookie-signature": "1.0.6",
"debug": "2.6.9", "debug": "2.6.9",
"depd": "~2.0.0", "depd": "~2.0.0",
"on-headers": "~1.0.2", "on-headers": "~1.0.2",
"parseurl": "~1.3.3", "parseurl": "~1.3.3",
"safe-buffer": "5.2.0", "safe-buffer": "5.2.1",
"uid-safe": "~2.1.5" "uid-safe": "~2.1.5"
}, },
"dependencies": { "dependencies": {
"cookie": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
"integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA=="
},
"depd": { "depd": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
}, },
"safe-buffer": { "safe-buffer": {
"version": "5.2.0", "version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
} }
} }
}, },
"filesize": { "filesize": {
"version": "6.3.0", "version": "8.0.6",
"resolved": "https://registry.npmjs.org/filesize/-/filesize-6.3.0.tgz", "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.6.tgz",
"integrity": "sha512-ytx0ruGpDHKWVoiui6+BY/QMNngtDQ/pJaFwfBpQif0J63+E8DLdFyqS3NkKQn7vIruUEpoGD9JUJSg7Kp+I0g==" "integrity": "sha512-sHvRqTiwdmcuzqet7iVwsbwF6UrV3wIgDf2SHNdY1Hgl8PC45HZg/0xtdw6U2izIV4lccnrY9ftl6wZFNdjYMg=="
}, },
"finalhandler": { "finalhandler": {
"version": "1.1.2", "version": "1.1.2",
@ -1680,9 +1722,9 @@
} }
}, },
"forwarded": { "forwarded": {
"version": "0.1.2", "version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
"integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
}, },
"fresh": { "fresh": {
"version": "0.5.2", "version": "0.5.2",
@ -1700,9 +1742,9 @@
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
}, },
"glob": { "glob": {
"version": "7.1.7", "version": "7.2.0",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
"integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
"requires": { "requires": {
"fs.realpath": "^1.0.0", "fs.realpath": "^1.0.0",
"inflight": "^1.0.4", "inflight": "^1.0.4",
@ -1713,9 +1755,9 @@
} }
}, },
"graceful-fs": { "graceful-fs": {
"version": "4.2.6", "version": "4.2.8",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
"integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg=="
}, },
"handlebars": { "handlebars": {
"version": "4.7.7", "version": "4.7.7",
@ -1791,9 +1833,9 @@
"integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw=="
}, },
"lazystream": { "lazystream": {
"version": "1.0.0", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz",
"integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==",
"requires": { "requires": {
"readable-stream": "^2.0.5" "readable-stream": "^2.0.5"
}, },
@ -1868,16 +1910,16 @@
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
}, },
"mime-db": { "mime-db": {
"version": "1.47.0", "version": "1.51.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
"integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==" "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g=="
}, },
"mime-types": { "mime-types": {
"version": "2.1.30", "version": "2.1.34",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
"integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
"requires": { "requires": {
"mime-db": "1.47.0" "mime-db": "1.51.0"
} }
}, },
"minimatch": { "minimatch": {
@ -1899,9 +1941,9 @@
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
}, },
"nan": { "nan": {
"version": "2.14.2", "version": "2.15.0",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz",
"integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ=="
}, },
"negotiator": { "negotiator": {
"version": "0.6.2", "version": "0.6.2",
@ -1980,6 +2022,12 @@
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
}, },
"prettier": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz",
"integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==",
"dev": true
},
"printj": { "printj": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz",
@ -1991,11 +2039,11 @@
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
}, },
"proxy-addr": { "proxy-addr": {
"version": "2.0.6", "version": "2.0.7",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
"integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
"requires": { "requires": {
"forwarded": "~0.1.2", "forwarded": "0.2.0",
"ipaddr.js": "1.9.1" "ipaddr.js": "1.9.1"
} }
}, },
@ -2166,9 +2214,9 @@
} }
}, },
"uglify-js": { "uglify-js": {
"version": "3.13.5", "version": "3.14.3",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.5.tgz", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.3.tgz",
"integrity": "sha512-xtB8yEqIkn7zmOyS2zUNBsYCBRhDkvlNxMMY2smuJ/qA8NCHeQvKCF3i9Z4k8FJH4+PJvZRtMrPynfZ75+CSZw==", "integrity": "sha512-mic3aOdiq01DuSVx0TseaEzMIVqebMZ0Z3vaeDhFEh9bsc24hV1TFvN74reA2vs08D0ZWfNjAcJ3UbVLaBss+g==",
"optional": true "optional": true
}, },
"uid-safe": { "uid-safe": {
@ -2210,15 +2258,15 @@
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
}, },
"ws": { "ws": {
"version": "7.4.6", "version": "7.5.5",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz",
"integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==",
"requires": {} "requires": {}
}, },
"xterm": { "xterm": {
"version": "4.11.0", "version": "4.15.0",
"resolved": "https://registry.npmjs.org/xterm/-/xterm-4.11.0.tgz", "resolved": "https://registry.npmjs.org/xterm/-/xterm-4.15.0.tgz",
"integrity": "sha512-NeJH909WTO2vth/ZlC0gkP3AGzupbvVHVlmtrpBw56/sGFXaF9bNdKgqKa3tf8qbGvXMzL2JhCcHVklqFztIRw==" "integrity": "sha512-Ik1GoSq1yqKZQ2LF37RPS01kX9t4TP8gpamUYblD09yvWX5mEYuMK4CcqH6+plgiNEZduhTz/UrcaWs97gOlOw=="
}, },
"xterm-addon-attach": { "xterm-addon-attach": {
"version": "0.6.0", "version": "0.6.0",

View File

@ -2,8 +2,12 @@
"name": "file-manager", "name": "file-manager",
"description": "A simple file manager", "description": "A simple file manager",
"version": "0.1.0", "version": "0.1.0",
"scripts": {
"format": "prettier --write .",
"start": "node index.js"
},
"bin": { "bin": {
"file-manager": "./index.js" "file-manager": "index.js"
}, },
"dependencies": { "dependencies": {
"archiver": "^5.3.0", "archiver": "^5.3.0",
@ -12,9 +16,9 @@
"connect-busboy": "^0.0.2", "connect-busboy": "^0.0.2",
"connect-flash": "^0.1.1", "connect-flash": "^0.1.1",
"express": "^4.17.1", "express": "^4.17.1",
"express-handlebars": "^5.3.2", "express-handlebars": "^6.0.1",
"express-session": "^1.17.1", "express-session": "^1.17.2",
"filesize": "^6.3.0", "filesize": "^8.0.6",
"jquery": "^3.6.0", "jquery": "^3.6.0",
"node-pty": "^0.10.1", "node-pty": "^0.10.1",
"notp": "^2.0.3", "notp": "^2.0.3",
@ -25,5 +29,8 @@
"xterm": "^4.11.0", "xterm": "^4.11.0",
"xterm-addon-attach": "^0.6.0", "xterm-addon-attach": "^0.6.0",
"xterm-addon-fit": "^0.5.0" "xterm-addon-fit": "^0.5.0"
},
"devDependencies": {
"prettier": "^2.4.1"
} }
} }