From b91d68dee53c19fb22c2fae76c3d1183eaa2eb6a Mon Sep 17 00:00:00 2001 From: SebClem Date: Wed, 14 Aug 2024 10:20:30 +0200 Subject: [PATCH] Cleanup --- .../rootfs/opt/nextcloud_backup/package.json | 28 - .../rootfs/opt/nextcloud_backup/routes/api.js | 229 --- .../nextcloud_backup/tools/hassioApiTools.js | 536 ------ .../opt/nextcloud_backup/tools/webdavTools.js | 427 ----- .../views/modals/nextcloud-settings-modal.ejs | 73 - .../rootfs/opt/nextcloud_backup/yarn.lock | 1554 ----------------- 6 files changed, 2847 deletions(-) delete mode 100644 nextcloud_backup/rootfs/opt/nextcloud_backup/package.json delete mode 100644 nextcloud_backup/rootfs/opt/nextcloud_backup/routes/api.js delete mode 100644 nextcloud_backup/rootfs/opt/nextcloud_backup/tools/hassioApiTools.js delete mode 100644 nextcloud_backup/rootfs/opt/nextcloud_backup/tools/webdavTools.js delete mode 100644 nextcloud_backup/rootfs/opt/nextcloud_backup/views/modals/nextcloud-settings-modal.ejs delete mode 100644 nextcloud_backup/rootfs/opt/nextcloud_backup/yarn.lock diff --git a/nextcloud_backup/rootfs/opt/nextcloud_backup/package.json b/nextcloud_backup/rootfs/opt/nextcloud_backup/package.json deleted file mode 100644 index af83ebc..0000000 --- a/nextcloud_backup/rootfs/opt/nextcloud_backup/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "nexcloud-backup", - "version": "0.8.0", - "private": true, - "type": "module", - "scripts": { - "start": "node ./bin/www.js " - }, - "dependencies": { - "@fortawesome/fontawesome-free": "6.1.2", - "app-root-path": "3.0.0", - "bootstrap": "5.1.3", - "cookie-parser": "1.4.6", - "cron": "2.1.0", - "debug": "4.3.4", - "ejs": "3.1.8", - "express": "4.18.1", - "form-data": "4.0.0", - "got": "12.3.0", - "http-errors": "2.0.0", - "jquery": "3.6.0", - "luxon": "3.0.1", - "morgan": "1.10.0", - "webdav": "4.10.0", - "winston": "3.8.1" - }, - "packageManager": "yarn@3.2.2" -} diff --git a/nextcloud_backup/rootfs/opt/nextcloud_backup/routes/api.js b/nextcloud_backup/rootfs/opt/nextcloud_backup/routes/api.js deleted file mode 100644 index c9edaa0..0000000 --- a/nextcloud_backup/rootfs/opt/nextcloud_backup/routes/api.js +++ /dev/null @@ -1,229 +0,0 @@ -import express from 'express'; -import * as statusTools from "../tools/status.js" -import webdav from "../tools/webdavTools.js" -import * as settingsTools from "../tools/settingsTools.js" -import * as pathTools from "../tools/pathTools.js" -import * as hassioApiTools from "../tools/hassioApiTools.js" -import { humanFileSize } from "../tools/toolbox.js"; -import cronTools from "../tools/cronTools.js" -import logger from "../config/winston.js" -import {DateTime} from "luxon"; - -var router = express.Router(); - -router.get("/status", (req, res, next) => { - cronTools.updateNextDate(); - let status = statusTools.getStatus(); - res.json(status); -}); - -router.get("/formated-local-snap", function (req, res, next) { - hassioApiTools.getSnapshots() - .then((snaps) => { - snaps.sort((a, b) => { - return Date.parse(b.date) - Date.parse(a.date); - }); - - res.render("localSnaps", { snaps: snaps, DateTime: DateTime }); - }) - .catch((err) => { - logger.error(err); - res.status(500); - res.send(""); - } - ); -}); - -router.get("/formated-backup-manual", function (req, res, next) { - if (webdav.getConf() == null) { - res.send(""); - return; - } - webdav - .getFolderContent(webdav.getConf().back_dir + pathTools.manual) - .then((contents) => { - contents.sort((a, b) => { - return Date.parse(b.lastmod) - Date.parse(a.lastmod) - }); - //TODO Remove this when bug is fixed, etag contain '"' at start and end ? - for (let backup of contents) { - backup.etag = backup.etag.replace(/"/g, ''); - } - res.render("backupSnaps", { backups: contents, DateTime: DateTime, humanFileSize: humanFileSize }); - }) - .catch((err) => { - res.status(500) - res.send(err); - }); -}); - -router.get("/formated-backup-auto", function (req, res, next) { - if (webdav.getConf() == null) { - res.send(""); - return; - } - let url = webdav.getConf().back_dir + pathTools.auto; - webdav - .getFolderContent(url) - .then((contents) => { - contents.sort((a, b) => { - return Date.parse(b.lastmod) - Date.parse(a.lastmod) - }); - //TODO Remove this when bug is fixed, etag contain '"' at start and end ? - for (let backup of contents) { - backup.etag = backup.etag.replace(/"/g, ''); - } - res.render("backupSnaps", { backups: contents, DateTime: DateTime, humanFileSize: humanFileSize }); - }) - .catch((err) => { - res.status(500) - res.send(err); - }); -}); - -router.post("/nextcloud-settings", function (req, res, next) { - let settings = req.body; - if (settings.ssl != null && settings.host != null && settings.host !== "" && settings.username != null && settings.password != null) { - webdav.setConf(settings); - webdav - .confIsValid() - .then(() => { - res.status(201); - res.send(); - }) - .catch((err) => { - res.status(406); - res.json({ message: err }); - }); - } else { - res.status(400); - res.send(); - } -}); - -router.get("/nextcloud-settings", function (req, res, next) { - let conf = webdav.getConf(); - if (conf == null) { - res.status(404); - res.send(); - } else { - res.json(conf); - } -}); - -router.post("/manual-backup", function (req, res, next) { - let id = req.query.id; - let name = req.query.name; - let status = statusTools.getStatus(); - if (status.status === "creating" && status.status === "upload" && status.status === "download") { - res.status(503); - res.send(); - return; - } - - hassioApiTools - .downloadSnapshot(id) - .then(() => { - webdav.uploadFile(id, webdav.getConf().back_dir + pathTools.manual + name + ".tar").then(()=>{ - res.status(201); - res.send(); - }).catch(()=>{ - res.status(500); - res.send(); - } - ); - - }) - .catch(() => { - res.status(500); - res.send(); - }); -}); - -router.post("/new-backup", function (req, res, next) { - let status = statusTools.getStatus(); - if (status.status === "creating" || status.status === "upload" || status.status === "download" || status.status === "stopping" || status.status === "starting") { - res.status(503); - res.send(); - return; - } - hassioApiTools.stopAddons() - .then(() => { - hassioApiTools.getVersion() - .then((version) => { - let name = settingsTools.getFormatedName(true, version); - hassioApiTools.createNewBackup(name) - .then((id) => { - hassioApiTools - .downloadSnapshot(id) - .then(() => { - webdav.uploadFile(id, webdav.getConf().back_dir + pathTools.manual + name + ".tar") - .then(() => { - hassioApiTools.startAddons().catch(() => { - }) - }).catch(()=>{}); - }).catch(()=>{}); - }).catch(()=>{}); - }).catch(()=>{}); - }) - .catch(() => { - hassioApiTools.startAddons().catch(() => { - }); - }); - - - res.status(201); - res.send(); -}); - -router.get("/backup-settings", function (req, res, next) { - hassioApiTools.getAddonList().then((addonList) => { - let data = {}; - data['folders'] = hassioApiTools.getFolderList(); - data['addonList'] = addonList; - data['settings'] = settingsTools.getSettings(); - res.send(data); - }) - -}); - -router.post("/backup-settings", function (req, res, next) { - let [result, message] = settingsTools.check(req.body) - if (result) { - settingsTools.setSettings(req.body); - cronTools.init(); - res.send(); - } else { - res.status(400); - res.send(message); - } -}); - -router.post("/clean-now", function (req, res, next) { - webdav - .clean() - .then(() => { - hassioApiTools.clean().catch(); - }) - .catch(() => { - hassioApiTools.clean().catch(); - }); - res.status(201); - res.send(); -}); - -router.post("/restore", function (req, res, next) { - if (req.body["path"] != null) { - webdav.downloadFile(req.body["path"]).then((path) => { - hassioApiTools.uploadSnapshot(path).catch(); - }); - res.status(200); - res.send(); - } else { - res.status(400); - res.send(); - } -}); - -export default router; - \ No newline at end of file diff --git a/nextcloud_backup/rootfs/opt/nextcloud_backup/tools/hassioApiTools.js b/nextcloud_backup/rootfs/opt/nextcloud_backup/tools/hassioApiTools.js deleted file mode 100644 index a9c80eb..0000000 --- a/nextcloud_backup/rootfs/opt/nextcloud_backup/tools/hassioApiTools.js +++ /dev/null @@ -1,536 +0,0 @@ -import fs from "fs" - -import stream from "stream" -import { promisify } from "util"; -import got from "got"; -import FormData from "form-data"; -import * as statusTools from "../tools/status.js" -import * as settingsTools from "../tools/settingsTools.js" - -import logger from "../config/winston.js" -import {DateTime} from "luxon"; - -const pipeline = promisify(stream.pipeline); - -const token = process.env.SUPERVISOR_TOKEN; - -// Default timeout to 90min -const create_snap_timeout = parseInt(process.env.CREATE_BACKUP_TIMEOUT) || (90 * 60 * 1000); - - -function getVersion() { - return new Promise((resolve, reject) => { - let status = statusTools.getStatus(); - let option = { - headers: { "authorization": `Bearer ${token}` }, - responseType: "json", - }; - - got("http://hassio/core/info", option) - .then((result) => { - if (status.error_code === 1) { - status.status = "idle"; - status.message = null; - status.error_code = null; - statusTools.setStatus(status); - } - let version = result.body.data.version; - resolve(version); - }) - .catch((error) => { - statusTools.setError(`Fail to fetch HA Version (${error.message})`, 1); - reject(`Fail to fetch HA Version (${error.message})`); - }); - }); -} - -function getAddonList() { - return new Promise((resolve, reject) => { - let status = statusTools.getStatus(); - let option = { - headers: { "authorization": `Bearer ${token}` }, - responseType: "json", - }; - - got("http://hassio/addons", option) - .then((result) => { - if (status.error_code === 1) { - status.status = "idle"; - status.message = null; - status.error_code = null; - statusTools.setStatus(status); - } - let addons = result.body.data.addons; - addons.sort((a, b) => { - let textA = a.name.toUpperCase(); - let textB = b.name.toUpperCase(); - return (textA < textB) ? -1 : (textA > textB) ? 1 : 0; - }); - resolve(addons); - }) - .catch((error) => { - statusTools.setError(`Fail to fetch addons list (${error.message})`, 1); - reject(`Fail to fetch addons list (${error.message})`); - }); - }); -} - -function getAddonToBackup() { - return new Promise((resolve, reject) => { - let excluded_addon = settingsTools.getSettings().exclude_addon; - getAddonList() - .then((all_addon) => { - let slugs = []; - for (let addon of all_addon) { - if (!excluded_addon.includes(addon.slug)) - slugs.push(addon.slug) - } - logger.debug("Addon to backup:") - logger.debug(slugs) - resolve(slugs) - }) - .catch(() => reject()); - }); -} - -function getFolderList() { - return [ - { - name: "Home Assistant configuration", - slug: "homeassistant" - }, - { - name: "SSL", - slug: "ssl" - }, - { - name: "Share", - slug: "share" - }, - { - name: "Media", - slug: "media" - }, - { - name: "Local add-ons", - slug: "addons/local" - } - ] -} - -function getFolderToBackup() { - let excluded_folder = settingsTools.getSettings().exclude_folder; - let all_folder = getFolderList() - let slugs = []; - for (let folder of all_folder) { - if (!excluded_folder.includes(folder.slug)) - slugs.push(folder.slug) - } - logger.debug("Folders to backup:"); - logger.debug(slugs) - return slugs; -} - -function getSnapshots() { - return new Promise((resolve, reject) => { - let status = statusTools.getStatus(); - let option = { - headers: { "authorization": `Bearer ${token}` }, - responseType: "json", - }; - - got("http://hassio/backups", option) - .then((result) => { - if (status.error_code === 1) { - status.status = "idle"; - status.message = null; - status.error_code = null; - statusTools.setStatus(status); - } - let snaps = result.body.data.backups; - resolve(snaps); - }) - .catch((error) => { - statusTools.setError(`Fail to fetch Hassio backups (${error.message})`, 1); - reject(`Fail to fetch Hassio backups (${error.message})`); - }); - }); -} - -function downloadSnapshot(id) { - return new Promise((resolve, reject) => { - logger.info(`Downloading snapshot ${id}...`); - if (!fs.existsSync("./temp/")) fs.mkdirSync("./temp/"); - let tmp_file = `./temp/${id}.tar`; - let stream = fs.createWriteStream(tmp_file); - let status = statusTools.getStatus(); - checkSnap(id) - .then(() => { - status.status = "download"; - status.progress = 0; - statusTools.setStatus(status); - let option = { - headers: { "Authorization": `Bearer ${token}` }, - }; - - pipeline( - got.stream.get(`http://hassio/backups/${id}/download`, option) - .on("downloadProgress", (e) => { - let percent = Math.round(e.percent * 100) / 100; - if (status.progress !== percent) { - status.progress = percent; - statusTools.setStatus(status); - } - }), - stream - ) - .then(() => { - logger.info("Download success !"); - status.progress = 1; - statusTools.setStatus(status); - logger.debug("Snapshot dl size : " + fs.statSync(tmp_file).size / 1024 / 1024); - resolve(); - }) - .catch((error) => { - fs.unlinkSync(tmp_file); - statusTools.setError(`Fail to download Hassio backup (${error.message})`, 7); - reject(`Fail to download Hassio backup (${error.message})`); - }); - }) - .catch(() => { - statusTools.setError("Fail to download Hassio backup. Not found ?", 7); - reject(); - }); - }); -} - -function dellSnap(id) { - return new Promise((resolve, reject) => { - checkSnap(id) - .then(() => { - let option = { - headers: { "authorization": `Bearer ${token}` }, - responseType: "json", - }; - - got.delete(`http://hassio/backups/${id}`, option) - .then(() => resolve()) - .catch((e) => { - logger.error(e) - reject(); - }); - }) - .catch(() => { - reject(); - }); - }); -} - -function checkSnap(id) { - return new Promise((resolve, reject) => { - let option = { - headers: { "authorization": `Bearer ${token}` }, - responseType: "json", - }; - - got(`http://hassio/backups/${id}/info`, option) - .then((result) => { - logger.debug(`Snapshot size: ${result.body.data.size}`); - resolve(); - }) - .catch(() => reject()); - }); -} - -function createNewBackup(name) { - return new Promise((resolve, reject) => { - let status = statusTools.getStatus(); - status.status = "creating"; - status.progress = -1; - statusTools.setStatus(status); - logger.info("Creating new snapshot..."); - getAddonToBackup().then((addons) => { - let folders = getFolderToBackup(); - let option = { - headers: { "authorization": `Bearer ${token}` }, - responseType: "json", - timeout: { - response: create_snap_timeout - }, - json: { - name: name, - addons: addons, - folders: folders - }, - }; - let password_protected = settingsTools.getSettings().password_protected; - logger.debug(`Is password protected ? ${password_protected}`) - if ( password_protected === "true") { - option.json.password = settingsTools.getSettings().password_protect_value - } - - got.post(`http://hassio/backups/new/partial`, option) - .then((result) => { - logger.info(`Snapshot created with id ${result.body.data.slug}`); - resolve(result.body.data.slug); - }) - .catch((error) => { - statusTools.setError(`Can't create new snapshot (${error.message})`, 5); - reject(`Can't create new snapshot (${error.message})`); - }); - - }).catch(reject); - - }); -} - -function clean() { - let limit = settingsTools.getSettings().auto_clean_local_keep; - if (limit == null) limit = 5; - return new Promise((resolve, reject) => { - getSnapshots() - .then(async (snaps) => { - if (snaps.length < limit) { - resolve(); - return; - } - snaps.sort((a, b) => { - return Date.parse(b.date) - Date.parse(a.date); - }); - let toDel = snaps.slice(limit); - for (let i of toDel) { - await dellSnap(i.slug); - } - logger.info("Local clean done."); - resolve(); - }) - .catch((e) => { - statusTools.setError(`Fail to clean backups (${e}) !`, 6); - reject(`Fail to clean backups (${e}) !`); - }); - }); -} - -function uploadSnapshot(path) { - return new Promise((resolve, reject) => { - let status = statusTools.getStatus(); - status.status = "upload-b"; - status.progress = 0; - status.message = null; - status.error_code = null; - statusTools.setStatus(status); - logger.info("Uploading backup..."); - let stream = fs.createReadStream(path); - let form = new FormData(); - form.append("file", stream); - - let options = { - body: form, - headers: { "authorization": `Bearer ${token}` }, - }; - - got.stream - .post(`http://hassio/backups/new/upload`, options) - .on("uploadProgress", (e) => { - let percent = e.percent; - if (status.progress !== percent) { - status.progress = percent; - statusTools.setStatus(status); - } - if (percent >= 1) { - logger.info("Upload done..."); - } - }) - .on("response", (res) => { - if (res.statusCode !== 200) { - status.status = "error"; - status.error_code = 4; - status.message = `Fail to upload backup to home assistant (Status code: ${res.statusCode})!`; - statusTools.setStatus(status); - logger.error(status.message); - fs.unlinkSync(path); - reject(status.message); - } else { - logger.info(`...Upload finish ! (status: ${res.statusCode})`); - status.status = "idle"; - status.progress = -1; - status.message = null; - status.error_code = null; - statusTools.setStatus(status); - fs.unlinkSync(path); - resolve(); - } - }) - .on("error", (err) => { - fs.unlinkSync(path); - statusTools.setError(`Fail to upload backup to home assistant (${err}) !`, 4); - reject(`Fail to upload backup to home assistant (${err}) !`); - }); - }); -} - -function stopAddons() { - return new Promise(((resolve, reject) => { - logger.info('Stopping addons...'); - let status = statusTools.getStatus(); - status.status = "stopping"; - status.progress = -1; - status.message = null; - status.error_code = null; - statusTools.setStatus(status); - let promises = []; - let option = { - headers: { "authorization": `Bearer ${token}` }, - responseType: "json", - }; - let addons_slug = settingsTools.getSettings().auto_stop_addon - for (let addon of addons_slug) { - if (addon !== "") { - logger.debug(`... Stopping addon ${addon}`); - promises.push(got.post(`http://hassio/addons/${addon}/stop`, option)); - } - - } - Promise.allSettled(promises).then(values => { - let error = null; - for (let val of values) - if (val.status === "rejected") - error = val.reason; - - if (error) { - statusTools.setError(`Fail to stop addons(${error}) !`, 8); - logger.error(status.message); - reject(status.message); - } else { - logger.info('... Ok'); - resolve(); - } - }); - })); -} - -function startAddons() { - return new Promise(((resolve, reject) => { - logger.info('Starting addons...'); - let status = statusTools.getStatus(); - status.status = "starting"; - status.progress = -1; - status.message = null; - status.error_code = null; - statusTools.setStatus(status); - let promises = []; - let option = { - headers: { "authorization": `Bearer ${token}` }, - responseType: "json", - }; - let addons_slug = settingsTools.getSettings().auto_stop_addon - for (let addon of addons_slug) { - if (addon !== "") { - logger.debug(`... Starting addon ${addon}`) - promises.push(got.post(`http://hassio/addons/${addon}/start`, option)); - } - } - Promise.allSettled(promises).then(values => { - let error = null; - for (let val of values) - if (val.status === "rejected") - error = val.reason; - - if (error) { - statusTools.setError(`Fail to start addons (${error}) !`, 9) - reject(status.message); - } else { - logger.info('... Ok') - status.status = "idle"; - status.progress = -1; - status.message = null; - status.error_code = null; - statusTools.setStatus(status); - resolve(); - } - }); - })); -} - -function publish_state(state) { - - // let data_error_sensor = { - // state: state.status == "error" ? "on" : "off", - // attributes: { - // friendly_name: "Nexcloud Backup Error", - // device_class: "problem", - // error_code: state.error_code, - // message: state.message, - // icon: state.status == "error" ? "mdi:cloud-alert" : "mdi:cloud-check" - // }, - // } - - - // let option = { - // headers: { "authorization": `Bearer ${token}` }, - // responseType: "json", - // json: data_error_sensor - // }; - // got.post(`http://hassio/core/api/states/binary_sensor.nextcloud_backup_error`, option) - // .then((result) => { - // logger.debug('Home assistant sensor updated (error status)'); - // }) - // .catch((error) => { - // logger.error(error); - // }); - - // let icon = "" - // switch(state.status){ - // case "error": - // icon = "mdi:cloud-alert"; - // break; - // case "download": - // case "download-b": - // icon = "mdi:cloud-download"; - // break; - // case "upload": - // case "upload-b": - // icon = "mdi:cloud-upload"; - // break; - // case "idle": - // icon = "mdi:cloud-check"; - // break; - // default: - // icon = "mdi:cloud-sync"; - // break; - // } - - // let data_state_sensor = { - // state: state.status, - // attributes: { - // friendly_name: "Nexcloud Backup Status", - // error_code: state.error_code, - // message: state.message, - // icon: icon, - // last_backup: state.last_backup == null || state.last_backup == "" ? "" : new Date(state.last_backup).toISOString(), - // next_backup: state.next_backup == null || state.next_backup == "" ? "" : new Date(state.next_backup).toISOString() - // }, - // } - // option.json = data_state_sensor - // got.post(`http://hassio/core/api/states/sensor.nextcloud_backup_status`, option) - // .then((result) => { - // logger.debug('Home assistant sensor updated (status)'); - // }) - // .catch((error) => { - // logger.error(error); - // }); -} - -export { - getVersion, - getAddonList, - getFolderList, - getSnapshots, - downloadSnapshot, - createNewBackup, - uploadSnapshot, - stopAddons, - startAddons, - clean, - publish_state -} diff --git a/nextcloud_backup/rootfs/opt/nextcloud_backup/tools/webdavTools.js b/nextcloud_backup/rootfs/opt/nextcloud_backup/tools/webdavTools.js deleted file mode 100644 index 6e1105a..0000000 --- a/nextcloud_backup/rootfs/opt/nextcloud_backup/tools/webdavTools.js +++ /dev/null @@ -1,427 +0,0 @@ -import { createClient } from "webdav"; -import fs from "fs" -import https from "https" -import path from "path"; -import got from "got"; -import stream from "stream"; -import { promisify } from "util"; - -import * as statusTools from "../tools/status.js" -import * as settingsTools from "../tools/settingsTools.js" -import * as pathTools from "../tools/pathTools.js" -import * as hassioApiTools from "../tools/hassioApiTools.js" -import logger from "../config/winston.js" -import {DateTime} from "luxon"; - -const endpoint = "/remote.php/webdav"; -const configPath = "/data/webdav_conf.json"; - -const pipeline = promisify(stream.pipeline); - -class WebdavTools { - constructor() { - this.host = null; - this.client = null; - this.baseUrl = null; - this.username = null; - this.password = null; - } - - init(ssl, host, username, password, accept_selfsigned_cert) { - return new Promise((resolve, reject) => { - this.host = host; - let status = statusTools.getStatus(); - logger.info("Initializing and checking webdav client..."); - this.baseUrl = (ssl === "true" ? "https" : "http") + "://" + host + endpoint; - this.username = username; - this.password = password; - let agent_option = ssl === "true" ? { rejectUnauthorized: accept_selfsigned_cert === "false" } : {}; - try { - this.client = createClient(this.baseUrl, { - username: username, - password: password, - httpsAgent: new https.Agent(agent_option) - }); - - this.client - .getDirectoryContents("/") - .then(() => { - if (status.error_code === 3) { - status.status = "idle"; - status.message = null; - status.error_code = null; - statusTools.setStatus(status); - } - logger.debug("Nextcloud connection: \x1b[32mSuccess !\x1b[0m"); - this.initFolder().then(() => { - resolve(); - }); - }) - .catch((error) => { - this.__cant_connect_status(error); - this.client = null; - reject("Can't connect to Nextcloud (" + error + ") !"); - }); - } catch (err) { - this.__cant_connect_status(err); - this.client = null; - reject("Can't connect to Nextcloud (" + err + ") !"); - } - }); - } - __cant_connect_status(err){ - statusTools.setError(`Can't connect to Nextcloud (${err})`, 3); - } - - async __createRoot() { - let root_splited = this.getConf().back_dir.split("/").splice(1); - let path = "/"; - for (let elem of root_splited) { - if (elem !== "") { - path = path + elem + "/"; - try { - await this.client.createDirectory(path); - logger.debug(`Path ${path} created.`); - } catch (error) { - if (error.status === 405) logger.debug(`Path ${path} already exist.`); - else logger.error(error); - } - } - } - } - - initFolder() { - return new Promise((resolve) => { - this.__createRoot().catch((err) => { - logger.error(err); - }).then(() => { - this.client.createDirectory(this.getConf().back_dir + pathTools.auto) - .catch(() => { - }) - .then(() => { - this.client - .createDirectory(this.getConf().back_dir + pathTools.manual) - .catch(() => { - }) - .then(() => { - resolve(); - }); - }); - }); - }); - } - - /** - * Check if theh webdav config is valid, if yes, start init of webdav client - */ - confIsValid() { - return new Promise((resolve, reject) => { - let status = statusTools.getStatus(); - let conf = this.getConf(); - if (conf !== null) { - if (conf.ssl !== null && conf.host !== null && conf.username !== null && conf.password !== null) { - if (status.error_code === 2) { - status.status = "idle"; - status.message = null; - status.error_code = null; - statusTools.setStatus(status); - } - // Check if self_signed option exist - if (conf.self_signed == null || conf.self_signed === "") { - conf.self_signed = "false"; - this.setConf(conf); - } - this.init(conf.ssl, conf.host, conf.username, conf.password, conf.self_signed) - .then(() => { - resolve(); - }) - .catch((err) => { - reject(err); - }); - } else { - status.status = "error"; - status.error_code = 2; - status.message = "Nextcloud config invalid !"; - statusTools.setStatus(status); - logger.error(status.message); - reject("Nextcloud config invalid !"); - } - - if (conf.back_dir == null || conf.back_dir === "") { - logger.info("Backup dir is null, initializing it."); - conf.back_dir = pathTools.default_root; - this.setConf(conf); - } else { - if (!conf.back_dir.startsWith("/")) { - logger.warn("Backup dir not starting with '/', fixing this..."); - conf.back_dir = `/${conf.back_dir}`; - this.setConf(conf); - } - if (!conf.back_dir.endsWith("/")) { - logger.warn("Backup dir not ending with '/', fixing this..."); - conf.back_dir = `${conf.back_dir}/`; - this.setConf(conf); - } - } - } else { - status.status = "error"; - status.error_code = 2; - status.message = "Nextcloud config not found !"; - statusTools.setStatus(status); - logger.error(status.message); - reject("Nextcloud config not found !"); - } - }); - } - - getConf() { - if (fs.existsSync(configPath)) { - return JSON.parse(fs.readFileSync(configPath).toString()); - } else - return null; - } - - setConf(conf) { - fs.writeFileSync(configPath, JSON.stringify(conf)); - } - - uploadFile(id, path) { - return new Promise((resolve, reject) => { - if (this.client == null) { - this.confIsValid() - .then(() => { - this._startUpload(id, path) - .then(()=> resolve()) - .catch((err) => reject(err)); - }) - .catch((err) => { - reject(err); - }); - } else - this._startUpload(id, path) - .then(()=> resolve()) - .catch((err) => reject(err)); - }); - } - - _startUpload(id, path) { - return new Promise((resolve, reject) => { - let status = statusTools.getStatus(); - status.status = "upload"; - status.progress = 0; - status.message = null; - status.error_code = null; - statusTools.setStatus(status); - logger.info("Uploading snap..."); - let tmpFile = `./temp/${id}.tar`; - let stats = fs.statSync(tmpFile); - let stream = fs.createReadStream(tmpFile); - let conf = this.getConf(); - let options = { - body: stream, - // username: this.username, - // password: encodeURIComponent(this.password), - headers: { - 'authorization': 'Basic ' + Buffer.from(this.username + ':' + this.password).toString('base64'), - 'content-length': String(stats.size) - } - }; - if (conf.ssl === "true") { - options["https"] = { rejectUnauthorized: conf.self_signed === "false" }; - } - logger.debug(`...URI: ${encodeURI(this.baseUrl.replace(this.host, 'host.hiden') + path)}`); - if (conf.ssl === "true") - logger.debug(`...rejectUnauthorized: ${options["https"]["rejectUnauthorized"]}`); - - got.stream - .put(encodeURI(this.baseUrl + path), options) - .on("uploadProgress", (e) => { - let percent = e.percent; - if (status.progress !== percent) { - status.progress = percent; - statusTools.setStatus(status); - } - if (percent >= 1) { - logger.info("Upload done..."); - } - }) - .on("response", (res) => { - if (res.statusCode !== 201 && res.statusCode !== 204) { - status.status = "error"; - status.error_code = 4; - status.message = `Fail to upload snapshot to nextcloud (Status code: ${res.statusCode})!`; - statusTools.setStatus(status); - logger.error(status.message); - fs.unlinkSync(tmpFile); - reject(status.message); - } else { - logger.info(`...Upload finish ! (status: ${res.statusCode})`); - status.status = "idle"; - status.progress = -1; - status.message = null; - status.error_code = null; - status.last_backup = DateTime.now().toFormat("dd MMM yyyy, HH:mm") - statusTools.setStatus(status); - cleanTempFolder(); - let autoCleanCloud = settingsTools.getSettings().auto_clean_backup; - if (autoCleanCloud != null && autoCleanCloud === "true") { - this.clean().catch(); - } - let autoCleanlocal = settingsTools.getSettings().auto_clean_local; - if (autoCleanlocal != null && autoCleanlocal === "true") { - hassioApiTools.clean().catch(); - } - resolve(); - } - }) - .on("error", (err) => { - fs.unlinkSync(tmpFile); - status.status = "error"; - status.error_code = 4; - status.message = `Fail to upload snapshot to nextcloud (${err}) !`; - statusTools.setStatus(status); - logger.error(status.message); - logger.error(err.stack); - reject(status.message); - }); - }); - } - - downloadFile(path) { - return new Promise((resolve, reject) => { - if (this.client == null) { - this.confIsValid() - .then(() => { - this._startDownload(path) - .then((path) => resolve(path)) - .catch(() => reject()); - }) - .catch((err) => { - reject(err); - }); - } else - this._startDownload(path) - .then((path) => resolve(path)) - .catch(() => reject()); - }); - } - - _startDownload(path) { - return new Promise((resolve, reject) => { - let status = statusTools.getStatus(); - status.status = "download-b"; - status.progress = 0; - status.message = null; - status.error_code = null; - statusTools.setStatus(status); - - logger.info("Downloading backup..."); - if (!fs.existsSync("./temp/")) - fs.mkdirSync("./temp/"); - let tmpFile = `./temp/restore_${DateTime.now().toFormat("MMM-dd-yyyy_HH_mm")}.tar`; - let stream = fs.createWriteStream(tmpFile); - let conf = this.getConf(); - let options = { - headers: { - 'authorization': 'Basic ' + Buffer.from(this.username + ':' + this.password).toString('base64') - } - }; - if (conf.ssl === "true") { - options["https"] = { rejectUnauthorized: conf.self_signed === "false" }; - } - logger.debug(`...URI: ${encodeURI(this.baseUrl.replace(this.host, 'host.hiden') + path)}`); - if (conf.ssl === "true") - logger.debug(`...rejectUnauthorized: ${options["https"]["rejectUnauthorized"]}`); - pipeline( - got.stream.get(encodeURI(this.baseUrl + path), options) - .on("downloadProgress", (e) => { - let percent = Math.round(e.percent * 100) / 100; - if (status.progress !== percent) { - status.progress = percent; - statusTools.setStatus(status); - } - }), - stream - ).then((res) => { - logger.info("Download success !"); - status.progress = 1; - statusTools.setStatus(status); - logger.debug("Backup dl size : " + fs.statSync(tmpFile).size / 1024 / 1024); - resolve(tmpFile); - }).catch((err) => { - if (fs.existsSync(tmpFile)) fs.unlinkSync(tmpFile); - status.status = "error"; - status.message = "Fail to download Hassio snapshot (" + err.message + ")"; - status.error_code = 7; - statusTools.setStatus(status); - logger.error(status.message); - logger.error(err.stack); - reject(err.message); - }); - }); - } - - getFolderContent(path) { - return new Promise((resolve, reject) => { - if (this.client == null) { - reject(); - return; - } - this.client - .getDirectoryContents(path) - .then((contents) => resolve(contents)) - .catch((error) => reject(error)); - }); - } - - clean() { - let limit = settingsTools.getSettings().auto_clean_backup_keep; - if (limit == null) limit = 5; - return new Promise((resolve, reject) => { - this.getFolderContent(this.getConf().back_dir + pathTools.auto) - .then(async (contents) => { - - if (contents.length < limit) { - resolve(); - return; - } - contents.sort((a, b) => { - return Date.parse(b.lastmod) - Date.parse(a.lastmod) - }); - - let toDel = contents.slice(limit); - for (let i in toDel) { - await this.client.deleteFile(toDel[i].filename); - } - logger.info("Cloud clean done."); - resolve(); - }) - .catch((error) => { - let status = statusTools.getStatus(); - status.status = "error"; - status.error_code = 6; - status.message = "Fail to clean Nexcloud (" + error + ") !"; - statusTools.setStatus(status); - logger.error(status.message); - reject(status.message); - }); - }); - } -} - -function cleanTempFolder() { - fs.readdir("./temp/", (err, files) => { - if (err) - throw err; - - for (const file of files) { - fs.unlink(path.join("./temp/", file), (err) => { - if (err) - throw err; - }); - } - }); -} - -const INSTANCE = new WebdavTools(); -export default INSTANCE; diff --git a/nextcloud_backup/rootfs/opt/nextcloud_backup/views/modals/nextcloud-settings-modal.ejs b/nextcloud_backup/rootfs/opt/nextcloud_backup/views/modals/nextcloud-settings-modal.ejs deleted file mode 100644 index c1b73c2..0000000 --- a/nextcloud_backup/rootfs/opt/nextcloud_backup/views/modals/nextcloud-settings-modal.ejs +++ /dev/null @@ -1,73 +0,0 @@ - diff --git a/nextcloud_backup/rootfs/opt/nextcloud_backup/yarn.lock b/nextcloud_backup/rootfs/opt/nextcloud_backup/yarn.lock deleted file mode 100644 index d6af4a4..0000000 --- a/nextcloud_backup/rootfs/opt/nextcloud_backup/yarn.lock +++ /dev/null @@ -1,1554 +0,0 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - -__metadata: - version: 6 - cacheKey: 8 - -"@colors/colors@npm:1.5.0": - version: 1.5.0 - resolution: "@colors/colors@npm:1.5.0" - checksum: d64d5260bed1d5012ae3fc617d38d1afc0329fec05342f4e6b838f46998855ba56e0a73833f4a80fa8378c84810da254f76a8a19c39d038260dc06dc4e007425 - languageName: node - linkType: hard - -"@dabh/diagnostics@npm:^2.0.2": - version: 2.0.3 - resolution: "@dabh/diagnostics@npm:2.0.3" - dependencies: - colorspace: 1.1.x - enabled: 2.0.x - kuler: ^2.0.0 - checksum: 4879600c55c8315a0fb85fbb19057bad1adc08f0a080a8cb4e2b63f723c379bfc4283b68123a2b078d367b327dd8df12fcb27464efe791addc0a48b9df6d79a1 - languageName: node - linkType: hard - -"@fortawesome/fontawesome-free@npm:6.1.2": - version: 6.1.2 - resolution: "@fortawesome/fontawesome-free@npm:6.1.2" - checksum: 0d3c9d60ffbb9c1fa4041051eff6542adc1fc29653501399d0235c077a2195a35f286d979da42fe021f73649032f9eeae2c9a0511eaacda2896559155d40a0fc - languageName: node - linkType: hard - -"@sindresorhus/is@npm:^5.2.0": - version: 5.3.0 - resolution: "@sindresorhus/is@npm:5.3.0" - checksum: b31cebabcdece3d5322de2a4dbc8c0f004e04147a00f2606787bcaf5655ad4b1954f6727fc6914c524009b2b9a2cc01c42835b55f651ce69fd2a0083b60bb852 - languageName: node - linkType: hard - -"@szmarczak/http-timer@npm:^5.0.1": - version: 5.0.1 - resolution: "@szmarczak/http-timer@npm:5.0.1" - dependencies: - defer-to-connect: ^2.0.1 - checksum: fc9cb993e808806692e4a3337c90ece0ec00c89f4b67e3652a356b89730da98bc824273a6d67ca84d5f33cd85f317dcd5ce39d8cc0a2f060145a608a7cb8ce92 - languageName: node - linkType: hard - -"@types/cacheable-request@npm:^6.0.2": - version: 6.0.2 - resolution: "@types/cacheable-request@npm:6.0.2" - dependencies: - "@types/http-cache-semantics": "*" - "@types/keyv": "*" - "@types/node": "*" - "@types/responselike": "*" - checksum: 667d25808dbf46fe104d6f029e0281ff56058d50c7c1b9182774b3e38bb9c1124f56e4c367ba54f92dbde2d1cc573f26eb0e9748710b2822bc0fd1e5498859c6 - languageName: node - linkType: hard - -"@types/http-cache-semantics@npm:*": - version: 4.0.1 - resolution: "@types/http-cache-semantics@npm:4.0.1" - checksum: 1048aacf627829f0d5f00184e16548205cd9f964bf0841c29b36bc504509230c40bc57c39778703a1c965a6f5b416ae2cbf4c1d4589c889d2838dd9dbfccf6e9 - languageName: node - linkType: hard - -"@types/json-buffer@npm:~3.0.0": - version: 3.0.0 - resolution: "@types/json-buffer@npm:3.0.0" - checksum: 6b0a371dd603f0eec9d00874574bae195382570e832560dadf2193ee0d1062b8e0694bbae9798bc758632361c227b1e3b19e3bd914043b498640470a2da38b77 - languageName: node - linkType: hard - -"@types/keyv@npm:*": - version: 3.1.4 - resolution: "@types/keyv@npm:3.1.4" - dependencies: - "@types/node": "*" - checksum: e009a2bfb50e90ca9b7c6e8f648f8464067271fd99116f881073fa6fa76dc8d0133181dd65e6614d5fb1220d671d67b0124aef7d97dc02d7e342ab143a47779d - languageName: node - linkType: hard - -"@types/node@npm:*": - version: 17.0.31 - resolution: "@types/node@npm:17.0.31" - checksum: 704618350f8420d5c47db0f7778398e821b7724369946f5c441a7e6b9343295553936400eb8309f0b07d5e39c240988ab3456b983712ca86265dabc9aee4ad3d - languageName: node - linkType: hard - -"@types/responselike@npm:*, @types/responselike@npm:^1.0.0": - version: 1.0.0 - resolution: "@types/responselike@npm:1.0.0" - dependencies: - "@types/node": "*" - checksum: e99fc7cc6265407987b30deda54c1c24bb1478803faf6037557a774b2f034c5b097ffd65847daa87e82a61a250d919f35c3588654b0fdaa816906650f596d1b0 - languageName: node - linkType: hard - -"accepts@npm:~1.3.8": - version: 1.3.8 - resolution: "accepts@npm:1.3.8" - dependencies: - mime-types: ~2.1.34 - negotiator: 0.6.3 - checksum: 50c43d32e7b50285ebe84b613ee4a3aa426715a7d131b65b786e2ead0fd76b6b60091b9916d3478a75f11f162628a2139991b6c03ab3f1d9ab7c86075dc8eab4 - languageName: node - linkType: hard - -"ansi-styles@npm:^4.1.0": - version: 4.3.0 - resolution: "ansi-styles@npm:4.3.0" - dependencies: - color-convert: ^2.0.1 - checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 - languageName: node - linkType: hard - -"app-root-path@npm:3.0.0": - version: 3.0.0 - resolution: "app-root-path@npm:3.0.0" - checksum: ff91a24db2b55070f6b3e22e72ce8fe8ea847e19eb8a3cbb267f9e9ac2a8372db65114dd6798a4ed7897a6f475b90a49330b3e53bf199d47e6abb5c5279aa1d7 - languageName: node - linkType: hard - -"array-flatten@npm:1.1.1": - version: 1.1.1 - resolution: "array-flatten@npm:1.1.1" - checksum: a9925bf3512d9dce202112965de90c222cd59a4fbfce68a0951d25d965cf44642931f40aac72309c41f12df19afa010ecadceb07cfff9ccc1621e99d89ab5f3b - languageName: node - linkType: hard - -"async@npm:^3.2.3": - version: 3.2.3 - resolution: "async@npm:3.2.3" - checksum: c4bee57ab2249af3dc83ca3ef9acfa8e822c0d5e5aa41bae3eaf7f673648343cd64ecd7d26091ffd357f3f044428b17b5f00098494b6cf8b6b3e9681f0636ca1 - languageName: node - linkType: hard - -"asynckit@npm:^0.4.0": - version: 0.4.0 - resolution: "asynckit@npm:0.4.0" - checksum: 7b78c451df768adba04e2d02e63e2d0bf3b07adcd6e42b4cf665cb7ce899bedd344c69a1dcbce355b5f972d597b25aaa1c1742b52cffd9caccb22f348114f6be - languageName: node - linkType: hard - -"axios@npm:^0.27.2": - version: 0.27.2 - resolution: "axios@npm:0.27.2" - dependencies: - follow-redirects: ^1.14.9 - form-data: ^4.0.0 - checksum: 38cb7540465fe8c4102850c4368053c21683af85c5fdf0ea619f9628abbcb59415d1e22ebc8a6390d2bbc9b58a9806c874f139767389c862ec9b772235f06854 - languageName: node - linkType: hard - -"balanced-match@npm:^1.0.0": - version: 1.0.2 - resolution: "balanced-match@npm:1.0.2" - checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 - languageName: node - linkType: hard - -"base-64@npm:^1.0.0": - version: 1.0.0 - resolution: "base-64@npm:1.0.0" - checksum: d10b64a1fc9b2c5a5f39f1ce1e6c9d1c5b249222bbfa3a0604c592d90623caf74419983feadd8a170f27dc0c3389704f72faafa3e645aeb56bfc030c93ff074a - languageName: node - linkType: hard - -"basic-auth@npm:~2.0.1": - version: 2.0.1 - resolution: "basic-auth@npm:2.0.1" - dependencies: - safe-buffer: 5.1.2 - checksum: 3419b805d5dfc518f3a05dcf42aa53aa9ce820e50b6df5097f9e186322e1bc733c36722b624802cd37e791035aa73b828ed814d8362333d42d7f5cd04d7a5e48 - languageName: node - linkType: hard - -"body-parser@npm:1.20.0": - version: 1.20.0 - resolution: "body-parser@npm:1.20.0" - dependencies: - bytes: 3.1.2 - content-type: ~1.0.4 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.10.3 - raw-body: 2.5.1 - type-is: ~1.6.18 - unpipe: 1.0.0 - checksum: 12fffdeac82fe20dddcab7074215d5156e7d02a69ae90cbe9fee1ca3efa2f28ef52097cbea76685ee0a1509c71d85abd0056a08e612c09077cad6277a644cf88 - languageName: node - linkType: hard - -"bootstrap@npm:5.1.3": - version: 5.1.3 - resolution: "bootstrap@npm:5.1.3" - peerDependencies: - "@popperjs/core": ^2.10.2 - checksum: 301b5ed872efba061104cf22ac93568e3837867fb5527ab9326a51510fb752bd4883e1d488225c8be72f86d9d3a55ef5b166aa7fa62c2fdd077c3f05b65752f8 - languageName: node - linkType: hard - -"brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" - dependencies: - balanced-match: ^1.0.0 - concat-map: 0.0.1 - checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 - languageName: node - linkType: hard - -"brace-expansion@npm:^2.0.1": - version: 2.0.1 - resolution: "brace-expansion@npm:2.0.1" - dependencies: - balanced-match: ^1.0.0 - checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 - languageName: node - linkType: hard - -"byte-length@npm:^1.0.2": - version: 1.0.2 - resolution: "byte-length@npm:1.0.2" - checksum: 69e2b00a14a81f675ea9946135c42ee1a1d9f689d5ba1327eb6700fcde2ccacbd09b42f7e514de1d2b763960251d8c790b3d7304a5a1a27b1457e34c129be8c7 - languageName: node - linkType: hard - -"bytes@npm:3.1.2": - version: 3.1.2 - resolution: "bytes@npm:3.1.2" - checksum: e4bcd3948d289c5127591fbedf10c0b639ccbf00243504e4e127374a15c3bc8eed0d28d4aaab08ff6f1cf2abc0cce6ba3085ed32f4f90e82a5683ce0014e1b6e - languageName: node - linkType: hard - -"cacheable-lookup@npm:^6.0.4": - version: 6.0.4 - resolution: "cacheable-lookup@npm:6.0.4" - checksum: 7aea70f5ea081aed12bf54fc165b9f80b580b0d210c85d55cc8fed2beaa9027fd321c1939c65dad945fe9eb207cea45442e01a48b5aa57542e125b716f022b6d - languageName: node - linkType: hard - -"cacheable-request@npm:^7.0.2": - version: 7.0.2 - resolution: "cacheable-request@npm:7.0.2" - dependencies: - clone-response: ^1.0.2 - get-stream: ^5.1.0 - http-cache-semantics: ^4.0.0 - keyv: ^4.0.0 - lowercase-keys: ^2.0.0 - normalize-url: ^6.0.1 - responselike: ^2.0.0 - checksum: 6152813982945a5c9989cb457a6c499f12edcc7ade323d2fbfd759abc860bdbd1306e08096916bb413c3c47e812f8e4c0a0cc1e112c8ce94381a960f115bc77f - languageName: node - linkType: hard - -"call-bind@npm:^1.0.0": - version: 1.0.2 - resolution: "call-bind@npm:1.0.2" - dependencies: - function-bind: ^1.1.1 - get-intrinsic: ^1.0.2 - checksum: f8e31de9d19988a4b80f3e704788c4a2d6b6f3d17cfec4f57dc29ced450c53a49270dc66bf0fbd693329ee948dd33e6c90a329519aef17474a4d961e8d6426b0 - languageName: node - linkType: hard - -"chalk@npm:^4.0.2": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" - dependencies: - ansi-styles: ^4.1.0 - supports-color: ^7.1.0 - checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc - languageName: node - linkType: hard - -"charenc@npm:0.0.2": - version: 0.0.2 - resolution: "charenc@npm:0.0.2" - checksum: 81dcadbe57e861d527faf6dd3855dc857395a1c4d6781f4847288ab23cffb7b3ee80d57c15bba7252ffe3e5e8019db767757ee7975663ad2ca0939bb8fcaf2e5 - languageName: node - linkType: hard - -"clone-response@npm:^1.0.2": - version: 1.0.2 - resolution: "clone-response@npm:1.0.2" - dependencies: - mimic-response: ^1.0.0 - checksum: 2d0e61547fc66276e0903be9654ada422515f5a15741691352000d47e8c00c226061221074ce2c0064d12e975e84a8687cfd35d8b405750cb4e772f87b256eda - languageName: node - linkType: hard - -"color-convert@npm:^1.9.3": - version: 1.9.3 - resolution: "color-convert@npm:1.9.3" - dependencies: - color-name: 1.1.3 - checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 - languageName: node - linkType: hard - -"color-convert@npm:^2.0.1": - version: 2.0.1 - resolution: "color-convert@npm:2.0.1" - dependencies: - color-name: ~1.1.4 - checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 - languageName: node - linkType: hard - -"color-name@npm:1.1.3": - version: 1.1.3 - resolution: "color-name@npm:1.1.3" - checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d - languageName: node - linkType: hard - -"color-name@npm:^1.0.0, color-name@npm:~1.1.4": - version: 1.1.4 - resolution: "color-name@npm:1.1.4" - checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 - languageName: node - linkType: hard - -"color-string@npm:^1.6.0": - version: 1.9.1 - resolution: "color-string@npm:1.9.1" - dependencies: - color-name: ^1.0.0 - simple-swizzle: ^0.2.2 - checksum: c13fe7cff7885f603f49105827d621ce87f4571d78ba28ef4a3f1a104304748f620615e6bf065ecd2145d0d9dad83a3553f52bb25ede7239d18e9f81622f1cc5 - languageName: node - linkType: hard - -"color@npm:^3.1.3": - version: 3.2.1 - resolution: "color@npm:3.2.1" - dependencies: - color-convert: ^1.9.3 - color-string: ^1.6.0 - checksum: f81220e8b774d35865c2561be921f5652117638dcda7ca4029262046e37fc2444ac7bbfdd110cf1fd9c074a4ee5eda8f85944ffbdda26186b602dd9bb05f6400 - languageName: node - linkType: hard - -"colorspace@npm:1.1.x": - version: 1.1.4 - resolution: "colorspace@npm:1.1.4" - dependencies: - color: ^3.1.3 - text-hex: 1.0.x - checksum: bb3934ef3c417e961e6d03d7ca60ea6e175947029bfadfcdb65109b01881a1c0ecf9c2b0b59abcd0ee4a0d7c1eae93beed01b0e65848936472270a0b341ebce8 - languageName: node - linkType: hard - -"combined-stream@npm:^1.0.8": - version: 1.0.8 - resolution: "combined-stream@npm:1.0.8" - dependencies: - delayed-stream: ~1.0.0 - checksum: 49fa4aeb4916567e33ea81d088f6584749fc90c7abec76fd516bf1c5aa5c79f3584b5ba3de6b86d26ddd64bae5329c4c7479343250cfe71c75bb366eae53bb7c - languageName: node - linkType: hard - -"compress-brotli@npm:^1.3.6": - version: 1.3.6 - resolution: "compress-brotli@npm:1.3.6" - dependencies: - "@types/json-buffer": ~3.0.0 - json-buffer: ~3.0.1 - checksum: 9db8e082a3286bd6a0da2b6b2929c62a827c5a1bee8f0d1c777cccfcef14c9e751d93ae46329f1529bfbfab9b6f241465e3a1c895be235c6e923f5017d952d00 - languageName: node - linkType: hard - -"concat-map@npm:0.0.1": - version: 0.0.1 - resolution: "concat-map@npm:0.0.1" - checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af - languageName: node - linkType: hard - -"content-disposition@npm:0.5.4": - version: 0.5.4 - resolution: "content-disposition@npm:0.5.4" - dependencies: - safe-buffer: 5.2.1 - checksum: afb9d545e296a5171d7574fcad634b2fdf698875f4006a9dd04a3e1333880c5c0c98d47b560d01216fb6505a54a2ba6a843ee3a02ec86d7e911e8315255f56c3 - languageName: node - linkType: hard - -"content-type@npm:~1.0.4": - version: 1.0.4 - resolution: "content-type@npm:1.0.4" - checksum: 3d93585fda985d1554eca5ebd251994327608d2e200978fdbfba21c0c679914d5faf266d17027de44b34a72c7b0745b18584ecccaa7e1fdfb6a68ac7114f12e0 - languageName: node - linkType: hard - -"cookie-parser@npm:1.4.6": - version: 1.4.6 - resolution: "cookie-parser@npm:1.4.6" - dependencies: - cookie: 0.4.1 - cookie-signature: 1.0.6 - checksum: 1e5a63aa82e8eb4e02d2977c6902983dee87b02e87ec5ec43ac3cb1e72da354003716570cd5190c0ad9e8a454c9d3237f4ad6e2f16d0902205a96a1c72b77ba5 - languageName: node - linkType: hard - -"cookie-signature@npm:1.0.6": - version: 1.0.6 - resolution: "cookie-signature@npm:1.0.6" - checksum: f4e1b0a98a27a0e6e66fd7ea4e4e9d8e038f624058371bf4499cfcd8f3980be9a121486995202ba3fca74fbed93a407d6d54d43a43f96fd28d0bd7a06761591a - languageName: node - linkType: hard - -"cookie@npm:0.4.1": - version: 0.4.1 - resolution: "cookie@npm:0.4.1" - checksum: bd7c47f5d94ab70ccdfe8210cde7d725880d2fcda06d8e375afbdd82de0c8d3b73541996e9ce57d35f67f672c4ee6d60208adec06b3c5fc94cebb85196084cf8 - languageName: node - linkType: hard - -"cookie@npm:0.5.0": - version: 0.5.0 - resolution: "cookie@npm:0.5.0" - checksum: 1f4bd2ca5765f8c9689a7e8954183f5332139eb72b6ff783d8947032ec1fdf43109852c178e21a953a30c0dd42257828185be01b49d1eb1a67fd054ca588a180 - languageName: node - linkType: hard - -"cron@npm:2.1.0": - version: 2.1.0 - resolution: "cron@npm:2.1.0" - dependencies: - luxon: ^1.23.x - checksum: 9395875c091f56db7964491c249cb143d2e4ba77560d7132da783943c1b0537ef1814eb8f552c81eda5a2aa153216dd3f5b7ff63e372a68a063fcfafe8231f91 - languageName: node - linkType: hard - -"crypt@npm:0.0.2": - version: 0.0.2 - resolution: "crypt@npm:0.0.2" - checksum: baf4c7bbe05df656ec230018af8cf7dbe8c14b36b98726939cef008d473f6fe7a4fad906cfea4062c93af516f1550a3f43ceb4d6615329612c6511378ed9fe34 - languageName: node - linkType: hard - -"debug@npm:2.6.9": - version: 2.6.9 - resolution: "debug@npm:2.6.9" - dependencies: - ms: 2.0.0 - checksum: d2f51589ca66df60bf36e1fa6e4386b318c3f1e06772280eea5b1ae9fd3d05e9c2b7fd8a7d862457d00853c75b00451aa2d7459b924629ee385287a650f58fe6 - languageName: node - linkType: hard - -"debug@npm:4.3.4": - version: 4.3.4 - resolution: "debug@npm:4.3.4" - dependencies: - ms: 2.1.2 - peerDependenciesMeta: - supports-color: - optional: true - checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 - languageName: node - linkType: hard - -"decompress-response@npm:^6.0.0": - version: 6.0.0 - resolution: "decompress-response@npm:6.0.0" - dependencies: - mimic-response: ^3.1.0 - checksum: d377cf47e02d805e283866c3f50d3d21578b779731e8c5072d6ce8c13cc31493db1c2f6784da9d1d5250822120cefa44f1deab112d5981015f2e17444b763812 - languageName: node - linkType: hard - -"defer-to-connect@npm:^2.0.1": - version: 2.0.1 - resolution: "defer-to-connect@npm:2.0.1" - checksum: 8a9b50d2f25446c0bfefb55a48e90afd58f85b21bcf78e9207cd7b804354f6409032a1705c2491686e202e64fc05f147aa5aa45f9aa82627563f045937f5791b - languageName: node - linkType: hard - -"delayed-stream@npm:~1.0.0": - version: 1.0.0 - resolution: "delayed-stream@npm:1.0.0" - checksum: 46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020 - languageName: node - linkType: hard - -"depd@npm:2.0.0, depd@npm:~2.0.0": - version: 2.0.0 - resolution: "depd@npm:2.0.0" - checksum: abbe19c768c97ee2eed6282d8ce3031126662252c58d711f646921c9623f9052e3e1906443066beec1095832f534e57c523b7333f8e7e0d93051ab6baef5ab3a - languageName: node - linkType: hard - -"destroy@npm:1.2.0": - version: 1.2.0 - resolution: "destroy@npm:1.2.0" - checksum: 0acb300b7478a08b92d810ab229d5afe0d2f4399272045ab22affa0d99dbaf12637659411530a6fcd597a9bdac718fc94373a61a95b4651bbc7b83684a565e38 - languageName: node - linkType: hard - -"ee-first@npm:1.1.1": - version: 1.1.1 - resolution: "ee-first@npm:1.1.1" - checksum: 1b4cac778d64ce3b582a7e26b218afe07e207a0f9bfe13cc7395a6d307849cfe361e65033c3251e00c27dd060cab43014c2d6b2647676135e18b77d2d05b3f4f - languageName: node - linkType: hard - -"ejs@npm:3.1.8": - version: 3.1.8 - resolution: "ejs@npm:3.1.8" - dependencies: - jake: ^10.8.5 - bin: - ejs: bin/cli.js - checksum: 1d40d198ad52e315ccf37e577bdec06e24eefdc4e3c27aafa47751a03a0c7f0ec4310254c9277a5f14763c3cd4bbacce27497332b2d87c74232b9b1defef8efc - languageName: node - linkType: hard - -"enabled@npm:2.0.x": - version: 2.0.0 - resolution: "enabled@npm:2.0.0" - checksum: 9d256d89f4e8a46ff988c6a79b22fa814b4ffd82826c4fdacd9b42e9b9465709d3b748866d0ab4d442dfc6002d81de7f7b384146ccd1681f6a7f868d2acca063 - languageName: node - linkType: hard - -"encodeurl@npm:~1.0.2": - version: 1.0.2 - resolution: "encodeurl@npm:1.0.2" - checksum: e50e3d508cdd9c4565ba72d2012e65038e5d71bdc9198cb125beb6237b5b1ade6c0d343998da9e170fb2eae52c1bed37d4d6d98a46ea423a0cddbed5ac3f780c - languageName: node - linkType: hard - -"end-of-stream@npm:^1.1.0": - version: 1.4.4 - resolution: "end-of-stream@npm:1.4.4" - dependencies: - once: ^1.4.0 - checksum: 530a5a5a1e517e962854a31693dbb5c0b2fc40b46dad2a56a2deec656ca040631124f4795823acc68238147805f8b021abbe221f4afed5ef3c8e8efc2024908b - languageName: node - linkType: hard - -"escape-html@npm:~1.0.3": - version: 1.0.3 - resolution: "escape-html@npm:1.0.3" - checksum: 6213ca9ae00d0ab8bccb6d8d4e0a98e76237b2410302cf7df70aaa6591d509a2a37ce8998008cbecae8fc8ffaadf3fb0229535e6a145f3ce0b211d060decbb24 - languageName: node - linkType: hard - -"etag@npm:~1.8.1": - version: 1.8.1 - resolution: "etag@npm:1.8.1" - checksum: 571aeb3dbe0f2bbd4e4fadbdb44f325fc75335cd5f6f6b6a091e6a06a9f25ed5392f0863c5442acb0646787446e816f13cbfc6edce5b07658541dff573cab1ff - languageName: node - linkType: hard - -"express@npm:4.18.1": - version: 4.18.1 - resolution: "express@npm:4.18.1" - dependencies: - accepts: ~1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.0 - content-disposition: 0.5.4 - content-type: ~1.0.4 - cookie: 0.5.0 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: ~1.0.2 - escape-html: ~1.0.3 - etag: ~1.8.1 - finalhandler: 1.2.0 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 - methods: ~1.1.2 - on-finished: 2.4.1 - parseurl: ~1.3.3 - path-to-regexp: 0.1.7 - proxy-addr: ~2.0.7 - qs: 6.10.3 - range-parser: ~1.2.1 - safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: ~1.6.18 - utils-merge: 1.0.1 - vary: ~1.1.2 - checksum: c3d44c92e48226ef32ec978becfedb0ecf0ca21316bfd33674b3c5d20459840584f2325726a4f17f33d9c99f769636f728982d1c5433a5b6fe6eb95b8cf0c854 - languageName: node - linkType: hard - -"fast-xml-parser@npm:^3.19.0": - version: 3.21.1 - resolution: "fast-xml-parser@npm:3.21.1" - dependencies: - strnum: ^1.0.4 - bin: - xml2js: cli.js - checksum: 73b9c907a424cc2f9b11a8a2f1b7448d936f1db6fa574b85cbe4be9739c2f77d99a827bb27d738a0db0047b20c71a5d663f64937fbdb9c38977fc6cd145221d2 - languageName: node - linkType: hard - -"fecha@npm:^4.2.0": - version: 4.2.3 - resolution: "fecha@npm:4.2.3" - checksum: f94e2fb3acf5a7754165d04549460d3ae6c34830394d20c552197e3e000035d69732d74af04b9bed3283bf29fe2a9ebdcc0085e640b0be3cc3658b9726265e31 - languageName: node - linkType: hard - -"filelist@npm:^1.0.1": - version: 1.0.3 - resolution: "filelist@npm:1.0.3" - dependencies: - minimatch: ^5.0.1 - checksum: c78048691a31b91d54908ce2eac4731bf108613c7b2e4d1a05a6cbe6739bd067e4c1a3baa4f7d07b7143b8c374c0c0d59864b5c8d9168ec8e2a85f84fb7170ad - languageName: node - linkType: hard - -"finalhandler@npm:1.2.0": - version: 1.2.0 - resolution: "finalhandler@npm:1.2.0" - dependencies: - debug: 2.6.9 - encodeurl: ~1.0.2 - escape-html: ~1.0.3 - on-finished: 2.4.1 - parseurl: ~1.3.3 - statuses: 2.0.1 - unpipe: ~1.0.0 - checksum: 92effbfd32e22a7dff2994acedbd9bcc3aa646a3e919ea6a53238090e87097f8ef07cced90aa2cc421abdf993aefbdd5b00104d55c7c5479a8d00ed105b45716 - languageName: node - linkType: hard - -"fn.name@npm:1.x.x": - version: 1.1.0 - resolution: "fn.name@npm:1.1.0" - checksum: e357144f48cfc9a7f52a82bbc6c23df7c8de639fce049cac41d41d62cabb740cdb9f14eddc6485e29c933104455bdd7a69bb14a9012cef9cd4fa252a4d0cf293 - languageName: node - linkType: hard - -"follow-redirects@npm:^1.14.9": - version: 1.15.1 - resolution: "follow-redirects@npm:1.15.1" - peerDependenciesMeta: - debug: - optional: true - checksum: 6aa4e3e3cdfa3b9314801a1cd192ba756a53479d9d8cca65bf4db3a3e8834e62139245cd2f9566147c8dfe2efff1700d3e6aefd103de4004a7b99985e71dd533 - languageName: node - linkType: hard - -"form-data-encoder@npm:^2.0.1": - version: 2.0.1 - resolution: "form-data-encoder@npm:2.0.1" - checksum: 66a8dd84d7fcbab5fdaec9382f29e26a12b625d491ddfd267c7c7b0bf5b41b142c51826d4b89155fa975c09ea32b67000b6d01074410d57d6a7adee7405754c0 - languageName: node - linkType: hard - -"form-data@npm:4.0.0, form-data@npm:^4.0.0": - version: 4.0.0 - resolution: "form-data@npm:4.0.0" - dependencies: - asynckit: ^0.4.0 - combined-stream: ^1.0.8 - mime-types: ^2.1.12 - checksum: 01135bf8675f9d5c61ff18e2e2932f719ca4de964e3be90ef4c36aacfc7b9cb2fceb5eca0b7e0190e3383fe51c5b37f4cb80b62ca06a99aaabfcfd6ac7c9328c - languageName: node - linkType: hard - -"forwarded@npm:0.2.0": - version: 0.2.0 - resolution: "forwarded@npm:0.2.0" - checksum: fd27e2394d8887ebd16a66ffc889dc983fbbd797d5d3f01087c020283c0f019a7d05ee85669383d8e0d216b116d720fc0cef2f6e9b7eb9f4c90c6e0bc7fd28e6 - languageName: node - linkType: hard - -"fresh@npm:0.5.2": - version: 0.5.2 - resolution: "fresh@npm:0.5.2" - checksum: 13ea8b08f91e669a64e3ba3a20eb79d7ca5379a81f1ff7f4310d54e2320645503cc0c78daedc93dfb6191287295f6479544a649c64d8e41a1c0fb0c221552346 - languageName: node - linkType: hard - -"function-bind@npm:^1.1.1": - version: 1.1.1 - resolution: "function-bind@npm:1.1.1" - checksum: b32fbaebb3f8ec4969f033073b43f5c8befbb58f1a79e12f1d7490358150359ebd92f49e72ff0144f65f2c48ea2a605bff2d07965f548f6474fd8efd95bf361a - languageName: node - linkType: hard - -"get-intrinsic@npm:^1.0.2": - version: 1.1.1 - resolution: "get-intrinsic@npm:1.1.1" - dependencies: - function-bind: ^1.1.1 - has: ^1.0.3 - has-symbols: ^1.0.1 - checksum: a9fe2ca8fa3f07f9b0d30fb202bcd01f3d9b9b6b732452e79c48e79f7d6d8d003af3f9e38514250e3553fdc83c61650851cb6870832ac89deaaceb08e3721a17 - languageName: node - linkType: hard - -"get-stream@npm:^5.1.0": - version: 5.2.0 - resolution: "get-stream@npm:5.2.0" - dependencies: - pump: ^3.0.0 - checksum: 8bc1a23174a06b2b4ce600df38d6c98d2ef6d84e020c1ddad632ad75bac4e092eeb40e4c09e0761c35fc2dbc5e7fff5dab5e763a383582c4a167dd69a905bd12 - languageName: node - linkType: hard - -"get-stream@npm:^6.0.1": - version: 6.0.1 - resolution: "get-stream@npm:6.0.1" - checksum: e04ecece32c92eebf5b8c940f51468cd53554dcbb0ea725b2748be583c9523d00128137966afce410b9b051eb2ef16d657cd2b120ca8edafcf5a65e81af63cad - languageName: node - linkType: hard - -"got@npm:12.3.0": - version: 12.3.0 - resolution: "got@npm:12.3.0" - dependencies: - "@sindresorhus/is": ^5.2.0 - "@szmarczak/http-timer": ^5.0.1 - "@types/cacheable-request": ^6.0.2 - "@types/responselike": ^1.0.0 - cacheable-lookup: ^6.0.4 - cacheable-request: ^7.0.2 - decompress-response: ^6.0.0 - form-data-encoder: ^2.0.1 - get-stream: ^6.0.1 - http2-wrapper: ^2.1.10 - lowercase-keys: ^3.0.0 - p-cancelable: ^3.0.0 - responselike: ^2.0.0 - checksum: 3f2ec7a17d7fdd259a668888eb5ee6e6b7794ec466f1a7d3170697306e4838350515495c60879a3b4d6b228d2a42749fd43941bd876748671b9c04e37a7e34b5 - languageName: node - linkType: hard - -"has-flag@npm:^4.0.0": - version: 4.0.0 - resolution: "has-flag@npm:4.0.0" - checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad - languageName: node - linkType: hard - -"has-symbols@npm:^1.0.1": - version: 1.0.3 - resolution: "has-symbols@npm:1.0.3" - checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 - languageName: node - linkType: hard - -"has@npm:^1.0.3": - version: 1.0.3 - resolution: "has@npm:1.0.3" - dependencies: - function-bind: ^1.1.1 - checksum: b9ad53d53be4af90ce5d1c38331e712522417d017d5ef1ebd0507e07c2fbad8686fffb8e12ddecd4c39ca9b9b47431afbb975b8abf7f3c3b82c98e9aad052792 - languageName: node - linkType: hard - -"he@npm:^1.2.0": - version: 1.2.0 - resolution: "he@npm:1.2.0" - bin: - he: bin/he - checksum: 3d4d6babccccd79c5c5a3f929a68af33360d6445587d628087f39a965079d84f18ce9c3d3f917ee1e3978916fc833bb8b29377c3b403f919426f91bc6965e7a7 - languageName: node - linkType: hard - -"hot-patcher@npm:^0.5.0": - version: 0.5.0 - resolution: "hot-patcher@npm:0.5.0" - checksum: 07d1dfa658e36aa9105a42569f7d6a7461bc65570358f80612545e1a6d44cb06c8f07a7c6128fd4b7d214c363137fd524523b9dfe130daf4bc7cddb5d60e8839 - languageName: node - linkType: hard - -"http-cache-semantics@npm:^4.0.0": - version: 4.1.0 - resolution: "http-cache-semantics@npm:4.1.0" - checksum: 974de94a81c5474be07f269f9fd8383e92ebb5a448208223bfb39e172a9dbc26feff250192ecc23b9593b3f92098e010406b0f24bd4d588d631f80214648ed42 - languageName: node - linkType: hard - -"http-errors@npm:2.0.0": - version: 2.0.0 - resolution: "http-errors@npm:2.0.0" - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - checksum: 9b0a3782665c52ce9dc658a0d1560bcb0214ba5699e4ea15aefb2a496e2ca83db03ebc42e1cce4ac1f413e4e0d2d736a3fd755772c556a9a06853ba2a0b7d920 - languageName: node - linkType: hard - -"http2-wrapper@npm:^2.1.10": - version: 2.1.11 - resolution: "http2-wrapper@npm:2.1.11" - dependencies: - quick-lru: ^5.1.1 - resolve-alpn: ^1.2.0 - checksum: 5da05aa2c77226ac9cc82c616383f59c8f31b79897b02ecbe44b09714be1fca1f21bb184e672a669ca2830eefea4edac5f07e71c00cb5a8c5afec8e5a20cfaf7 - languageName: node - linkType: hard - -"iconv-lite@npm:0.4.24": - version: 0.4.24 - resolution: "iconv-lite@npm:0.4.24" - dependencies: - safer-buffer: ">= 2.1.2 < 3" - checksum: bd9f120f5a5b306f0bc0b9ae1edeb1577161503f5f8252a20f1a9e56ef8775c9959fd01c55f2d3a39d9a8abaf3e30c1abeb1895f367dcbbe0a8fd1c9ca01c4f6 - languageName: node - linkType: hard - -"inherits@npm:2.0.4, inherits@npm:^2.0.3": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 - languageName: node - linkType: hard - -"ipaddr.js@npm:1.9.1": - version: 1.9.1 - resolution: "ipaddr.js@npm:1.9.1" - checksum: f88d3825981486f5a1942414c8d77dd6674dd71c065adcfa46f578d677edcb99fda25af42675cb59db492fdf427b34a5abfcde3982da11a8fd83a500b41cfe77 - languageName: node - linkType: hard - -"is-arrayish@npm:^0.3.1": - version: 0.3.2 - resolution: "is-arrayish@npm:0.3.2" - checksum: 977e64f54d91c8f169b59afcd80ff19227e9f5c791fa28fa2e5bce355cbaf6c2c356711b734656e80c9dd4a854dd7efcf7894402f1031dfc5de5d620775b4d5f - languageName: node - linkType: hard - -"is-buffer@npm:~1.1.6": - version: 1.1.6 - resolution: "is-buffer@npm:1.1.6" - checksum: 4a186d995d8bbf9153b4bd9ff9fd04ae75068fe695d29025d25e592d9488911eeece84eefbd8fa41b8ddcc0711058a71d4c466dcf6f1f6e1d83830052d8ca707 - languageName: node - linkType: hard - -"is-stream@npm:^2.0.0": - version: 2.0.1 - resolution: "is-stream@npm:2.0.1" - checksum: b8e05ccdf96ac330ea83c12450304d4a591f9958c11fd17bed240af8d5ffe08aedafa4c0f4cfccd4d28dc9d4d129daca1023633d5c11601a6cbc77521f6fae66 - languageName: node - linkType: hard - -"jake@npm:^10.8.5": - version: 10.8.5 - resolution: "jake@npm:10.8.5" - dependencies: - async: ^3.2.3 - chalk: ^4.0.2 - filelist: ^1.0.1 - minimatch: ^3.0.4 - bin: - jake: ./bin/cli.js - checksum: 56c913ecf5a8d74325d0af9bc17a233bad50977438d44864d925bb6c45c946e0fee8c4c1f5fe2225471ef40df5222e943047982717ebff0d624770564d3c46ba - languageName: node - linkType: hard - -"jquery@npm:3.6.0": - version: 3.6.0 - resolution: "jquery@npm:3.6.0" - checksum: 8fd5fef4aa48fd374ec716dd1c1df1af407814a228e15c1260ca140de3a697c2a77c30c54ff1d238b6a3ab4ddc445ddeef9adce6c6d28e4869d85eb9d3951c0e - languageName: node - linkType: hard - -"json-buffer@npm:3.0.1, json-buffer@npm:~3.0.1": - version: 3.0.1 - resolution: "json-buffer@npm:3.0.1" - checksum: 9026b03edc2847eefa2e37646c579300a1f3a4586cfb62bf857832b60c852042d0d6ae55d1afb8926163fa54c2b01d83ae24705f34990348bdac6273a29d4581 - languageName: node - linkType: hard - -"keyv@npm:^4.0.0": - version: 4.2.2 - resolution: "keyv@npm:4.2.2" - dependencies: - compress-brotli: ^1.3.6 - json-buffer: 3.0.1 - checksum: 1d03674145339cb6d7509fd7791a2ea93c0a9b7ec10e475d621f4443b8bf877c21dc391ae1002dd1bade4f44e2093f850f1da81d08c03812b4592cd5ff028db7 - languageName: node - linkType: hard - -"kuler@npm:^2.0.0": - version: 2.0.0 - resolution: "kuler@npm:2.0.0" - checksum: 9e10b5a1659f9ed8761d38df3c35effabffbd19fc6107324095238e4ef0ff044392cae9ac64a1c2dda26e532426485342226b93806bd97504b174b0dcf04ed81 - languageName: node - linkType: hard - -"layerr@npm:^0.1.2": - version: 0.1.2 - resolution: "layerr@npm:0.1.2" - checksum: db34bae003a8f289c858a7657c260104e40c4fdb6df8d35badbc42dc3ffe7d361c6dbf54f0c91cdaf6f364788b8af432131448dd9a240b82b8b2502b917fa052 - languageName: node - linkType: hard - -"logform@npm:^2.3.2, logform@npm:^2.4.0": - version: 2.4.0 - resolution: "logform@npm:2.4.0" - dependencies: - "@colors/colors": 1.5.0 - fecha: ^4.2.0 - ms: ^2.1.1 - safe-stable-stringify: ^2.3.1 - triple-beam: ^1.3.0 - checksum: e75ccccc1a2664612ade3c7f3d3185787198b4028e54ea2795df87901f28b3881eddd8d7e73ce03f4420dca638a1cbe6d42254179685ab2075e4ac38a71ffb6c - languageName: node - linkType: hard - -"lowercase-keys@npm:^2.0.0": - version: 2.0.0 - resolution: "lowercase-keys@npm:2.0.0" - checksum: 24d7ebd56ccdf15ff529ca9e08863f3c54b0b9d1edb97a3ae1af34940ae666c01a1e6d200707bce730a8ef76cb57cc10e65f245ecaaf7e6bc8639f2fb460ac23 - languageName: node - linkType: hard - -"lowercase-keys@npm:^3.0.0": - version: 3.0.0 - resolution: "lowercase-keys@npm:3.0.0" - checksum: 67a3f81409af969bc0c4ca0e76cd7d16adb1e25aa1c197229587eaf8671275c8c067cd421795dbca4c81be0098e4c426a086a05e30de8a9c587b7a13c0c7ccc5 - languageName: node - linkType: hard - -"luxon@npm:3.0.1": - version: 3.0.1 - resolution: "luxon@npm:3.0.1" - checksum: aa966eb919bf95b1bd819cda784d1f6f66e3fb65bd9ec7bf68b6a978eeb4e3e14f7e2275021b473f93b15b6b7ba2e5a30471e53add3929a7e695fcfd6dd40ec8 - languageName: node - linkType: hard - -"luxon@npm:^1.23.x": - version: 1.28.0 - resolution: "luxon@npm:1.28.0" - checksum: 5250cb9f138b6048eeb0b3a9044a4ac994d0058f680c72a0da4b6aeaec8612460385639cba2b1052ef6d5564879e9ed144d686f26d9d97b38ab920d82e18281c - languageName: node - linkType: hard - -"md5@npm:^2.3.0": - version: 2.3.0 - resolution: "md5@npm:2.3.0" - dependencies: - charenc: 0.0.2 - crypt: 0.0.2 - is-buffer: ~1.1.6 - checksum: a63cacf4018dc9dee08c36e6f924a64ced735b37826116c905717c41cebeb41a522f7a526ba6ad578f9c80f02cb365033ccd67fe186ffbcc1a1faeb75daa9b6e - languageName: node - linkType: hard - -"media-typer@npm:0.3.0": - version: 0.3.0 - resolution: "media-typer@npm:0.3.0" - checksum: af1b38516c28ec95d6b0826f6c8f276c58aec391f76be42aa07646b4e39d317723e869700933ca6995b056db4b09a78c92d5440dc23657e6764be5d28874bba1 - languageName: node - linkType: hard - -"merge-descriptors@npm:1.0.1": - version: 1.0.1 - resolution: "merge-descriptors@npm:1.0.1" - checksum: 5abc259d2ae25bb06d19ce2b94a21632583c74e2a9109ee1ba7fd147aa7362b380d971e0251069f8b3eb7d48c21ac839e21fa177b335e82c76ec172e30c31a26 - languageName: node - linkType: hard - -"methods@npm:~1.1.2": - version: 1.1.2 - resolution: "methods@npm:1.1.2" - checksum: 0917ff4041fa8e2f2fda5425a955fe16ca411591fbd123c0d722fcf02b73971ed6f764d85f0a6f547ce49ee0221ce2c19a5fa692157931cecb422984f1dcd13a - languageName: node - linkType: hard - -"mime-db@npm:1.52.0": - version: 1.52.0 - resolution: "mime-db@npm:1.52.0" - checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f - languageName: node - linkType: hard - -"mime-types@npm:^2.1.12, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": - version: 2.1.35 - resolution: "mime-types@npm:2.1.35" - dependencies: - mime-db: 1.52.0 - checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 - languageName: node - linkType: hard - -"mime@npm:1.6.0": - version: 1.6.0 - resolution: "mime@npm:1.6.0" - bin: - mime: cli.js - checksum: fef25e39263e6d207580bdc629f8872a3f9772c923c7f8c7e793175cee22777bbe8bba95e5d509a40aaa292d8974514ce634ae35769faa45f22d17edda5e8557 - languageName: node - linkType: hard - -"mimic-response@npm:^1.0.0": - version: 1.0.1 - resolution: "mimic-response@npm:1.0.1" - checksum: 034c78753b0e622bc03c983663b1cdf66d03861050e0c8606563d149bc2b02d63f62ce4d32be4ab50d0553ae0ffe647fc34d1f5281184c6e1e8cf4d85e8d9823 - languageName: node - linkType: hard - -"mimic-response@npm:^3.1.0": - version: 3.1.0 - resolution: "mimic-response@npm:3.1.0" - checksum: 25739fee32c17f433626bf19f016df9036b75b3d84a3046c7d156e72ec963dd29d7fc8a302f55a3d6c5a4ff24259676b15d915aad6480815a969ff2ec0836867 - languageName: node - linkType: hard - -"minimatch@npm:^3.0.4": - version: 3.1.2 - resolution: "minimatch@npm:3.1.2" - dependencies: - brace-expansion: ^1.1.7 - checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a - languageName: node - linkType: hard - -"minimatch@npm:^5.0.1": - version: 5.0.1 - resolution: "minimatch@npm:5.0.1" - dependencies: - brace-expansion: ^2.0.1 - checksum: b34b98463da4754bc526b244d680c69d4d6089451ebe512edaf6dd9eeed0279399cfa3edb19233513b8f830bf4bfcad911dddcdf125e75074100d52f724774f0 - languageName: node - linkType: hard - -"morgan@npm:1.10.0": - version: 1.10.0 - resolution: "morgan@npm:1.10.0" - dependencies: - basic-auth: ~2.0.1 - debug: 2.6.9 - depd: ~2.0.0 - on-finished: ~2.3.0 - on-headers: ~1.0.2 - checksum: fb41e226ab5a1abf7e8909e486b387076534716d60207e361acfb5df78b84d703a7b7ea58f3046a9fd0b83d3c94bfabde32323341a1f1b26ce50680abd2ea5dd - languageName: node - linkType: hard - -"ms@npm:2.0.0": - version: 2.0.0 - resolution: "ms@npm:2.0.0" - checksum: 0e6a22b8b746d2e0b65a430519934fefd41b6db0682e3477c10f60c76e947c4c0ad06f63ffdf1d78d335f83edee8c0aa928aa66a36c7cd95b69b26f468d527f4 - languageName: node - linkType: hard - -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f - languageName: node - linkType: hard - -"ms@npm:2.1.3, ms@npm:^2.1.1": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d - languageName: node - linkType: hard - -"negotiator@npm:0.6.3": - version: 0.6.3 - resolution: "negotiator@npm:0.6.3" - checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 - languageName: node - linkType: hard - -"nested-property@npm:^4.0.0": - version: 4.0.0 - resolution: "nested-property@npm:4.0.0" - checksum: 9c86f2c722429e167876d5becf276139a6aa4b8732b6d9e32de9aa44dfd017702b60614cc87aec961dea47ae50dae0951d5b5f66fc30288f18bf581c16e42ca2 - languageName: node - linkType: hard - -"nexcloud-backup@workspace:.": - version: 0.0.0-use.local - resolution: "nexcloud-backup@workspace:." - dependencies: - "@fortawesome/fontawesome-free": 6.1.2 - app-root-path: 3.0.0 - bootstrap: 5.1.3 - cookie-parser: 1.4.6 - cron: 2.1.0 - debug: 4.3.4 - ejs: 3.1.8 - express: 4.18.1 - form-data: 4.0.0 - got: 12.3.0 - http-errors: 2.0.0 - jquery: 3.6.0 - luxon: 3.0.1 - morgan: 1.10.0 - webdav: 4.10.0 - winston: 3.8.1 - languageName: unknown - linkType: soft - -"normalize-url@npm:^6.0.1": - version: 6.1.0 - resolution: "normalize-url@npm:6.1.0" - checksum: 4a4944631173e7d521d6b80e4c85ccaeceb2870f315584fa30121f505a6dfd86439c5e3fdd8cd9e0e291290c41d0c3599f0cb12ab356722ed242584c30348e50 - languageName: node - linkType: hard - -"object-inspect@npm:^1.9.0": - version: 1.12.0 - resolution: "object-inspect@npm:1.12.0" - checksum: 2b36d4001a9c921c6b342e2965734519c9c58c355822243c3207fbf0aac271f8d44d30d2d570d450b2cc6f0f00b72bcdba515c37827d2560e5f22b1899a31cf4 - languageName: node - linkType: hard - -"on-finished@npm:2.4.1": - version: 2.4.1 - resolution: "on-finished@npm:2.4.1" - dependencies: - ee-first: 1.1.1 - checksum: d20929a25e7f0bb62f937a425b5edeb4e4cde0540d77ba146ec9357f00b0d497cdb3b9b05b9c8e46222407d1548d08166bff69cc56dfa55ba0e4469228920ff0 - languageName: node - linkType: hard - -"on-finished@npm:~2.3.0": - version: 2.3.0 - resolution: "on-finished@npm:2.3.0" - dependencies: - ee-first: 1.1.1 - checksum: 1db595bd963b0124d6fa261d18320422407b8f01dc65863840f3ddaaf7bcad5b28ff6847286703ca53f4ec19595bd67a2f1253db79fc4094911ec6aa8df1671b - languageName: node - linkType: hard - -"on-headers@npm:~1.0.2": - version: 1.0.2 - resolution: "on-headers@npm:1.0.2" - checksum: 2bf13467215d1e540a62a75021e8b318a6cfc5d4fc53af8e8f84ad98dbcea02d506c6d24180cd62e1d769c44721ba542f3154effc1f7579a8288c9f7873ed8e5 - languageName: node - linkType: hard - -"once@npm:^1.3.1, once@npm:^1.4.0": - version: 1.4.0 - resolution: "once@npm:1.4.0" - dependencies: - wrappy: 1 - checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 - languageName: node - linkType: hard - -"one-time@npm:^1.0.0": - version: 1.0.0 - resolution: "one-time@npm:1.0.0" - dependencies: - fn.name: 1.x.x - checksum: fd008d7e992bdec1c67f53a2f9b46381ee12a9b8c309f88b21f0223546003fb47e8ad7c1fd5843751920a8d276c63bd4b45670ef80c61fb3e07dbccc962b5c7d - languageName: node - linkType: hard - -"p-cancelable@npm:^3.0.0": - version: 3.0.0 - resolution: "p-cancelable@npm:3.0.0" - checksum: 2b5ae34218f9c2cf7a7c18e5d9a726ef9b165ef07e6c959f6738371509e747334b5f78f3bcdeb03d8a12dcb978faf641fd87eb21486ed7d36fb823b8ddef3219 - languageName: node - linkType: hard - -"parseurl@npm:~1.3.3": - version: 1.3.3 - resolution: "parseurl@npm:1.3.3" - checksum: 407cee8e0a3a4c5cd472559bca8b6a45b82c124e9a4703302326e9ab60fc1081442ada4e02628efef1eb16197ddc7f8822f5a91fd7d7c86b51f530aedb17dfa2 - languageName: node - linkType: hard - -"path-posix@npm:^1.0.0": - version: 1.0.0 - resolution: "path-posix@npm:1.0.0" - checksum: 4f64ad212de6ad8d0dbfa440cac8b924303c25c30301769ad0501e29e83a5b9d469e8133753f999ad37482c9c8d3511129e4d83db55d2e4b1555b183c9749ae8 - languageName: node - linkType: hard - -"path-to-regexp@npm:0.1.7": - version: 0.1.7 - resolution: "path-to-regexp@npm:0.1.7" - checksum: 69a14ea24db543e8b0f4353305c5eac6907917031340e5a8b37df688e52accd09e3cebfe1660b70d76b6bd89152f52183f28c74813dbf454ba1a01c82a38abce - languageName: node - linkType: hard - -"proxy-addr@npm:~2.0.7": - version: 2.0.7 - resolution: "proxy-addr@npm:2.0.7" - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - checksum: 29c6990ce9364648255454842f06f8c46fcd124d3e6d7c5066df44662de63cdc0bad032e9bf5a3d653ff72141cc7b6019873d685708ac8210c30458ad99f2b74 - languageName: node - linkType: hard - -"pump@npm:^3.0.0": - version: 3.0.0 - resolution: "pump@npm:3.0.0" - dependencies: - end-of-stream: ^1.1.0 - once: ^1.3.1 - checksum: e42e9229fba14732593a718b04cb5e1cfef8254544870997e0ecd9732b189a48e1256e4e5478148ecb47c8511dca2b09eae56b4d0aad8009e6fac8072923cfc9 - languageName: node - linkType: hard - -"qs@npm:6.10.3": - version: 6.10.3 - resolution: "qs@npm:6.10.3" - dependencies: - side-channel: ^1.0.4 - checksum: 0fac5e6c7191d0295a96d0e83c851aeb015df7e990e4d3b093897d3ac6c94e555dbd0a599739c84d7fa46d7fee282d94ba76943983935cf33bba6769539b8019 - languageName: node - linkType: hard - -"querystringify@npm:^2.1.1": - version: 2.2.0 - resolution: "querystringify@npm:2.2.0" - checksum: 5641ea231bad7ef6d64d9998faca95611ed4b11c2591a8cae741e178a974f6a8e0ebde008475259abe1621cb15e692404e6b6626e927f7b849d5c09392604b15 - languageName: node - linkType: hard - -"quick-lru@npm:^5.1.1": - version: 5.1.1 - resolution: "quick-lru@npm:5.1.1" - checksum: a516faa25574be7947969883e6068dbe4aa19e8ef8e8e0fd96cddd6d36485e9106d85c0041a27153286b0770b381328f4072aa40d3b18a19f5f7d2b78b94b5ed - languageName: node - linkType: hard - -"range-parser@npm:~1.2.1": - version: 1.2.1 - resolution: "range-parser@npm:1.2.1" - checksum: 0a268d4fea508661cf5743dfe3d5f47ce214fd6b7dec1de0da4d669dd4ef3d2144468ebe4179049eff253d9d27e719c88dae55be64f954e80135a0cada804ec9 - languageName: node - linkType: hard - -"raw-body@npm:2.5.1": - version: 2.5.1 - resolution: "raw-body@npm:2.5.1" - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - checksum: 5362adff1575d691bb3f75998803a0ffed8c64eabeaa06e54b4ada25a0cd1b2ae7f4f5ec46565d1bec337e08b5ac90c76eaa0758de6f72a633f025d754dec29e - languageName: node - linkType: hard - -"readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": - version: 3.6.0 - resolution: "readable-stream@npm:3.6.0" - dependencies: - inherits: ^2.0.3 - string_decoder: ^1.1.1 - util-deprecate: ^1.0.1 - checksum: d4ea81502d3799439bb955a3a5d1d808592cf3133350ed352aeaa499647858b27b1c4013984900238b0873ec8d0d8defce72469fb7a83e61d53f5ad61cb80dc8 - languageName: node - linkType: hard - -"requires-port@npm:^1.0.0": - version: 1.0.0 - resolution: "requires-port@npm:1.0.0" - checksum: eee0e303adffb69be55d1a214e415cf42b7441ae858c76dfc5353148644f6fd6e698926fc4643f510d5c126d12a705e7c8ed7e38061113bdf37547ab356797ff - languageName: node - linkType: hard - -"resolve-alpn@npm:^1.2.0": - version: 1.2.1 - resolution: "resolve-alpn@npm:1.2.1" - checksum: f558071fcb2c60b04054c99aebd572a2af97ef64128d59bef7ab73bd50d896a222a056de40ffc545b633d99b304c259ea9d0c06830d5c867c34f0bfa60b8eae0 - languageName: node - linkType: hard - -"responselike@npm:^2.0.0": - version: 2.0.0 - resolution: "responselike@npm:2.0.0" - dependencies: - lowercase-keys: ^2.0.0 - checksum: 6a4d32c37d4e88678ae0a9d69fcc90aafa15b1a3eab455bd65c06af3c6c4976afc47d07a0e5a60d277ab041a465f43bf0a581e0d7ab33786e7a7741573f2e487 - languageName: node - linkType: hard - -"safe-buffer@npm:5.1.2": - version: 5.1.2 - resolution: "safe-buffer@npm:5.1.2" - checksum: f2f1f7943ca44a594893a852894055cf619c1fbcb611237fc39e461ae751187e7baf4dc391a72125e0ac4fb2d8c5c0b3c71529622e6a58f46b960211e704903c - languageName: node - linkType: hard - -"safe-buffer@npm:5.2.1, safe-buffer@npm:~5.2.0": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 - languageName: node - linkType: hard - -"safe-stable-stringify@npm:^2.3.1": - version: 2.3.1 - resolution: "safe-stable-stringify@npm:2.3.1" - checksum: a0a0bad0294c3e2a9d1bf3cf2b1096dfb83c162d09a5e4891e488cce082120bd69161d2a92aae7fc48255290f17700decae9c89a07fe139794e61b5c8b411377 - languageName: node - linkType: hard - -"safer-buffer@npm:>= 2.1.2 < 3": - version: 2.1.2 - resolution: "safer-buffer@npm:2.1.2" - checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 - languageName: node - linkType: hard - -"send@npm:0.18.0": - version: 0.18.0 - resolution: "send@npm:0.18.0" - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: ~1.0.2 - escape-html: ~1.0.3 - etag: ~1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: ~1.2.1 - statuses: 2.0.1 - checksum: 74fc07ebb58566b87b078ec63e5a3e41ecd987e4272ba67b7467e86c6ad51bc6b0b0154133b6d8b08a2ddda360464f71382f7ef864700f34844a76c8027817a8 - languageName: node - linkType: hard - -"serve-static@npm:1.15.0": - version: 1.15.0 - resolution: "serve-static@npm:1.15.0" - dependencies: - encodeurl: ~1.0.2 - escape-html: ~1.0.3 - parseurl: ~1.3.3 - send: 0.18.0 - checksum: af57fc13be40d90a12562e98c0b7855cf6e8bd4c107fe9a45c212bf023058d54a1871b1c89511c3958f70626fff47faeb795f5d83f8cf88514dbaeb2b724464d - languageName: node - linkType: hard - -"setprototypeof@npm:1.2.0": - version: 1.2.0 - resolution: "setprototypeof@npm:1.2.0" - checksum: be18cbbf70e7d8097c97f713a2e76edf84e87299b40d085c6bf8b65314e994cc15e2e317727342fa6996e38e1f52c59720b53fe621e2eb593a6847bf0356db89 - languageName: node - linkType: hard - -"side-channel@npm:^1.0.4": - version: 1.0.4 - resolution: "side-channel@npm:1.0.4" - dependencies: - call-bind: ^1.0.0 - get-intrinsic: ^1.0.2 - object-inspect: ^1.9.0 - checksum: 351e41b947079c10bd0858364f32bb3a7379514c399edb64ab3dce683933483fc63fb5e4efe0a15a2e8a7e3c436b6a91736ddb8d8c6591b0460a24bb4a1ee245 - languageName: node - linkType: hard - -"simple-swizzle@npm:^0.2.2": - version: 0.2.2 - resolution: "simple-swizzle@npm:0.2.2" - dependencies: - is-arrayish: ^0.3.1 - checksum: a7f3f2ab5c76c4472d5c578df892e857323e452d9f392e1b5cf74b74db66e6294a1e1b8b390b519fa1b96b5b613f2a37db6cffef52c3f1f8f3c5ea64eb2d54c0 - languageName: node - linkType: hard - -"stack-trace@npm:0.0.x": - version: 0.0.10 - resolution: "stack-trace@npm:0.0.10" - checksum: 473036ad32f8c00e889613153d6454f9be0536d430eb2358ca51cad6b95cea08a3cc33cc0e34de66b0dad221582b08ed2e61ef8e13f4087ab690f388362d6610 - languageName: node - linkType: hard - -"statuses@npm:2.0.1": - version: 2.0.1 - resolution: "statuses@npm:2.0.1" - checksum: 18c7623fdb8f646fb213ca4051be4df7efb3484d4ab662937ca6fbef7ced9b9e12842709872eb3020cc3504b93bde88935c9f6417489627a7786f24f8031cbcb - languageName: node - linkType: hard - -"string_decoder@npm:^1.1.1": - version: 1.3.0 - resolution: "string_decoder@npm:1.3.0" - dependencies: - safe-buffer: ~5.2.0 - checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 - languageName: node - linkType: hard - -"strnum@npm:^1.0.4": - version: 1.0.5 - resolution: "strnum@npm:1.0.5" - checksum: 651b2031db5da1bf4a77fdd2f116a8ac8055157c5420f5569f64879133825915ad461513e7202a16d7fec63c54fd822410d0962f8ca12385c4334891b9ae6dd2 - languageName: node - linkType: hard - -"supports-color@npm:^7.1.0": - version: 7.2.0 - resolution: "supports-color@npm:7.2.0" - dependencies: - has-flag: ^4.0.0 - checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a - languageName: node - linkType: hard - -"text-hex@npm:1.0.x": - version: 1.0.0 - resolution: "text-hex@npm:1.0.0" - checksum: 1138f68adc97bf4381a302a24e2352f04992b7b1316c5003767e9b0d3367ffd0dc73d65001ea02b07cd0ecc2a9d186de0cf02f3c2d880b8a522d4ccb9342244a - languageName: node - linkType: hard - -"toidentifier@npm:1.0.1": - version: 1.0.1 - resolution: "toidentifier@npm:1.0.1" - checksum: 952c29e2a85d7123239b5cfdd889a0dde47ab0497f0913d70588f19c53f7e0b5327c95f4651e413c74b785147f9637b17410ac8c846d5d4a20a5a33eb6dc3a45 - languageName: node - linkType: hard - -"triple-beam@npm:^1.3.0": - version: 1.3.0 - resolution: "triple-beam@npm:1.3.0" - checksum: 7d7b77d8625fb252c126c24984a68de462b538a8fcd1de2abd0a26421629cf3527d48e23b3c2264f08f4a6c3bc40a478a722176f4d7b6a1acc154cb70c359f2b - languageName: node - linkType: hard - -"type-is@npm:~1.6.18": - version: 1.6.18 - resolution: "type-is@npm:1.6.18" - dependencies: - media-typer: 0.3.0 - mime-types: ~2.1.24 - checksum: 2c8e47675d55f8b4e404bcf529abdf5036c537a04c2b20177bcf78c9e3c1da69da3942b1346e6edb09e823228c0ee656ef0e033765ec39a70d496ef601a0c657 - languageName: node - linkType: hard - -"unpipe@npm:1.0.0, unpipe@npm:~1.0.0": - version: 1.0.0 - resolution: "unpipe@npm:1.0.0" - checksum: 4fa18d8d8d977c55cb09715385c203197105e10a6d220087ec819f50cb68870f02942244f1017565484237f1f8c5d3cd413631b1ae104d3096f24fdfde1b4aa2 - languageName: node - linkType: hard - -"url-join@npm:^4.0.1": - version: 4.0.1 - resolution: "url-join@npm:4.0.1" - checksum: f74e868bf25dbc8be6a8d7237d4c36bb5b6c62c72e594d5ab1347fe91d6af7ccd9eb5d621e30152e4da45c2e9a26bec21390e911ab54a62d4d82e76028374ee5 - languageName: node - linkType: hard - -"url-parse@npm:^1.5.10": - version: 1.5.10 - resolution: "url-parse@npm:1.5.10" - dependencies: - querystringify: ^2.1.1 - requires-port: ^1.0.0 - checksum: fbdba6b1d83336aca2216bbdc38ba658d9cfb8fc7f665eb8b17852de638ff7d1a162c198a8e4ed66001ddbf6c9888d41e4798912c62b4fd777a31657989f7bdf - languageName: node - linkType: hard - -"util-deprecate@npm:^1.0.1": - version: 1.0.2 - resolution: "util-deprecate@npm:1.0.2" - checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 - languageName: node - linkType: hard - -"utils-merge@npm:1.0.1": - version: 1.0.1 - resolution: "utils-merge@npm:1.0.1" - checksum: c81095493225ecfc28add49c106ca4f09cdf56bc66731aa8dabc2edbbccb1e1bfe2de6a115e5c6a380d3ea166d1636410b62ef216bb07b3feb1cfde1d95d5080 - languageName: node - linkType: hard - -"vary@npm:~1.1.2": - version: 1.1.2 - resolution: "vary@npm:1.1.2" - checksum: ae0123222c6df65b437669d63dfa8c36cee20a504101b2fcd97b8bf76f91259c17f9f2b4d70a1e3c6bbcee7f51b28392833adb6b2770b23b01abec84e369660b - languageName: node - linkType: hard - -"webdav@npm:4.10.0": - version: 4.10.0 - resolution: "webdav@npm:4.10.0" - dependencies: - axios: ^0.27.2 - base-64: ^1.0.0 - byte-length: ^1.0.2 - fast-xml-parser: ^3.19.0 - he: ^1.2.0 - hot-patcher: ^0.5.0 - layerr: ^0.1.2 - md5: ^2.3.0 - minimatch: ^5.0.1 - nested-property: ^4.0.0 - path-posix: ^1.0.0 - url-join: ^4.0.1 - url-parse: ^1.5.10 - checksum: 0cfea9c233cfb8c490b6f6be01cb789f20fd01dbfe0ebc8f89057000390117a7cdbd55501c5fc248f54f2393d529cc60a058bf982d96e7e2507a7c99528444ab - languageName: node - linkType: hard - -"winston-transport@npm:^4.5.0": - version: 4.5.0 - resolution: "winston-transport@npm:4.5.0" - dependencies: - logform: ^2.3.2 - readable-stream: ^3.6.0 - triple-beam: ^1.3.0 - checksum: a56e5678a80b88a73e77ed998fc6e19d0db19c989a356b137ec236782f2bf58ae4511b11c29163f99391fa4dc12102c7bc5738dcb6543f28877fa2819adc3ee9 - languageName: node - linkType: hard - -"winston@npm:3.8.1": - version: 3.8.1 - resolution: "winston@npm:3.8.1" - dependencies: - "@dabh/diagnostics": ^2.0.2 - async: ^3.2.3 - is-stream: ^2.0.0 - logform: ^2.4.0 - one-time: ^1.0.0 - readable-stream: ^3.4.0 - safe-stable-stringify: ^2.3.1 - stack-trace: 0.0.x - triple-beam: ^1.3.0 - winston-transport: ^4.5.0 - checksum: 14637222a4239f1ee7e629dbbf0c65161abe95eeb7acd275caf210c5d47d93254fdb007291ea75b5e241d4bb6dd3c29d000bd04ae5420a347711ae7cd0b2da88 - languageName: node - linkType: hard - -"wrappy@npm:1": - version: 1.0.2 - resolution: "wrappy@npm:1.0.2" - checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 - languageName: node - linkType: hard