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;
}
.input-group-digits input[type=number] {
.input-group-digits input[type="number"] {
-moz-appearance: textfield;
}
.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-inner-spin-button,
.input-group-digits input[type="number"]::-webkit-outer-spin-button {
-webkit-appearance: none;
margin: 0;
}
@ -19,4 +19,3 @@
.login {
width: 19.2em;
}

View File

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

View File

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

View File

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

View File

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

244
index.js
View File

@ -5,7 +5,7 @@
"use strict";
const express = require("express");
const hbs = require("express-handlebars");
const { engine: hbs } = require("express-handlebars");
const bodyparser = require("body-parser");
const session = require("express-session");
const busboy = require("connect-busboy");
@ -25,11 +25,15 @@ const filesize = require("filesize");
const octicons = require("octicons");
const handlebars = require("handlebars");
const port = +process.env.PORT || 8080;
let app = express();
let http = app.listen(process.env.PORT || 8080);
let http = app.listen(port);
app.set("views", path.join(__dirname, "views"));
app.engine("handlebars", hbs({
app.engine(
"handlebars",
hbs({
partialsDir: path.join(__dirname, "views", "partials"),
layoutsDir: path.join(__dirname, "views", "layouts"),
defaultLayout: "main",
@ -58,41 +62,67 @@ app.engine("handlebars", hbs({
out += options.fn({
name: folder + "/",
path: "/" + path.slice(1, index + 1).join("/"),
current: index === path.length - 1
current: index === path.length - 1,
});
});
return out;
},
}
}));
},
})
);
app.set("view engine", "handlebars");
app.use("/@assets", express.static(path.join(__dirname, "assets")));
app.use("/@assets/bootstrap", express.static(path.join(__dirname, "node_modules/bootstrap/dist")));
app.use("/@assets/octicons", 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(
"/@assets/bootstrap",
express.static(path.join(__dirname, "node_modules/bootstrap/dist"))
);
app.use(
"/@assets/octicons",
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({
secret: process.env.SESSION_KEY || "meowmeow"
}));
app.use(
session({
secret: process.env.SESSION_KEY || "meowmeow",
})
);
app.use(flash());
app.use(busboy());
app.use(bodyparser.urlencoded());
// 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) => {
if (KEY) {
req.session.login = false;
req.flash("success", "Signed out.");
res.redirect("/@login");
return
return;
}
req.flash("error", "You were never logged in...");
res.redirect("back");
@ -158,10 +188,12 @@ app.all("/*", (req, res, next) => {
});
});
fileExists.then((stats) => {
fileExists
.then((stats) => {
res.stats = stats;
next();
}).catch((err) => {
})
.catch((err) => {
res.stats = { error: err };
next();
});
@ -203,11 +235,13 @@ app.post("/*@upload", (req, res) => {
});
});
fileExists.then((stats) => {
fileExists
.then((stats) => {
console.warn("file exists, cannot overwrite");
req.flash("error", "File exists, cannot overwrite. ");
res.redirect("back");
}).catch((err) => {
})
.catch((err) => {
const saveName = relative(res.filename, saveas);
console.log("saving file to " + saveName);
let save = fs.createWriteStream(saveName);
@ -217,8 +251,7 @@ app.post("/*@upload", (req, res) => {
}
if (buff.length === 0) {
req.flash("success", "File saved. Warning: empty file.");
}
else {
} else {
buff = null;
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. ");
res.redirect("back");
}).catch((err) => {
})
.catch((err) => {
fs.mkdir(relative(res.filename, folder), (err) => {
if (err) {
console.warn(err);
@ -281,7 +316,7 @@ app.post("/*@delete", (req, res) => {
return; // res.status(400).end();
}
let promises = files.map(f => {
let promises = files.map((f) => {
return new Promise((resolve, reject) => {
fs.stat(relative(res.filename, f), (err, stats) => {
if (err) {
@ -290,21 +325,26 @@ app.post("/*@delete", (req, res) => {
resolve({
name: f,
isdirectory: stats.isDirectory(),
isfile: stats.isFile()
isfile: stats.isFile(),
});
});
});
});
Promise.all(promises).then((files) => {
let promises = files.map(f => {
Promise.all(promises)
.then((files) => {
let promises = files.map((f) => {
return new Promise((resolve, reject) => {
let op = null;
if (f.isdirectory) {
op = (dir, cb) => rimraf(dir, {
glob: false
}, cb);
}
else if (f.isfile) {
op = (dir, cb) =>
rimraf(
dir,
{
glob: false,
},
cb
);
} else if (f.isfile) {
op = fs.unlink;
}
if (op) {
@ -317,15 +357,18 @@ app.post("/*@delete", (req, res) => {
}
});
});
Promise.all(promises).then(() => {
Promise.all(promises)
.then(() => {
req.flash("success", "Files deleted. ");
res.redirect("back");
}).catch((err) => {
})
.catch((err) => {
console.warn(err);
req.flash("error", "Unable to delete some files: " + err);
res.redirect("back");
});
}).catch((err) => {
})
.catch((err) => {
console.warn(err);
req.flash("error", err.toString());
res.redirect("back");
@ -345,7 +388,7 @@ app.get("/*@download", (req, res) => {
return; // res.status(400).end();
}
let promises = files.map(f => {
let promises = files.map((f) => {
return new Promise((resolve, reject) => {
fs.stat(relative(res.filename, f), (err, stats) => {
if (err) {
@ -354,24 +397,29 @@ app.get("/*@download", (req, res) => {
resolve({
name: f,
isdirectory: stats.isDirectory(),
isfile: stats.isFile()
isfile: stats.isFile(),
});
});
});
});
Promise.all(promises).then((files) => {
Promise.all(promises)
.then((files) => {
let zip = archiver("zip", {});
zip.on("error", function (err) {
console.warn(err);
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 });
});
files.filter(f => f.isdirectory).forEach((f) => {
files
.filter((f) => f.isdirectory)
.forEach((f) => {
zip.directory(relative(res.filename, f.name), f.name);
});
@ -379,7 +427,8 @@ app.get("/*@download", (req, res) => {
zip.pipe(res);
zip.finalize();
}).catch((err) => {
})
.catch((err) => {
console.warn(err);
req.flash("error", err.toString());
res.redirect("back");
@ -404,21 +453,28 @@ if (shellable || cmdable) {
}
console.log("running command " + cmd);
child_process.exec(cmd, {
child_process.exec(
cmd,
{
cwd: relative(res.filename),
timeout: 60 * 1000,
}, (err, stdout, stderr) => {
},
(err, stdout, stderr) => {
if (err) {
console.log("command run failed: " + JSON.stringify(err));
req.flash("error", "Command failed due to non-zero exit code");
}
res.render("cmd", flashify(req, {
res.render(
"cmd",
flashify(req, {
path: res.filename,
cmd: cmd,
stdout: stdout,
stderr: stderr,
}));
});
})
);
}
);
});
const pty = require("node-pty");
@ -427,9 +483,12 @@ if (shellable || cmdable) {
app.get("/*@shell", (req, res) => {
res.filename = req.params[0];
res.render("shell", flashify(req, {
res.render(
"shell",
flashify(req, {
path: res.filename,
}));
})
);
});
const ws = new WebSocket.Server({ server: http });
@ -442,13 +501,15 @@ if (shellable || cmdable) {
rows: 30,
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) => {
socket.send(data, { binary: true });
});
term.on("exit", (code) => {
console.log("pid " + term.pid + " ended")
console.log("pid " + term.pid + " ended");
socket.close();
});
socket.on("message", (data) => {
@ -481,16 +542,16 @@ function isimage(f) {
app.get("/*", (req, res) => {
if (res.stats.error) {
res.render("list", flashify(req, {
res.render(
"list",
flashify(req, {
shellable: shellable,
cmdable: cmdable,
path: res.filename,
errors: [
res.stats.error
]
}));
}
else if (res.stats.isDirectory()) {
errors: [res.stats.error],
})
);
} else if (res.stats.isDirectory()) {
if (!req.url.endsWith("/")) {
return res.redirect(req.url + "/");
}
@ -504,62 +565,75 @@ app.get("/*", (req, res) => {
});
});
readDir.then((filenames) => {
const promises = filenames.map(f => new Promise((resolve, reject) => {
readDir
.then((filenames) => {
const promises = filenames.map(
(f) =>
new Promise((resolve, reject) => {
fs.stat(relative(res.filename, f), (err, stats) => {
if (err) {
console.warn(err);
return resolve({
name: f,
error: err
error: err,
});
}
resolve({
name: f,
isdirectory: stats.isDirectory(),
issmallimage: isimage(f) && stats.size < SMALL_IMAGE_MAX_SIZE,
size: stats.size
size: stats.size,
});
});
}));
})
);
Promise.all(promises).then((files) => {
res.render("list", flashify(req, {
Promise.all(promises)
.then((files) => {
res.render(
"list",
flashify(req, {
shellable: shellable,
cmdable: cmdable,
path: res.filename,
files: files,
}));
}).catch((err) => {
})
);
})
.catch((err) => {
console.error(err);
res.render("list", flashify(req, {
res.render(
"list",
flashify(req, {
shellable: shellable,
cmdable: cmdable,
path: res.filename,
errors: [
err
]
}));
errors: [err],
})
);
});
}).catch((err) => {
})
.catch((err) => {
console.warn(err);
res.render("list", flashify(req, {
res.render(
"list",
flashify(req, {
shellable: shellable,
cmdable: cmdable,
path: res.filename,
errors: [
err
]
}));
errors: [err],
})
);
});
}
else if (res.stats.isFile()) {
} else if (res.stats.isFile()) {
res.sendFile(relative(res.filename), {
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",
"version": "0.0.7a",
"version": "0.1.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "file-manager",
"version": "0.0.7a",
"version": "0.1.0",
"dependencies": {
"archiver": "^5.3.0",
"body-parser": "^1.19.0",
@ -14,9 +14,9 @@
"connect-busboy": "^0.0.2",
"connect-flash": "^0.1.1",
"express": "^4.17.1",
"express-handlebars": "^5.3.2",
"express-session": "^1.17.1",
"filesize": "^6.3.0",
"express-handlebars": "^6.0.1",
"express-session": "^1.17.2",
"filesize": "^8.0.6",
"jquery": "^3.6.0",
"node-pty": "^0.10.1",
"notp": "^2.0.3",
@ -30,12 +30,15 @@
},
"bin": {
"file-manager": "index.js"
},
"devDependencies": {
"prettier": "^2.4.1"
}
},
"node_modules/@popperjs/core": {
"version": "2.9.2",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.2.tgz",
"integrity": "sha512-VZMYa7+fXHdwIq1TDhSXoVmSPEGM/aa+6Aiq3nVVJ9bXr24zScr+NlKFKC3iPljA7ho/GAZr+d2jOf5GIRC30Q==",
"version": "2.10.2",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.10.2.tgz",
"integrity": "sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ==",
"peer": true,
"funding": {
"type": "opencollective",
@ -119,9 +122,9 @@
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
},
"node_modules/async": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz",
"integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw=="
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz",
"integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g=="
},
"node_modules/balanced-match": {
"version": "1.0.2",
@ -178,15 +181,15 @@
}
},
"node_modules/bootstrap": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.0.0.tgz",
"integrity": "sha512-tmhPET9B9qCl8dCofvHeiIhi49iBt0EehmIsziZib65k1erBW1rHhj2s/2JsuQh5Pq+xz2E9bEbzp9B7xHG+VA==",
"version": "5.1.3",
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz",
"integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/bootstrap"
},
"peerDependencies": {
"@popperjs/core": "^2.9.2"
"@popperjs/core": "^2.10.2"
}
},
"node_modules/brace-expansion": {
@ -249,12 +252,12 @@
}
},
"node_modules/compress-commons": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.0.tgz",
"integrity": "sha512-ofaaLqfraD1YRTkrRKPCrGJ1pFeDG/MVCkVVV2FNGeWquSlqw5wOrwOfPQ1xF2u+blpeWASie5EubHz+vsNIgA==",
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz",
"integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==",
"dependencies": {
"buffer-crc32": "^0.2.13",
"crc32-stream": "^4.0.1",
"crc32-stream": "^4.0.2",
"normalize-path": "^3.0.0",
"readable-stream": "^3.6.0"
},
@ -319,9 +322,9 @@
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
},
"node_modules/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="
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
},
"node_modules/crc-32": {
"version": "1.2.0",
@ -465,36 +468,44 @@
}
},
"node_modules/express-handlebars": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/express-handlebars/-/express-handlebars-5.3.2.tgz",
"integrity": "sha512-iGR7HXP+x+SfJQo9m00ocqcr7hU8ZzcssTLE/4wBX+jsqcblO6sFJEbEAEFjiNze3XMz9Y26Zs1WN5Bb4zxivQ==",
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/express-handlebars/-/express-handlebars-6.0.1.tgz",
"integrity": "sha512-K3Lemki5jkD3sZwDhgBEBk+oAl1xg4nsMJAfpq1AUl5K187/mU1/xKVWt+4RZAHAxlyQFk4YBfX5+00AzLNfWg==",
"dependencies": {
"glob": "^7.1.7",
"graceful-fs": "^4.2.6",
"glob": "^7.2.0",
"graceful-fs": "^4.2.8",
"handlebars": "^4.7.7"
},
"engines": {
"node": ">=v10.24.1"
"node": ">=v12.22.7"
}
},
"node_modules/express-session": {
"version": "1.17.1",
"resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.1.tgz",
"integrity": "sha512-UbHwgqjxQZJiWRTMyhvWGvjBQduGCSBDhhZXYenziMFjxst5rMV+aJZ6hKPHZnPyHGsrqRICxtX8jtEbm/z36Q==",
"version": "1.17.2",
"resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.2.tgz",
"integrity": "sha512-mPcYcLA0lvh7D4Oqr5aNJFMtBMKPLl++OKKxkHzZ0U0oDq1rpKBnkR5f5vCHR26VeArlTOEF9td4x5IjICksRQ==",
"dependencies": {
"cookie": "0.4.0",
"cookie": "0.4.1",
"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",
"safe-buffer": "5.2.1",
"uid-safe": "~2.1.5"
},
"engines": {
"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": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
@ -504,14 +515,28 @@
}
},
"node_modules/express-session/node_modules/safe-buffer": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
"integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"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": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/filesize/-/filesize-6.3.0.tgz",
"integrity": "sha512-ytx0ruGpDHKWVoiui6+BY/QMNngtDQ/pJaFwfBpQif0J63+E8DLdFyqS3NkKQn7vIruUEpoGD9JUJSg7Kp+I0g==",
"version": "8.0.6",
"resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.6.tgz",
"integrity": "sha512-sHvRqTiwdmcuzqet7iVwsbwF6UrV3wIgDf2SHNdY1Hgl8PC45HZg/0xtdw6U2izIV4lccnrY9ftl6wZFNdjYMg==",
"engines": {
"node": ">= 0.4.0"
}
@ -534,9 +559,9 @@
}
},
"node_modules/forwarded": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
"integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
"integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
"engines": {
"node": ">= 0.6"
}
@ -560,9 +585,9 @@
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
},
"node_modules/glob": {
"version": "7.1.7",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
"integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
"integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@ -579,9 +604,9 @@
}
},
"node_modules/graceful-fs": {
"version": "4.2.6",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
"integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ=="
"version": "4.2.8",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
"integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg=="
},
"node_modules/handlebars": {
"version": "4.7.7",
@ -686,9 +711,9 @@
"integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw=="
},
"node_modules/lazystream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
"integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz",
"integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==",
"dependencies": {
"readable-stream": "^2.0.5"
},
@ -776,19 +801,19 @@
}
},
"node_modules/mime-db": {
"version": "1.47.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz",
"integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==",
"version": "1.51.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
"integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mime-types": {
"version": "2.1.30",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz",
"integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==",
"version": "2.1.34",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
"integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
"dependencies": {
"mime-db": "1.47.0"
"mime-db": "1.51.0"
},
"engines": {
"node": ">= 0.6"
@ -816,9 +841,9 @@
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"node_modules/nan": {
"version": "2.14.2",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz",
"integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ=="
"version": "2.15.0",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz",
"integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ=="
},
"node_modules/negotiator": {
"version": "0.6.2",
@ -923,6 +948,18 @@
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"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": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz",
@ -940,11 +977,11 @@
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
},
"node_modules/proxy-addr": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
"integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
"integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
"dependencies": {
"forwarded": "~0.1.2",
"forwarded": "0.2.0",
"ipaddr.js": "1.9.1"
},
"engines": {
@ -1176,9 +1213,9 @@
}
},
"node_modules/uglify-js": {
"version": "3.13.5",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.5.tgz",
"integrity": "sha512-xtB8yEqIkn7zmOyS2zUNBsYCBRhDkvlNxMMY2smuJ/qA8NCHeQvKCF3i9Z4k8FJH4+PJvZRtMrPynfZ75+CSZw==",
"version": "3.14.3",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.3.tgz",
"integrity": "sha512-mic3aOdiq01DuSVx0TseaEzMIVqebMZ0Z3vaeDhFEh9bsc24hV1TFvN74reA2vs08D0ZWfNjAcJ3UbVLaBss+g==",
"optional": true,
"bin": {
"uglifyjs": "bin/uglifyjs"
@ -1238,9 +1275,9 @@
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
},
"node_modules/ws": {
"version": "7.4.6",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
"integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
"version": "7.5.5",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz",
"integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==",
"engines": {
"node": ">=8.3.0"
},
@ -1258,9 +1295,9 @@
}
},
"node_modules/xterm": {
"version": "4.11.0",
"resolved": "https://registry.npmjs.org/xterm/-/xterm-4.11.0.tgz",
"integrity": "sha512-NeJH909WTO2vth/ZlC0gkP3AGzupbvVHVlmtrpBw56/sGFXaF9bNdKgqKa3tf8qbGvXMzL2JhCcHVklqFztIRw=="
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/xterm/-/xterm-4.15.0.tgz",
"integrity": "sha512-Ik1GoSq1yqKZQ2LF37RPS01kX9t4TP8gpamUYblD09yvWX5mEYuMK4CcqH6+plgiNEZduhTz/UrcaWs97gOlOw=="
},
"node_modules/xterm-addon-attach": {
"version": "0.6.0",
@ -1294,9 +1331,9 @@
},
"dependencies": {
"@popperjs/core": {
"version": "2.9.2",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.2.tgz",
"integrity": "sha512-VZMYa7+fXHdwIq1TDhSXoVmSPEGM/aa+6Aiq3nVVJ9bXr24zScr+NlKFKC3iPljA7ho/GAZr+d2jOf5GIRC30Q==",
"version": "2.10.2",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.10.2.tgz",
"integrity": "sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ==",
"peer": true
},
"accepts": {
@ -1369,9 +1406,9 @@
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
},
"async": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz",
"integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw=="
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz",
"integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g=="
},
"balanced-match": {
"version": "1.0.2",
@ -1411,9 +1448,9 @@
}
},
"bootstrap": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.0.0.tgz",
"integrity": "sha512-tmhPET9B9qCl8dCofvHeiIhi49iBt0EehmIsziZib65k1erBW1rHhj2s/2JsuQh5Pq+xz2E9bEbzp9B7xHG+VA==",
"version": "5.1.3",
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz",
"integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==",
"requires": {}
},
"brace-expansion": {
@ -1453,12 +1490,12 @@
"integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
},
"compress-commons": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.0.tgz",
"integrity": "sha512-ofaaLqfraD1YRTkrRKPCrGJ1pFeDG/MVCkVVV2FNGeWquSlqw5wOrwOfPQ1xF2u+blpeWASie5EubHz+vsNIgA==",
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz",
"integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==",
"requires": {
"buffer-crc32": "^0.2.13",
"crc32-stream": "^4.0.1",
"crc32-stream": "^4.0.2",
"normalize-path": "^3.0.0",
"readable-stream": "^3.6.0"
}
@ -1505,9 +1542,9 @@
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
},
"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="
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
},
"crc-32": {
"version": "1.2.0",
@ -1624,46 +1661,51 @@
}
},
"express-handlebars": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/express-handlebars/-/express-handlebars-5.3.2.tgz",
"integrity": "sha512-iGR7HXP+x+SfJQo9m00ocqcr7hU8ZzcssTLE/4wBX+jsqcblO6sFJEbEAEFjiNze3XMz9Y26Zs1WN5Bb4zxivQ==",
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/express-handlebars/-/express-handlebars-6.0.1.tgz",
"integrity": "sha512-K3Lemki5jkD3sZwDhgBEBk+oAl1xg4nsMJAfpq1AUl5K187/mU1/xKVWt+4RZAHAxlyQFk4YBfX5+00AzLNfWg==",
"requires": {
"glob": "^7.1.7",
"graceful-fs": "^4.2.6",
"glob": "^7.2.0",
"graceful-fs": "^4.2.8",
"handlebars": "^4.7.7"
}
},
"express-session": {
"version": "1.17.1",
"resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.1.tgz",
"integrity": "sha512-UbHwgqjxQZJiWRTMyhvWGvjBQduGCSBDhhZXYenziMFjxst5rMV+aJZ6hKPHZnPyHGsrqRICxtX8jtEbm/z36Q==",
"version": "1.17.2",
"resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.2.tgz",
"integrity": "sha512-mPcYcLA0lvh7D4Oqr5aNJFMtBMKPLl++OKKxkHzZ0U0oDq1rpKBnkR5f5vCHR26VeArlTOEF9td4x5IjICksRQ==",
"requires": {
"cookie": "0.4.0",
"cookie": "0.4.1",
"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",
"safe-buffer": "5.2.1",
"uid-safe": "~2.1.5"
},
"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": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
},
"safe-buffer": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
"integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
}
}
},
"filesize": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/filesize/-/filesize-6.3.0.tgz",
"integrity": "sha512-ytx0ruGpDHKWVoiui6+BY/QMNngtDQ/pJaFwfBpQif0J63+E8DLdFyqS3NkKQn7vIruUEpoGD9JUJSg7Kp+I0g=="
"version": "8.0.6",
"resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.6.tgz",
"integrity": "sha512-sHvRqTiwdmcuzqet7iVwsbwF6UrV3wIgDf2SHNdY1Hgl8PC45HZg/0xtdw6U2izIV4lccnrY9ftl6wZFNdjYMg=="
},
"finalhandler": {
"version": "1.1.2",
@ -1680,9 +1722,9 @@
}
},
"forwarded": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
"integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
"integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
},
"fresh": {
"version": "0.5.2",
@ -1700,9 +1742,9 @@
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
},
"glob": {
"version": "7.1.7",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
"integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
"integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@ -1713,9 +1755,9 @@
}
},
"graceful-fs": {
"version": "4.2.6",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
"integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ=="
"version": "4.2.8",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
"integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg=="
},
"handlebars": {
"version": "4.7.7",
@ -1791,9 +1833,9 @@
"integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw=="
},
"lazystream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
"integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz",
"integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==",
"requires": {
"readable-stream": "^2.0.5"
},
@ -1868,16 +1910,16 @@
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
},
"mime-db": {
"version": "1.47.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz",
"integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw=="
"version": "1.51.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
"integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g=="
},
"mime-types": {
"version": "2.1.30",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz",
"integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==",
"version": "2.1.34",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
"integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
"requires": {
"mime-db": "1.47.0"
"mime-db": "1.51.0"
}
},
"minimatch": {
@ -1899,9 +1941,9 @@
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"nan": {
"version": "2.14.2",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz",
"integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ=="
"version": "2.15.0",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz",
"integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ=="
},
"negotiator": {
"version": "0.6.2",
@ -1980,6 +2022,12 @@
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"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": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz",
@ -1991,11 +2039,11 @@
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
},
"proxy-addr": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
"integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
"integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
"requires": {
"forwarded": "~0.1.2",
"forwarded": "0.2.0",
"ipaddr.js": "1.9.1"
}
},
@ -2166,9 +2214,9 @@
}
},
"uglify-js": {
"version": "3.13.5",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.5.tgz",
"integrity": "sha512-xtB8yEqIkn7zmOyS2zUNBsYCBRhDkvlNxMMY2smuJ/qA8NCHeQvKCF3i9Z4k8FJH4+PJvZRtMrPynfZ75+CSZw==",
"version": "3.14.3",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.3.tgz",
"integrity": "sha512-mic3aOdiq01DuSVx0TseaEzMIVqebMZ0Z3vaeDhFEh9bsc24hV1TFvN74reA2vs08D0ZWfNjAcJ3UbVLaBss+g==",
"optional": true
},
"uid-safe": {
@ -2210,15 +2258,15 @@
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
},
"ws": {
"version": "7.4.6",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
"integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
"version": "7.5.5",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz",
"integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==",
"requires": {}
},
"xterm": {
"version": "4.11.0",
"resolved": "https://registry.npmjs.org/xterm/-/xterm-4.11.0.tgz",
"integrity": "sha512-NeJH909WTO2vth/ZlC0gkP3AGzupbvVHVlmtrpBw56/sGFXaF9bNdKgqKa3tf8qbGvXMzL2JhCcHVklqFztIRw=="
"version": "4.15.0",
"resolved": "https://registry.npmjs.org/xterm/-/xterm-4.15.0.tgz",
"integrity": "sha512-Ik1GoSq1yqKZQ2LF37RPS01kX9t4TP8gpamUYblD09yvWX5mEYuMK4CcqH6+plgiNEZduhTz/UrcaWs97gOlOw=="
},
"xterm-addon-attach": {
"version": "0.6.0",

View File

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